00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "cgi.h"
00018
00019 int RunScriptFunction(ScriptEnvironment* Env,
00020 FILE* script,
00021 int end,
00022 char* name,
00023 CGINameValue* Variables,
00024 char** outstr);
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00043 int SkipWhitespace(FILE* source, int end)
00044 {
00045 char temp;
00046 while (end != -1 && (end == ' ' || end == '\t' || end == 0))
00047 {
00048 if (!fread(&temp,1,1,source)) return -1;
00049 end = temp;
00050 }
00051 return end;
00052 }
00053
00054 int SpecialWord(FILE* source, char* buf, int size,int end)
00055 {
00056 if (!fread(buf,1,1,source)) return -1;
00057 if (end == '<' && buf[0] == '/')
00058 {
00059 buf[0]='<';
00060 buf[1]='/';
00061 end = ReadUntilChar(source,buf+2,size-2,">",0);
00062 if (end == '>') strcat(buf,">");
00063 return ' ';
00064 }
00065 if (end == '/' && (buf[0] == '/' || buf[0] == '*'))
00066 {
00067 buf[1]=buf[0];
00068 buf[0]=(char) end;
00069 buf[2]=0;
00070 return ' ';
00071 }
00072 if (buf[0] == '=')
00073 {
00074 buf[0] = (char) end;
00075 buf[1] = '=';
00076
00077 buf[2] = 0;
00078 if (end != '=')
00079 return ' ';
00080
00081 if (!fread(buf+2,1,1,source)) return -1;
00082
00083 if (buf[2] == '=')
00084 {
00085 buf[3]=0;
00086 return ' ';
00087 }
00088 else
00089 {
00090 end = buf[2];
00091 buf[2] = 0;
00092 return end;
00093 }
00094 }
00095 else if (buf[0] == '+' && end == '+')
00096 {
00097 buf[1] = buf[0];
00098 buf[2] = 0;
00099 return ' ';
00100 }
00101 else
00102 {
00103 buf[1] = buf[0];
00104 buf[0] = (char)end;
00105 end = buf[1];
00106 buf[1] = 0;
00107 return SkipWhitespace(source,end);
00108 }
00109 }
00110
00116 int ReadNextToken(FILE* source,char*buf, int size,int end,int * isSyntax)
00117 {
00118
00119 buf[0]=0;
00120 if (end == -1) return -1;
00121 buf[0] = (char)SkipWhitespace(source,end);
00122
00123 while (1)
00124 {
00125 if (strchr("\r\n#*-/^,;{}()[]<>+=",buf[0]))
00126 {
00127 if (isSyntax) *isSyntax = 1;
00128 if (buf[0] == '\r') buf[0] = '\n';
00129 if (buf[0] && strchr("<>+=/",buf[0]))
00130 return SpecialWord(source,buf,size,buf[0]);
00131
00132
00133 buf[1]=0;
00134 return ' ';
00135 }
00136
00137 if (buf[0] == '%')
00138 {
00139 if (!fread(buf+1,1,1,source)) return -1;
00140 if (buf[1] == '>') {buf[0]=0; return -1;}
00141 else {end=buf[1]; buf[1]=0; return end;}
00142 }
00143
00144 if (buf[0] == '\"' || buf[0] == '\'')
00145 {
00146 int i = 1;
00147 end = buf[0];
00148 buf[0] = '\'';
00149 while (1)
00150 {
00151 if (!fread(buf+i,1,1,source)) return -1;
00152 if (buf[i] == '\\')
00153 {
00154 if (!fread(buf+i,1,1,source)) return -1;
00155 if (buf[i] == 'n') buf[i] = '\n';
00156 else if (buf[i] == 'r') buf[i] = '\r';
00157 else if (buf[i] == 't') buf[i] = '\t';
00158 }
00159 else if (buf[i] == end) break;
00160 if (i < size-1) i++;
00161 }
00162 buf[i] = 0;
00163 return ' ';
00164 }
00165 else
00166 {
00167 end = ReadUntilChar(source,buf+1,size-1," \t\r\n#*-/,;{}()[]<>+=",0);
00168 return SkipWhitespace(source,end);
00169 }
00170 }
00171 }
00172
00173 char* JSReport(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00174 {
00175 EZSSTREAM result;
00176 int i;
00177 char*c = 0;
00178
00179 if (!Env->config || !argc) return 0;
00180
00181 memset(&result,0,sizeof(result));
00182 result.t = NewBuffer(1024);
00183
00184
00185 for (i=0; i< argc; i ++)
00186 {
00187 if (*argv[i])
00188 {
00189 char filename[MAXPATH];
00190 FILE* script = 0;
00191 if (Env->argv0)
00192 if (strlen(argv[i]) + strlen(Env->argv0) < MAXPATH )
00193 {
00194 ExpandLocalPath(Env->argv0,filename,argv[i],0);
00195 script = CGIFOPEN(filename,"rb");
00196 }
00197 if (!script) script = CGIFOPEN(argv[i],"rb");
00198
00199 if (script)
00200 {
00201 RunReport(Env->argv0,&result,script,Params,NULL,NULL,0,NULL);
00202 CGIFCLOSE(script);
00203 }
00204 }
00205 }
00206 if (argc)
00207 {
00208 c = CopyBuffer(result.t);
00209 }
00210 DeleteBuffer(result.t);
00211 return c;
00212 }
00213
00214
00215 char* JSGetEnv(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00216 {
00217 #ifndef VPWSCGI
00218 char* c;
00219 if (argc == 0) return 0;
00220 c = GetEnvironment(Env->htmlout,argv[0]);
00221 if (c) return strdup(c);
00222 #endif
00223 return 0;
00224 }
00225
00226 char* JSToNumber(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00227 {
00228 if (argc == 0) return 0;
00229 if (!IsNumber(argv[0],0)) return 0;
00230 return strdup(argv[0]);
00231 }
00232
00236 char* JSHTMLEscape(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00237 {
00238 int c=0;
00239 size_t i,j,k=1;
00240 char *in;
00241 char *out;
00242 j=0;
00243
00244 if (argc != 1) return NULL;
00245
00246 in = argv[0];
00247 for (i=0; in[i]; i++)
00248 {
00249 j++;
00250
00251
00252 if (in[i] & 0x80) j+= 3;
00253 else if (strchr("<>&\"",in[i])) j += 5;
00254 }
00255 out = CGIMALLOC(strlen(in) + j);
00256
00257 j = 0;
00258 for (i=0; in[i]; )
00259 {
00260 k = UTF8ToUCS2C(in+i,&c);
00261 if (k > 1)
00262 {
00263 j += sprintf(out+j,"&#%d;",c);
00264 i += k;
00265 }
00266 else
00267 {
00268 switch(in[i])
00269 {
00270 case '<': memcpy(out+j,"<",4); j+=4; break;
00271 case '>': memcpy(out+j,">",4); j+=4; break;
00272 case '&': memcpy(out+j,"&",5); j+=5; break;
00273 case '\"': memcpy(out+j,""",6); j+=6; break;
00274 default:
00275 out[j++] = in[i];
00276 }
00277 i++;
00278 }
00279 }
00280 return out;
00281 }
00282
00283 char* JSTimeStamp(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00284 {
00285 char datetime[16];
00286 GetTime(datetime,datetime+8,0);
00287 return strdup(datetime);
00288 }
00289
00290 char* JSHasRecord(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00291 {
00292 FILE* database;
00293 CGINameValue* header;
00294 char dbfile[MAXPATH];
00295
00296 int r = 0;
00297
00298 if (argc < 2) return 0;
00299
00300 if (strlen(argv[0]) > MAXPATH) return 0;
00301
00302 dbfile[0] =0;
00303
00304 if (Env->argv0)
00305 if (strlen(argv[0]) + strlen(Env->argv0) < MAXPATH )
00306 ExpandLocalPath(Env->argv0,dbfile,argv[0],0);
00307
00308 if (DatabaseOpen(*dbfile?dbfile:argv[0],&database,&header,0,0))
00309 {
00310 r = DatabaseFindNextRecord(database,header,Params,argv[1]);
00311 DatabaseClose(database,header);
00312 }
00313 return strdup(r?"1":"0");
00314 }
00315
00316
00317 static unsigned int random_seed;
00318
00319 char* JSRandom(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00320 {
00321 unsigned int x;
00322 char* result = (char*)CGIMALLOC(32);
00323 #ifdef __WINCE__
00324 random_seed += GetTickCount();
00325 #else
00326 random_seed += time(0);
00327 #endif
00328 if (argc == 0) x = random_seed;
00329 else
00330 { x = atoi(argv[0]);
00331 if (!x ) x = random_seed;
00332 else x = random_seed % x;
00333 }
00334 sprintf(result,"%d",x);
00335 return result;
00336 }
00337
00338 char* JSEval(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00339 {
00340 if (!argc) return 0;
00341 return EvaluateExpression(Params,0,argv[0]);
00342 }
00343
00344 char* JStoFixed(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00345 {
00346 double d;
00347 int x;
00348 char format[32];
00349 char result[128];
00350
00351 if (argc == 0) return 0;
00352 d = strtod(argv[0],NULL);
00353 if (argc == 2) x = atoi(argv[1]);
00354 else x = 0;
00355
00356 sprintf(format,"%%.%df",x);
00357 sprintf(result,format,d);
00358
00359 return strdup(result);
00360 }
00361
00363 char* JSstrlen(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00364 {
00365 char temp[32];
00366 sprintf(temp,"%d",argc ? strlen(argv[0]) : 0);
00367 return strdup(temp);
00368 }
00370 char* JSsubstr(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00371 {
00372 char* str;
00373 int start=0;
00374 int delta=65535;
00375 int length;
00376 int end;
00377
00378 if (!argc) return NULL;
00379 str = argv[0];
00380 if (argc > 1) start = atoi(argv[1]);
00381 if (argc > 2) delta= atoi(argv[2]);
00382
00383 length = strlen(str);
00384 if (start < 0) start = length + start;
00385 if (start < 0) start = 0;
00386 end = start + delta;
00387
00388 if (end == start || start >= length) return strdup("");
00389
00390 if (end >= length) end = length;
00391
00392 length = abs(start - end);
00393 if (end < start) start = end;
00394
00395 return strndup(str + start, length);
00396 }
00397
00399 char* JSIndexOf(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00400 {
00401 char* str;
00402 char* sub;
00403 int start=0;
00404 int dir=0;
00405 int length;
00406 char*c=0;
00407 char temp[32];
00408 if (argc < 2) return strdup("-1");
00409 str = argv[0];
00410 sub = argv[1];
00411 if (argc > 2) start = atoi(argv[2]);
00412 if (argc > 3) dir = atoi(argv[3]);
00413 length = strlen(str);
00414 if (start < 0) start = length - start;
00415 if (start < 0) start = 0;
00416 if (sub && start < length)
00417 {
00418 if (dir)
00419 {
00420 int i = length - strlen(sub);
00421 while (i > start && c == 0)
00422 {
00423 c = (char*)stristr(str + i,sub);
00424 i--;
00425 }
00426 }
00427 if (!c)
00428 c = (char*)stristr(str + start,sub);
00429 }
00430
00431 if (!c) return strdup("-1");
00432 start = c - str;
00433 sprintf(temp,"%d",start);
00434 return strdup(temp);
00435 }
00436
00437
00438 char* JSPrint(ScriptEnvironment* Env, char* cmd, int argc, char** argv, CGINameValue* Params)
00439 {
00440 int i;
00441 for (i=0; i<argc; i++)
00442 {
00443 HTMLWrite(Env->htmlout,argv[i]);
00444 }
00445 if (stristr(cmd,"ln")) HTMLWrite(Env->htmlout,"\r\n");
00446 return NULL;
00447 }
00448
00449
00450 int RunScriptObject(ScriptEnvironment* Env,
00451 FILE* script,
00452 int end,
00453 char* name,
00454 CGINameValue* Variables,
00455 char** outstr)
00456 {
00457 char word[4096];
00458 ScriptObject * ob = NULL;
00459 char* value;
00460 int i;
00461
00462 if (outstr) *outstr = NULL;
00463
00464 if (!Env->Objects) return 45;
00465
00466 for (i=0; Env->Objects[i].name != NULL; i++)
00467 {
00468 if (!stricmp(Env->Objects[i].name,name))
00469 {
00470 ob = Env->Objects + i;
00471 break;
00472 }
00473 }
00474
00475 if (ob == NULL) return 45;
00476 end = ReadNextToken(script,word,sizeof(word),end,0);
00477 if (word[0] == '[')
00478 end = ReadNextToken(script,word,sizeof(word),end,0);
00479
00480 if (word[0] == 0) return 45;
00481 if (word[0] == '\'' )
00482 {
00483 if (end == -1 || strchr(word,'\n')) return 40;
00484 value = word + 1;
00485 }
00486 else
00487 {
00488 value = GetFieldValue(Variables,word);
00489 }
00490
00491 if (end != ']') ReadUntilChar(script,0,0,"]",0);
00492
00493 if (outstr) *outstr = strdup(GetFieldValue(ob->data,value));
00494 return 0;
00495 }
00496
00520 int EvaluateArgument(ScriptEnvironment* Env,
00521 FILE* script,
00522 int *e,
00523 CGINameValue* Variables,
00524 char* endchars,
00525 char** outstr,
00526 int asNumber)
00527 {
00528 char word[4096];
00529 int mode = asNumber;
00530 int ret = 0;
00531 char* value;
00532 int parity = 0;
00533 int end = *e;
00534 TextBuffer* m = NewBuffer(1024);
00535
00536 while(!ret && end != -1 && !strchr(endchars,end))
00537 {
00538 int isSyntax = 0;
00539 value = 0;
00540 end = ReadNextToken(script,word,sizeof(word),end,&isSyntax);
00541
00542 if (word[0] == 0)
00543 continue;
00544
00545 if (strchr(endchars,word[0]))
00546 { end = word[0]; break; }
00547
00548 if (isSyntax)
00549 {
00550 if (mode != 2)
00551 BufferWrite(m,word);
00552 parity = 0;
00553 continue;
00554 }
00555
00556 if (mode && parity)
00557 ret = 47;
00558
00559 if (!strcmp(word,"("))
00560 {
00561 ret = EvaluateArgument(Env,script,&end,Variables,")",&value,1);
00562 }
00563 else if (word[0] == '\'')
00564 {
00565 BufferWrite(m,word+1);
00566 if (mode == 0) mode = 2;
00567 }
00568 else if (end == '(')
00569 {
00570 ret = RunScriptFunction(Env,script,' ',word,Variables,&value);
00571 end = ' ';
00572 }
00573 else if (end == '[')
00574 {
00575 ret = RunScriptObject(Env,script,' ',word,Variables,&value);
00576 end = ' ';
00577 }
00578 else if (IsNumber(word,0))
00579 {
00580 BufferWrite(m,word);
00581 if (mode == 0) mode = 1;
00582 }
00583 else
00584 {
00585 char* x = GetFieldValue(Variables,word);
00586 BufferWrite(m,x);
00587 if (mode == 0)
00588 mode = (x[0] && IsNumber(x,0)) ? 1 : 2;
00589 }
00590
00591 parity = 1;
00592 if (ret) break;
00593
00594 if (value)
00595 {
00596 if (mode == 0)
00597 mode = (value[0] && IsNumber(value,0)) ? 1 : 2;
00598
00599 BufferWrite(m,value);
00600 CGIFREE(value);
00601 }
00602 else if (mode == 0) mode = 2;
00603
00604 }
00605
00606 if (ret == 0 && mode==0)
00607 ret = 49;
00608
00609 if (!ret)
00610 {
00611 value = CopyBuffer(m);
00612
00613 if (mode == 1)
00614 {
00615 *outstr = EvaluateExpression(Variables,0,value);
00616 CGIFREE(value);
00617 }
00618 else
00619 *outstr = value;
00620 }
00621
00622 DeleteBuffer(m);
00623 *e = end;
00624 return ret;
00625 }
00626
00627 int RunScriptFunction(ScriptEnvironment* Env,
00628 FILE* script,
00629 int end,
00630 char* name,
00631 CGINameValue* Variables,
00632 char** outstr)
00633 {
00634
00635 ScriptFunction * fn = NULL;
00636 char ** argv = {NULL};
00637 int argc = 0;
00638 int ret = 0;
00639
00640 int i;
00641
00642 if (!Env->Functions && !Env->F2) return 48;
00643
00644 if (name[0] == '&') name ++;
00645
00646 if (Env->Functions)
00647 for (i=0; fn == NULL && Env->Functions[i].run != NULL; i++)
00648 if (!stricmp(Env->Functions[i].name,name))
00649 fn = Env->Functions + i;
00650
00651 if (Env->F2)
00652 for (i=0; fn == NULL && Env->F2[i].run != NULL; i++)
00653 if (!stricmp(Env->F2[i].name,name))
00654 fn = Env->F2 + i;
00655
00656 if (fn == NULL) return 48;
00657
00658 if (end != ';' && end != '\n')
00659 {
00660 argv = (char**) CGIMALLOC (sizeof(char*) * (1+fn->parameters));
00661 memset(argv,0,sizeof(char*) * (1+fn->parameters));
00662
00663 while(!ret && end != ')')
00664 {
00665 char* value;
00666 ret = EvaluateArgument(Env, script, &end, Variables, ",)}",&value,0);
00667 if (!ret && value != NULL && argc < fn->parameters)
00668 argv[argc++] = value;
00669 if (end == ',') end = ' ';
00670 }
00671 }
00672
00673 if (!ret)
00674 {
00675 char* result = fn->run(Env,name,argc,argv,Variables);
00676 if (outstr != NULL) *outstr = result;
00677 else if (result != NULL) CGIFREE(result);
00678 }
00679
00680 for (i=0; i< argc; i++)
00681 {
00682 CGIFREE(argv[i]);
00683 }
00684 if (argv) CGIFREE(argv);
00685 return ret;
00686 }
00687
00688
00689 int DelimitedSection(FILE*script,char* out,size_t length,int end,char* open, char* close,int errbase)
00690 {
00691 char word[8];
00692 char c;
00693 int count = 1;
00694 size_t i=0;
00695
00696 word[0] = '\n';
00697 while (word[0] == '\n')
00698 end = ReadNextToken(script,word,sizeof(word),end,0);
00699
00700 if (!strchr(open,word[0])) return errbase;
00701
00702 while (count && fread(&c,1,1,script))
00703 {
00704 if (strchr(open,c)) count++;
00705 else if (strchr(close,c)) count--;
00706 if (count && out && i< length)
00707 out[i++]=c;
00708 }
00709
00710 if (out && i<length) out[i]=0;
00711 if (!strchr(close,c)) return errbase+1;
00712 return 0;
00713 }
00714
00719 int RunScript(ScriptEnvironment* Env,FILE* script,CGINameValue* Variables)
00720 {
00721 char* name;
00722 char word[4096];
00723
00724 int inif = 0;
00725 int CurrentTruth = 0;
00726 int ret = 0;
00727 int end = ' ';
00728
00729
00730 name = 0;
00731 while (ret==0 && Env->endchar != -1)
00732 {
00733 Env->lastLine = ftell(script);
00734 end = ReadNextToken(script,word,sizeof(word),end,0);
00735 if (end <= 0) break;
00736
00737 if (word[0] == '#')
00738 {
00739 end = ReadUntilChar(script,0,0,"\n",'\r');
00740 continue;
00741 }
00742 if (word[0] == 0) continue;
00743 if (word[0] == ';' || word[0] == '\n' || word[0] == ',') continue;
00744
00745 if (word[0] == '\'') ret = 43;
00746 if (word[0] == '}') break;
00747 if (word[0] == '{')
00748 {
00749 ret = RunScript(Env,script,Variables);
00750 if (ret) break;
00751 end = Env->endchar;
00752 continue;
00753 }
00754
00755
00756 if (!strcmp(word,"//") && (end != '\n' && end != '\r'))
00757 {
00758 end = ReadUntilChar(script,0,0,"\r\n",0);
00759 continue;
00760 }
00761
00762 if (word[0] == '/')
00763 if (word[1] == '*' && !strstr(word+2,"*/"))
00764 {
00765 ReadUntilWord(script,0,0,"*/");
00766 end = ' ';
00767 continue;
00768 }
00769
00770 if (!stricmp(word,"var"))
00771 continue;
00772
00773 if (HasTokenI("</script>,&exit,quit,exit,&end,&return,%>",word,0))
00774 {end = -1; break;}
00775
00776
00777 if (!stricmp(word,"delete"))
00778 {
00779 end = ReadNextToken(script,word,sizeof(word),end,0);
00780 if (*word) RenameField(Variables,word,0);
00781 if (end < 0) break;
00782 continue;
00783 }
00784
00785 if (!stricmp(word,"if"))
00786 {
00787 startif:
00788 ret = DelimitedSection(script,word,sizeof(word),end,"(",")",41);
00789 if (ret) break;
00790
00791 CurrentTruth = EvaluateLogic(word,Variables,0);
00792 inif = 1;
00793
00794 if (CurrentTruth)
00795 {
00796 word[0] = '\n';
00797 while (word[0] == '\n')
00798 end = ReadNextToken(script,word,sizeof(word),0,0);
00799 if (word[0] != '{') {ret = 70; break;}
00800 ret = RunScript(Env,script,Variables);
00801 if (ret) break;
00802 end = Env->endchar;
00803 }
00804 else
00805 {
00806 ret = DelimitedSection(script,0,0,0,"{","}",70);
00807 if (ret) break;
00808 end = ' ';
00809 }
00810 continue;
00811 }
00812
00813 if (!stricmp(word,"else"))
00814 {
00815 if (!inif) {ret = 44; break; }
00816
00817 if (end != '{')
00818 {
00819 end = ReadNextToken(script,word,sizeof(word),end,0);
00820 if (!stricmp(word,"if"))
00821 goto elsif;
00822 else if (end < 0)
00823 break;
00824 else
00825 end=word[0];
00826 }
00827
00828 inif = 0;
00829 if (!CurrentTruth)
00830 {
00831 if (end != '{')
00832 {
00833 ret = 70;
00834 break;
00835 }
00836 ret = RunScript(Env,script,Variables);
00837 if (ret) break;
00838 end = Env->endchar;
00839 }
00840 else
00841 {
00842 skip:
00843 ret = DelimitedSection(script,0,0,end,"{","}",70);
00844 if (ret) break;
00845 end = ' ';
00846 }
00847 continue;
00848 }
00849
00850 if (!stricmp(word,"elif") || !stricmp(word,"elsif"))
00851 {
00852 elsif:
00853 if (!inif) {ret = 44; break; }
00854 if (CurrentTruth)
00855 goto skip;
00856 else
00857 goto startif;
00858 }
00859
00860
00861 inif = 0;
00862
00863
00864 CGIFREE(name);
00865 name = strdup(word);
00866
00867 end = ReadNextToken(script,word,sizeof(word),end,0);
00868
00869
00870
00871 if (!strcmp(word,"=") || !stricmp(word,"+="))
00872 {
00873 char* value = 0;
00874 ret = EvaluateArgument(Env,script,&end,Variables,"\r\n;}",&value,0);
00875 if (ret) break;
00876
00877 if (word[0] == '+')
00878 {
00879 char * c = GetFieldValue(Variables,name);
00880 if (IsNumber(c,0) && IsNumber(value,0))
00881 {
00882 char* x=0;
00883 double a = strtod(c,&x);
00884 if (*x) goto concat;
00885 a += strtod(value,&x);
00886 if (*x) goto concat;
00887 CGIFREE(value);
00888 value = CGIMALLOC(64);
00889 sprintf(value,"%f",a);
00890 }
00891 else
00892 {
00893 concat:
00894 c = strdup3(c,value,"");
00895 CGIFREE(value);
00896 value = c;
00897 }
00898 }
00899
00900 if (!SetFieldValue(Variables,name,value))
00901 {
00902 ExtendNVP(Variables,128);
00903 SetFieldValue(Variables,name,value);
00904
00905 }
00906 CGIFREE(value);
00907 }
00908 else if (!strcmp(word,"++"))
00909 {
00910 char * c = GetFieldValue(Variables,name);
00911 char value[128];
00912 sprintf(value,"%f",strtod(c,0) + 1.0);
00913 SetFieldValue(Variables,name,value);
00914 }
00915 else if (!strcmp(word,"("))
00916 {
00917 ret = RunScriptFunction(Env,script,end,name,Variables,0);
00918 end = ' ';
00919 }
00920 else
00921 {
00922 ret = 46;
00923 break;
00924 }
00925 }
00926
00927 CGIFREE(name);
00928 Env->endchar = end;
00929 Env->curpos = ftell(script);
00930 if (ret == -1) ret = 0;
00931 return ret;
00932 }
00933