diff -Nbru clearsilver-0.6/cgi/cgi.c clearsilver-0.6.1/cgi/cgi.c --- clearsilver-0.6/cgi/cgi.c Thu Apr 11 18:11:39 2002 +++ clearsilver-0.6.1/cgi/cgi.c Tue Apr 30 20:05:15 2002 @@ -27,6 +27,12 @@ #include "cgi.h" #include "cs/cs.h" +/* HACK for now, until we actually support autoconf/configure */ +#if __GNU_LIBRARY__ < 6 +char * strtok_r (char *s,const char * delim, char **save_ptr); +#endif + + struct _cgi_vars { char *env_name; @@ -1183,4 +1189,52 @@ return STATUS_OK; } + +#if __GNU_LIBRARY__ < 6 +#include + +/* from glibc */ +/* Parse S into tokens separated by characters in DELIM. + If S is NULL, the saved pointer in SAVE_PTR is used as + the next starting point. For example: + char s[] = "-abc-=-def"; + char *sp; + x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" + x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL + x = strtok_r(NULL, "=", &sp); // x = NULL + // s = "abc\0-def\0" +*/ + +char * strtok_r (char *s,const char * delim, char **save_ptr) +{ + char *token; + + if (s == NULL) + s = *save_ptr; + + /* Scan leading delimiters. */ + s += strspn (s, delim); + if (*s == '\0') + { + *save_ptr = s; + return NULL; + } + + /* Find the end of the token. */ + token = s; + s = strpbrk (token, delim); + if (s == NULL) + /* This token finishes the string. */ + /**save_ptr = __rawmemchr (token, '\0');*/ + *save_ptr = strchr (token, '\0'); + else + { + /* Terminate the token and make + * *SAVE_PTR point past it. */ + *s = '\0'; + *save_ptr = s + 1; + } + return token; +} +#endif diff -Nbru clearsilver-0.6/cgi/html.c clearsilver-0.6.1/cgi/html.c --- clearsilver-0.6/cgi/html.c Wed Mar 27 10:20:34 2002 +++ clearsilver-0.6.1/cgi/html.c Tue Apr 30 20:05:15 2002 @@ -10,6 +10,7 @@ #include #include +#include #include #include #include "util/neo_err.h" diff -Nbru clearsilver-0.6/cs/Makefile clearsilver-0.6.1/cs/Makefile --- clearsilver-0.6/cs/Makefile Fri Apr 19 19:02:08 2002 +++ clearsilver-0.6.1/cs/Makefile Tue Apr 30 19:57:02 2002 @@ -23,7 +23,7 @@ TARGETS = $(CS_LIB) $(CSTEST_EXE) test -CS_TESTS = test.cs test2.cs test3.cs test4.cs test5.cs test6.cs test7.cs test8.cs test9.cs test10.cs test11.cs test12.cs +CS_TESTS = test.cs test2.cs test3.cs test4.cs test5.cs test6.cs test7.cs test8.cs test9.cs test10.cs test11.cs test12.cs test13.cs all: $(TARGETS) diff -Nbru clearsilver-0.6/cs/csparse.c clearsilver-0.6.1/cs/csparse.c --- clearsilver-0.6/cs/csparse.c Thu Apr 25 18:48:13 2002 +++ clearsilver-0.6.1/cs/csparse.c Tue Apr 30 19:57:02 2002 @@ -61,6 +61,8 @@ static NEOERR *var_parse (CSPARSE *parse, int cmd, char *arg); static NEOERR *var_eval (CSPARSE *parse, CSTREE *node, CSTREE **next); static NEOERR *evar_parse (CSPARSE *parse, int cmd, char *arg); +static NEOERR *lvar_parse (CSPARSE *parse, int cmd, char *arg); +static NEOERR *lvar_eval (CSPARSE *parse, CSTREE *node, CSTREE **next); static NEOERR *if_parse (CSPARSE *parse, int cmd, char *arg); static NEOERR *if_eval (CSPARSE *parse, CSTREE *node, CSTREE **next); static NEOERR *else_parse (CSPARSE *parse, int cmd, char *arg); @@ -103,6 +105,8 @@ var_parse, var_eval, 1}, {"evar", sizeof("evar")-1, ST_ANYWHERE, ST_SAME, evar_parse, skip_eval, 1}, + {"lvar", sizeof("lvar")-1, ST_ANYWHERE, ST_SAME, + lvar_parse, lvar_eval, 1}, {"if", sizeof("if")-1, ST_ANYWHERE, ST_IF, if_parse, if_eval, 1}, {"else", sizeof("else")-1, ST_IF, ST_POP | ST_ELSE, @@ -1124,6 +1128,33 @@ return STATUS_OK; } +static NEOERR *lvar_parse (CSPARSE *parse, int cmd, char *arg) +{ + NEOERR *err; + CSTREE *node; + + /* ne_warn ("lvar: %s", arg); */ + err = alloc_node (&node); + if (err) return nerr_pass(err); + node->cmd = cmd; + if (arg[0] == '!') + node->flags |= CSF_REQUIRED; + arg++; + /* Validate arg is a var (regex /^[#" ]$/) */ + err = parse_expr (parse, arg, &(node->arg1)); + if (err) + { + dealloc_node(&node); + return nerr_pass(err); + } + + *(parse->next) = node; + parse->next = &(node->next); + parse->current = node; + + return STATUS_OK; +} + static NEOERR *alt_parse (CSPARSE *parse, int cmd, char *arg) { NEOERR *err; @@ -1550,6 +1581,46 @@ if (s) { err = parse->output_cb (parse->output_ctx, s); + } + } + if (val.alloc) free(val.s); + + *next = node->next; + return nerr_pass(err); +} + +static NEOERR *lvar_eval (CSPARSE *parse, CSTREE *node, CSTREE **next) +{ + NEOERR *err = STATUS_OK; + CSARG val; + + err = eval_expr(parse, &(node->arg1), &val); + if (err) return nerr_pass(err); + if (val.op_type & (CS_TYPE_NUM | CS_TYPE_VAR_NUM)) + { + char buf[256]; + long int n_val; + + n_val = arg_eval_num (parse, &val); + snprintf (buf, sizeof(buf), "%ld", n_val); + err = parse->output_cb (parse->output_ctx, buf); + } + else + { + char *s = arg_eval (parse, &val); + + if (s) + { + CSPARSE *cs = NULL; + do { + err = cs_init(&cs, parse->hdf); + if (err) break; + err = cs_parse_string(cs, s, strlen(s)); + if (err) break; + err = cs_render(cs, parse->output_ctx, parse->output_cb); + if (err) break; + } while (0); + cs_destroy(&cs); } } if (val.alloc) free(val.s); diff -Nbru clearsilver-0.6/cs/test.hdf clearsilver-0.6.1/cs/test.hdf --- clearsilver-0.6/cs/test.hdf Fri Apr 19 19:02:08 2002 +++ clearsilver-0.6.1/cs/test.hdf Tue Apr 30 19:57:02 2002 @@ -117,3 +117,13 @@ Files.2.Sub.2.Type = file Files.2.Sub.2.Name = postponed Files.2.Sub.2.Type = file + + +EvarTests { + 0 = ERROR + 1 = test1 + 2 = test 2 +} + +CS_START = diff -Nbru clearsilver-0.6/cs/test13.cs clearsilver-0.6.1/cs/test13.cs --- clearsilver-0.6/cs/test13.cs Wed Dec 31 16:00:00 1969 +++ clearsilver-0.6.1/cs/test13.cs Tue Apr 30 19:57:02 2002 @@ -0,0 +1,6 @@ + + + + + + diff -Nbru clearsilver-0.6/cs/test13.cs.gold clearsilver-0.6.1/cs/test13.cs.gold --- clearsilver-0.6/cs/test13.cs.gold Wed Dec 31 16:00:00 1969 +++ clearsilver-0.6.1/cs/test13.cs.gold Tue Apr 30 19:57:02 2002 @@ -0,0 +1,11 @@ +Parsing test13.cs + + + Worn Out + + test1 + + test 2 wow + + +Worn Out diff -Nbru clearsilver-0.6/cs/test7.cs.gold clearsilver-0.6.1/cs/test7.cs.gold --- clearsilver-0.6/cs/test7.cs.gold Fri Apr 19 22:54:42 2002 +++ clearsilver-0.6.1/cs/test7.cs.gold Tue Apr 30 19:57:02 2002 @@ -12,7 +12,7 @@ 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 173, 171, 169, 167, 165, 163, 161, 159, 157, 155, 153, 151, 149, 147, 145, 143, 141, 139, 137, 135, 133, 131, 129, 127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107, 105, 103, 101, 99, 97, 95, 93, 91, 89, 87, 85, 83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, broken -205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 173, 171, 169, 167, 165, 163, 161, 159, 157, 155, 153, 151, 149, 147, 145, 143, 141, 139, 137, 135, 133, 131, 129, 127, 125, 123, 121, 119, 117, 115, 113, 111, 109, 107, 105, 103, 101, 99, 97, 95, 93, 91, 89, 87, 85, 83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1, + diff -Nbru clearsilver-0.6/rules.mk clearsilver-0.6.1/rules.mk --- clearsilver-0.6/rules.mk Sat Apr 13 11:59:01 2002 +++ clearsilver-0.6.1/rules.mk Tue Apr 30 20:05:14 2002 @@ -12,8 +12,12 @@ ## which ships with various versions of Linux as part of glibc. If you ## are going to use that code, you should compile against SleepyCat ## 2.7.7 instead +USE_DB2 = 1 + +ifeq ($(USE_DB2),1) DB2_INC = -I$(HOME)/src/db-2.7.7/dist DB2_LIB = -L$(HOME)/src/db-2.7.7/dist -ldb +endif PYTHON_INC = -I/neo/opt/include/python2.1 -I/neo/opt/include/python2.2 ## Programs diff -Nbru clearsilver-0.6/util/Makefile clearsilver-0.6.1/util/Makefile --- clearsilver-0.6/util/Makefile Thu Feb 28 16:53:41 2002 +++ clearsilver-0.6.1/util/Makefile Tue Apr 30 20:05:17 2002 @@ -8,8 +8,11 @@ UTL_LIB = $(LIB_DIR)libneo_utl.a UTL_SRC = neo_err.c neo_files.c neo_misc.c neo_test.c ulist.c neo_hdf.c \ - neo_str.c ulocks.c skiplist.c dict.c wdb.c neo_date.c rcfs.c \ + neo_str.c ulocks.c skiplist.c dict.c neo_date.c rcfs.c \ wildmat.c +ifeq ($(USE_DB2),1) +UTL_SRC += wdb.c +endif UTL_OBJ = $(UTL_SRC:%.c=%.o) TARGETS = $(UTL_LIB)