1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/* -*- c -*- */
/*
* builtins/hashops.c
*
* chpp
*
* Copyright (C) 1997-1998 Mark Probst
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <assert.h>
#include "../error.h"
#include "../environment.h"
#include "../output.h"
#include "builtins.h"
void
builtInHashcount (int numArgs, macroArgument *args, environment *env, outputWriter *ow)
{
char lengthString[64];
if (!(numArgs == 1))
{
issueError(ERRMAC_WRONG_NUM_ARGS, "hcount");
return;
}
if (args[0].value.value->type != VALUE_HASH)
issueError(ERRMAC_VALUE_WRONG_TYPE,
cStringForValueType(args[0].value.value->type),
cStringForValueType(VALUE_HASH));
else
OUT_STRING(ow, lengthString,
sprintf(lengthString, "%d", valueHashCount(args[0].value.value)));
}
void
builtInHcontains (int numArgs, macroArgument *args, environment *env, outputWriter *ow)
{
if (!(numArgs == 2))
{
issueError(ERRMAC_WRONG_NUM_ARGS, "hcontains");
return;
}
if (args[0].value.value->type != VALUE_HASH)
issueError(ERRMAC_VALUE_WRONG_TYPE,
cStringForValueType(args[0].value.value->type),
cStringForValueType(VALUE_HASH));
else
{
transformArgumentToScalar(&args[1]);
if (valueHashLookup(args[0].value.value, &args[1].value.value->v.scalar.scalar) != 0)
{
OUT_CHAR(ow, '1');
}
else
{
OUT_CHAR(ow, '0');
}
}
}
void
builtInKeys (int numArgs, macroArgument *args, environment *env, outputWriter *ow)
{
if (!(numArgs == 1))
{
issueError(ERRMAC_WRONG_NUM_ARGS, "hkeys");
return;
}
if (args[0].value.value->type != VALUE_HASH)
issueError(ERRMAC_VALUE_WRONG_TYPE,
cStringForValueType(args[0].value.value->type),
cStringForValueType(VALUE_HASH));
else
{
value *result = valueNewList();
hstate state;
value *aValue;
char *aKey;
int i = 0;
state = hash_state(args[0].value.value->v.hash.hash);
while ((aValue = (value*)hash_next(&state, &aKey)) != 0)
valueListSetElement(result, i++, valueNewScalarFromCString(aKey));
OUT_VALUE(ow, result);
}
}
void
registerHashOps (void)
{
registerBuiltIn("hcount", builtInHashcount, 1, 0, 0);
registerBuiltIn("hcontains", builtInHcontains, 1, 0, 0);
registerBuiltIn("hkeys", builtInKeys, 1, 0, 0);
}
|