static void test_filter(void) { Rlist *list = NULL; for (int i = 0; i < 10; i++) { char *item = StringFromLong(i); RlistAppend(&list, item, RVAL_TYPE_SCALAR); } assert_int_equal(10, RlistLen(list)); int mod_by = 0; RlistFilter(&list, is_even, &mod_by, free); assert_int_equal(5, RlistLen(list)); int i = 0; for (Rlist *rp = list; rp; rp = rp->next) { int k = StringToLong(rp->val.item); assert_int_equal(i, k); i += 2; } RlistDestroy(list); }
static void RlistAppendContainerPrimitive(Rlist **list, const JsonElement *primitive) { assert(JsonGetElementType(primitive) == JSON_ELEMENT_TYPE_PRIMITIVE); switch (JsonGetPrimitiveType(primitive)) { case JSON_PRIMITIVE_TYPE_BOOL: RlistAppendScalar(list, JsonPrimitiveGetAsBool(primitive) ? "true" : "false"); break; case JSON_PRIMITIVE_TYPE_INTEGER: { char *str = StringFromLong(JsonPrimitiveGetAsInteger(primitive)); RlistAppendScalar(list, str); free(str); } break; case JSON_PRIMITIVE_TYPE_REAL: { char *str = StringFromDouble(JsonPrimitiveGetAsReal(primitive)); RlistAppendScalar(list, str); free(str); } break; case JSON_PRIMITIVE_TYPE_STRING: RlistAppendScalar(list, JsonPrimitiveGetAsString(primitive)); break; case JSON_PRIMITIVE_TYPE_NULL: break; } }
static bool RenderVariablePrimitive(Buffer *out, const JsonElement *primitive, const bool escaped, const bool key_mode) { if (key_mode && JsonElementGetPropertyName(primitive)) { if (escaped) { RenderHTMLContent(out, JsonElementGetPropertyName(primitive), strlen(JsonElementGetPropertyName(primitive))); } else { BufferAppendString(out, JsonElementGetPropertyName(primitive)); } return true; } switch (JsonGetPrimitiveType(primitive)) { case JSON_PRIMITIVE_TYPE_STRING: if (escaped) { RenderHTMLContent(out, JsonPrimitiveGetAsString(primitive), strlen(JsonPrimitiveGetAsString(primitive))); } else { BufferAppendString(out, JsonPrimitiveGetAsString(primitive)); } return true; case JSON_PRIMITIVE_TYPE_INTEGER: { char *str = StringFromLong(JsonPrimitiveGetAsInteger(primitive)); BufferAppendString(out, str); free(str); } return true; case JSON_PRIMITIVE_TYPE_REAL: { char *str = StringFromDouble(JsonPrimitiveGetAsReal(primitive)); BufferAppendString(out, str); free(str); } return true; case JSON_PRIMITIVE_TYPE_BOOL: BufferAppendString(out, JsonPrimitiveGetAsBool(primitive) ? "true" : "false"); return true; case JSON_PRIMITIVE_TYPE_NULL: return true; default: assert(!"Unrecognised JSON primitive type"); } return false; }
static void test_filter_everything(void) { Rlist *list = NULL; for (int i = 1; i < 10; i += 2) { char *item = StringFromLong(i); RlistAppend(&list, item, RVAL_TYPE_SCALAR); } assert_int_equal(5, RlistLen(list)); int mod_by = 0; RlistFilter(&list, is_even, &mod_by, free); assert_int_equal(0, RlistLen(list)); assert_true(list == NULL); }
/* Sets variables */ static int RegExMatchSubString(EvalContext *ctx, pcre *rx, const char *teststring, int *start, int *end) { int ovector[OVECCOUNT]; int rc = 0; if ((rc = pcre_exec(rx, NULL, teststring, strlen(teststring), 0, 0, ovector, OVECCOUNT)) >= 0) { *start = ovector[0]; *end = ovector[1]; EvalContextVariableClearMatch(ctx); for (int i = 0; i < rc; i++) /* make backref vars $(1),$(2) etc */ { const char *backref_start = teststring + ovector[i * 2]; int backref_len = ovector[i * 2 + 1] - ovector[i * 2]; if (backref_len < CF_MAXVARSIZE) { char substring[CF_MAXVARSIZE]; char *index = StringFromLong(i); strlcpy(substring, backref_start, MIN(CF_MAXVARSIZE, backref_len + 1)); EvalContextVariablePutSpecial(ctx, SPECIAL_SCOPE_MATCH, index, substring, CF_DATA_TYPE_STRING, "source=regex"); free(index); } } } else { *start = 0; *end = 0; } pcre_free(rx); return rc >= 0; }
static void test_string_from_long(void) { assert_string_equal("123456789", StringFromLong(123456789)); assert_string_equal("-123456789", StringFromLong(-123456789)); }