scalar.c
上传用户:aidanglao
上传日期:2007-01-07
资源大小:69k
文件大小:36k
源码类别:

Oracle数据库

开发平台:

Unix_Linux

  1. /* scalar.c - suupporting functions for parser
  2. /*
  3. /* Copyright (c) 1995-1999 Applied Information Technologies, Inc.
  4. /* All Rights Reserved.
  5. /*  
  6. /* Distributed uder the GNU General Public License which was included in
  7. /* the file named "LICENSE" in the package that you recieved.
  8. /* If not, write to:
  9. /* The Free Software Foundation, Inc.,
  10. /* 675 Mass Ave, Cambridge, MA 02139, USA.
  11.  */
  12. #include <string.h>
  13. #include <errno.h>
  14. #include "scalar.h"
  15. #include "sqlweb.h"
  16. #include "ifparse.h"
  17. #include "ifwords.h"
  18. /* 
  19. /* The Global Variables for the IfParser
  20.  */
  21. static LIST *glAllScalarElements; /* All Allocated Stuff, for cleanup */
  22. static Scalar_t gsNullScalar /* = {-1,0,0,0} */ ;
  23. /*
  24. /* External Functions
  25.  */
  26. extern double atof();
  27. extern char *strcat();
  28. extern atoi();
  29. /*
  30. /* Private Functions
  31.  */
  32. static eBoolean_t aToBool(char *p);
  33. /* static void PushScalar(Scalar_t *p);
  34.  */
  35. static double ScalarToDouble(Scalar_t *p);
  36. static char *ScalarToString(Scalar_t *p);
  37. static eBoolean_t CompareDouble(int iOp,double dLeft, double dRight);
  38. static eBoolean_t CompareString(int iOp,char *pLeft, char *pRight);
  39. static eBoolean_t IsNumber(Scalar_t *p);
  40. static void ToUpper(char *pBuf);
  41. static void ToLower(char *pBuf);
  42. static void FormatString(char *pInpStr,char *pFmtStr,char *pOutBuf);
  43. static long GetReplaceSize(char *pBuf, char *pSrch, char *pRepl );
  44. static char * Replace( char *pBuf, char *pSrch, char *pRepl );
  45. /********************************************************
  46. /* Boolean Functions
  47.  */
  48. eBoolean_t 
  49. BetweenCond(Scalar_t *p, Scalar_t *pLo, Scalar_t *pHi)
  50. {
  51.     double d, dLo, dHi;
  52.     if(!p || !pLo || !pHi) {
  53. DebugHTML(__FILE__,__LINE__,0
  54. ,"WARN:BETWEEN:Scalar is NULL(%x between %x and %x)"
  55. ,p
  56. ,pLo
  57. ,pHi
  58. );
  59. MsgPush("WARN:BETWEEN:Scalar is NULL");
  60. return(eFalse);
  61.     }
  62.     d   = ScalarToDouble(p);
  63.     dLo = ScalarToDouble(pLo);
  64.     dHi = ScalarToDouble(pHi);
  65.     return( (d>=dLo && d<=dHi)?eTrue :eFalse);
  66. }
  67. eBoolean_t 
  68. LikeCond(Scalar_t *p1, Scalar_t *p2)
  69. {
  70.     char *pStr1, *pStr2;
  71.     if(!p1 || !p2) {
  72. DebugHTML(__FILE__,__LINE__,0
  73. ,"WARN:LIKE:Scalar is NULL(%x like %x)"
  74. ,pStr1
  75. ,pStr2
  76. );
  77. MsgPush("WARN:LIKE:Scalar is NULL");
  78. return(eFalse);
  79.     }
  80.     pStr1 = ScalarToString(p1);
  81.     pStr2 = ScalarToString(p2);
  82.     DebugHTML(__FILE__,__LINE__,0,"WARN:LIKE only supports EQ.");
  83.     DebugHTML(__FILE__,__LINE__,4,"Strcmp(%s,%s)",pStr1,pStr2);
  84.     /* return( (strcmp(pStr1,pStr2)==0)?eTrue :eFalse );
  85.      */
  86.     return( bStrMatch(pStr1,pStr2) );
  87. }
  88. eBoolean_t 
  89. IsNullCond(Scalar_t *p)
  90. {
  91.     char *pStr;
  92.     if(!p){
  93. DebugHTML(__FILE__,__LINE__,2,"WARN:IS NULL:Scalar is NULL");
  94. return(eTrue);
  95.     }
  96.     pStr = ScalarToString(p);
  97.     /*
  98.     /* Compare STRINGS
  99.      */
  100.     return(pStr ? (iStrLen(pStr)==0)?eTrue :eFalse 
  101.         : eTrue
  102.   );
  103. }
  104. eBoolean_t 
  105. InCond(Scalar_t *pVal, Scalar_t *pList)
  106. {
  107.     Scalar_t *pTop;
  108.     if(!pVal || !pList) {
  109. DebugHTML(__FILE__,__LINE__,0
  110. ,"WARN:IN:Scalar is NULL(%x in(%x))"
  111. ,pVal
  112. ,pList
  113. );
  114. MsgPush("WARN:IN:Scalar is NULL");
  115. return(eFalse);
  116.     }
  117.     for(pTop=DEQ(pList->uVal.pList);pTop;pTop=DEQ(pList->uVal.pList)){
  118. if(ISeTrue(CompareCond(MkScalarToken(EQ),pVal,pTop))){
  119.     return(eTrue);
  120. }
  121.     }
  122.     return(eFalse);
  123. }
  124. eBoolean_t 
  125. CompareCond(Scalar_t *pOp,Scalar_t *pLeft,Scalar_t *pRight)
  126. {
  127.     double dLeft, dRight;
  128.     char  *pStrLeft,*pStrRight;
  129.     if(!pOp || !pLeft || !pRight) {
  130. DebugHTML(__FILE__,__LINE__,0
  131. ,"WARN:COMPARE:Scalar is NULL(op=%x, %x op %x)"
  132. ,pOp
  133. ,pLeft
  134. ,pRight
  135. );
  136. MsgPush("WARN:COMPARE:Scalar is NULL");
  137. return(eFalse);
  138.     }
  139.     /*
  140.     /* If either operand is a number, they are all numbers 
  141.      */
  142.     if(ISeTrue(IsNumber(pLeft)) || ISeTrue(IsNumber(pRight)))
  143.     {
  144. /* Comparing Numbers */
  145. dLeft = ScalarToDouble(pLeft);
  146. dRight= ScalarToDouble(pRight);
  147. return(CompareDouble(pOp->uVal.iInt,dLeft,dRight));
  148.     }
  149.     /*
  150.     /* Otherwise treat them as strings
  151.      */
  152.     pStrLeft =ScalarToString(pLeft);
  153.     pStrRight=ScalarToString(pRight);
  154.     return(CompareString(pOp->uVal.iInt,pStrLeft,pStrRight));
  155. }
  156. /********************************************************
  157. /* The Scalar Functions
  158.  */
  159. Scalar_t *
  160. AddScalar(Scalar_t *p1, Scalar_t *p2)
  161. {
  162.     double d1, d2;
  163.     if(!p1 || !p2) {
  164. DebugHTML(__FILE__,__LINE__,0
  165. ,"WARN:ADD:Scalar is NULL(%x + %x)"
  166. ,p1
  167. ,p2
  168. );
  169. return(&gsNullScalar);
  170.     }
  171.     /*
  172.     /* If either is a number convert to number...
  173.      */
  174.     if( ISeTrue(IsNumber(p1)) || ISeTrue(IsNumber(p2))) {
  175. d1 = ScalarToDouble(p1);
  176. d2 = ScalarToDouble(p2);
  177. p1->esType = eDoubleType;
  178. p1->uVal.dDouble = d1+d2;
  179. p1->lSize = 0L;
  180. return(p1);
  181.     }
  182.     return(CatScalar(p1,p2));
  183. }
  184. Scalar_t *
  185. CatScalar(Scalar_t *p1, Scalar_t *p2)
  186. {
  187.     char *pB1,*pB2,*pRet;
  188.     long lSize;
  189.     if(!p1 || !p2) {
  190. DebugHTML(__FILE__,__LINE__,0
  191. ,"WARN:CAT:Scalar is NULL(%x + %x)"
  192. ,p1
  193. ,p2
  194. );
  195. return(&gsNullScalar);
  196.     }
  197.     pB1=ScalarToString(p1);
  198.     pB2=ScalarToString(p2);
  199.     lSize = iStrLen(pB1)+iStrLen(pB2)+1; /* need room for null */
  200.     pRet = (char*)malloc(lSize);
  201.     if(!pRet) {
  202. DebugHTML(__FILE__,__LINE__,0
  203. ,"WARN:CAT:Malloc failed(%x,%x)"
  204. ,p1
  205. ,p2
  206. );
  207. return(&gsNullScalar);
  208.     }
  209.     (void)memset(pRet,0,lSize);
  210.     strcpy(pRet,pB1);
  211.     strcat(pRet,pB2);
  212.     p1->esType = eStringType;
  213.     p1->uVal.pString = pRet;
  214.     p1->lSize = lSize;
  215.     return(p1);
  216. }
  217. Scalar_t *
  218. SubScalar(Scalar_t *p1, Scalar_t *p2)
  219. {
  220.     double d1, d2;
  221.     if(!p1 || !p2) {
  222. DebugHTML(__FILE__,__LINE__,0
  223. ,"WARN:SUB:Scalar is NULL(%x - %x)"
  224. ,p1
  225. ,p2
  226. );
  227. return(&gsNullScalar);
  228.     }
  229. /*
  230. /*   Convert to number and subtract...
  231.  */
  232.     d1 = ScalarToDouble(p1);
  233.     d2 = ScalarToDouble(p2);
  234.     p1->esType = eDoubleType;
  235.     p1->uVal.dDouble = d1-d2;
  236.     p1->lSize = 0;
  237.     return(p1);
  238. }
  239. Scalar_t *
  240. MultScalar(Scalar_t *p1, Scalar_t *p2)
  241. {
  242.     double d1, d2;
  243.     if(!p1 || !p2) {
  244. DebugHTML(__FILE__,__LINE__,0
  245. ,"WARN:MULTIPLY:Scalar is NULL(%x * %x)"
  246. ,p1
  247. ,p2
  248. );
  249. return(&gsNullScalar);
  250.     }
  251.     /* Convert to number and do it!
  252.      */
  253.     d1 = ScalarToDouble(p1);
  254.     d2 = ScalarToDouble(p2);
  255.     p1->esType = eDoubleType;
  256.     p1->uVal.dDouble = d1*d2;
  257.     p1->lSize = 0;
  258.     return(p1);
  259. }
  260. Scalar_t *
  261. DivScalar(Scalar_t *p1, Scalar_t *p2)
  262. {
  263.     double d1, d2;
  264.     if(!p1 || !p2) {
  265. DebugHTML(__FILE__,__LINE__,0
  266. ,"WARN:DIV:Scalar is NULL(%x / %x)"
  267. ,p1
  268. ,p2
  269. );
  270. return(&gsNullScalar);
  271.     }
  272.     d1 = ScalarToDouble(p1);
  273.     d2 = ScalarToDouble(p2);
  274.     if( (int)d2==0) {
  275. DebugHTML(__FILE__,__LINE__,0,"WARN:Div by Zero");
  276. return(&gsNullScalar);
  277.     }
  278.     p1->esType = eDoubleType;
  279.     p1->uVal.dDouble = d1/d2;
  280.     p1->lSize = 0;
  281.     return(p1);
  282. }
  283. Scalar_t *
  284. ModScalar(Scalar_t *p1, Scalar_t *p2)
  285. {
  286.     double d1, d2;
  287.     if(!p1 || !p2) {
  288. DebugHTML(__FILE__,__LINE__,0
  289. ,"WARN:MOD:Scalar is NULL(%x / %x)"
  290. ,p1
  291. ,p2
  292. );
  293. return(&gsNullScalar);
  294.     }
  295.     d1 = ScalarToDouble(p1);
  296.     d2 = ScalarToDouble(p2);
  297.     if( (int)d2==0) {
  298. DebugHTML(__FILE__,__LINE__,0,"WARN:Div by Zero");
  299. return(&gsNullScalar);
  300.     }
  301.     p1->esType = eDoubleType;
  302.     p1->uVal.dDouble = (int)d1 %(int)d2;
  303.     p1->lSize = 0;
  304.     return(p1);
  305. }
  306. Scalar_t *
  307. USubScalar(Scalar_t *p1)
  308. {
  309.     double d1;
  310.     if(!p1) {
  311. DebugHTML(__FILE__,__LINE__,0,"WARN:USUB:Scalar is NULL(%x)",p1);
  312. return(&gsNullScalar);
  313.     }
  314.     d1 = ScalarToDouble(p1);
  315.     p1->esType = eDoubleType;
  316.     p1->uVal.dDouble = -d1;
  317.     p1->lSize = 0;
  318.     return(p1);
  319. }
  320. Scalar_t *
  321. CallFunction
  322. (Scalar_t *pName
  323. ,Scalar_t *pList
  324. )
  325. {
  326.     Reserved_t *pResWord;
  327.     if(!pName || !pList) {
  328. DebugHTML(__FILE__,__LINE__,0
  329. ,"WARN:CALL:Scalar is NULL(%x(%x))"
  330. ,pName
  331. ,pList
  332. );
  333. return(&gsNullScalar);
  334.     }
  335.     for(pResWord=gaReservedWordTable; pResWord->pName; pResWord++){
  336. if(is_casematch(pResWord->pName,pName->uVal.pString)) {
  337.     /* Got one!
  338.      */
  339.     return( (pResWord->pScalarFunc)(pList) );
  340. }
  341.     }
  342.     DebugHTML(__FILE__,__LINE__,0,"WARN:CALL:Unknown Function or Type.");
  343.     return( &gsNullScalar );
  344. }
  345. Scalar_t *
  346. AddScalarToList(Scalar_t *pList,Scalar_t *p1)
  347. {
  348.     if(!p1) {
  349. DebugHTML(__FILE__,__LINE__,0,"WARN:ADD LIST:Scalar is NULL(%x)",p1);
  350. return(&gsNullScalar);
  351.     }
  352.     if(!pList){
  353. pList=MkScalar(eListType,p1,p1->lSize);
  354. return(pList);
  355.     }
  356.     ENQ(pList->uVal.pList,p1);
  357.     return(pList);
  358. }
  359. /********************************************************
  360. /* Called by yylex and elsewhere to create a scalar when found
  361.  */
  362. Scalar_t *
  363. MkScalarToken(int iToken)
  364. {
  365.     Scalar_t *p;
  366.     p = (Scalar_t *)malloc(sizeof(Scalar_t));
  367.     if(!p){
  368. /* out of memory */
  369. return(0);
  370.     }
  371.     (void)memset(p,0,sizeof(Scalar_t));
  372.     p->esType = eIntType;
  373.     p->uVal.iInt = iToken;
  374.     p->lSize = 0;
  375.     /* PushScalar(p);
  376.      */
  377.     return(p);
  378. }
  379. Scalar_t *
  380. MkScalar(eScalar_t esType, void *pValue, long lSize)
  381. {
  382.     Scalar_t *p;
  383.     p = (Scalar_t *)malloc(sizeof(Scalar_t));
  384.     if(!p){
  385. /* out of memory */
  386. return(0);
  387.     }
  388.     (void)memset(p,0,sizeof(Scalar_t));
  389.     p->esType = esType;
  390.     p->lSize  = lSize;
  391.     switch(esType) {
  392. case eStringType:p->uVal.pString= DupMem(pValue,lSize); break;
  393. case eIntType:  p->uVal.iInt   = atoi(pValue);    break;/* Integers */
  394. case eDoubleType:p->uVal.dDouble= atof(pValue);    break;/* Real */
  395. case eListType:  p->uVal.pList  = l_create("QUEUE");
  396.  ENQ(p->uVal.pList,pValue);
  397.  break; /* Lists */
  398. case eBoolType:  p->uVal.bBool  = aToBool(pValue); break;/* Bool */
  399. case eRawType:   p->uVal.pRaw   = DupMem(pValue,lSize); break;
  400.     }
  401.     /* PushScalar(p);
  402.      */
  403.     return(p);
  404. }
  405. extern Scalar_t *
  406. ToScalar(eBoolean_t bBool)
  407. {
  408.     Scalar_t *p;
  409.     p = (Scalar_t *)malloc(sizeof(Scalar_t));
  410.     if(!p){
  411. /* out of memory */
  412. return(0);
  413.     }
  414.     (void)memset(p,0,sizeof(Scalar_t));
  415.     p->esType = eBoolType;
  416.     p->uVal.bBool  = bBool;
  417.     /* PushScalar(p);
  418.      */
  419.     return(p);
  420. }
  421. extern eBoolean_t
  422. IsScalar(Scalar_t *pScalar)
  423. {
  424.     switch(pScalar->esType) {
  425. case eStringType:
  426.     if(is_casematch(pScalar->uVal.pString,"TRUE")) return(eTrue);
  427.     else return(eFalse);
  428. case eIntType:
  429.     if(pScalar->uVal.iInt) return(eTrue);
  430.     else return(eFalse);
  431. case eDoubleType:
  432.     if(pScalar->uVal.dDouble) return(eTrue);
  433.     else return(eFalse);
  434. /* case eListType:  pScalar->uVal.pList  = l_create("QUEUE");
  435. /*  ENQ(pScalar->uVal.pList,pValue);
  436. /*  break; /* Lists */
  437. /* */
  438. case eBoolType:  return(pScalar->uVal.bBool);
  439. default: return(eFalse);
  440.     }
  441.     return(eFalse);
  442. }
  443. extern eBoolean_t
  444. OutputScalar(Scalar_t *pScalar)
  445. {
  446.     OutputHTML("%s",ScalarToString(pScalar));
  447.     return(eTrue);
  448. }
  449. /*
  450. /* Internal Private Functions
  451. /* static void
  452. /* PushScalar(Scalar_t *p)
  453. /* {
  454. /*     if(!glAllScalarElements){
  455. /*  glAllScalarElements=l_create("QUEUE");
  456. /*     }
  457. /*     ENQ(glAllScalarElements,p);
  458. /*     return;
  459. /* }
  460.  */
  461. static double
  462. ScalarToDouble(Scalar_t *p)
  463. {
  464.     if(!p) return(0.0);
  465.     switch(p->esType) {
  466. case eStringType:return(atof(p->uVal.pString));
  467. case eIntType:  return((double)p->uVal.iInt);
  468. case eDoubleType:return(p->uVal.dDouble);
  469. case eListType:  return(0.0);
  470. case eBoolType:  return ISeTrue(p->uVal.bBool) ? 1.0 :0.0 ;
  471. default:  return(0.0);
  472.     }
  473.     return(0.0);
  474. }
  475. static char *
  476. ScalarToString(Scalar_t *p)
  477. {
  478.     char sBuf[BUFSIZ];
  479.     char *pNullStr = "";
  480.     int iLen;
  481.     if(!p) {
  482. DebugHTML(__FILE__,__LINE__,0,"ToStr:NULLStr");
  483. return(pNullStr);
  484.     }
  485.     DebugHTML(__FILE__,__LINE__,5,"ToStr:%s.%d(%d),%s"
  486.     ,p->esType==eStringType    ?"S"
  487. :p->esType==eIntType   ?"I"
  488. :p->esType==eDoubleType?"D"
  489. :p->esType==eListType  ?"L"
  490. :p->esType==eBoolType  ?"B"
  491. :p->esType==eRawType   ?"R"
  492. :"?"
  493.     ,p->lSize
  494.     ,p->esType==eStringType?iStrLen(p->uVal.pString):-1
  495.     ,p->esType==eStringType && p->uVal.pString?p->uVal.pString:"*?*"
  496.     );
  497.     switch(p->esType) {
  498. case eStringType:
  499. if(p->lSize==0) {
  500.     return(DupBuf(0));
  501. }
  502. /* if(p->uVal.pString && p->lSize>=0)
  503. /*    *(p->uVal.pString + p->lSize)=0; /* set NULL */
  504. /* */
  505. return(p->uVal.pString);
  506. case eIntType: sprintf(sBuf,"%d",p->uVal.iInt);
  507. return(DupBuf(sBuf));
  508. case eDoubleType:
  509. sprintf(sBuf,"%f",p->uVal.dDouble);
  510. if(strchr(sBuf,'.')) {
  511.     /* Strip Trailing zeros, if decpt
  512.      */
  513.     iLen = iStrLen(sBuf);
  514.     while( sBuf[--iLen] == '0')
  515. sBuf[iLen]=0;
  516.     if(sBuf[iLen] == '.')
  517. sBuf[iLen]=0;
  518. }
  519. return(DupBuf(sBuf));
  520. case eListType: return(pNullStr);
  521. case eBoolType: return(ISeTrue(p->uVal.bBool)?"TRUE":"FALSE");
  522. default:
  523.     DebugHTML(__FILE__,__LINE__,0,"ToStr:Unknown Type %d",p->esType);
  524.     }
  525.     return(pNullStr);
  526. }
  527. static eBoolean_t
  528. aToBool(char *p)
  529. {
  530.     if(is_casematch(p,"FALSE")) return(eFalse);
  531.     if(is_casematch(p,"TRUE") )  return(eTrue);
  532.     return(eTrue);
  533. }
  534. static eBoolean_t
  535. CompareDouble(int iOp,double dLeft,double dRight)
  536. {
  537.     switch(iOp){
  538. case EQ:  return( (dLeft==dRight)   ?eTrue:eFalse);
  539. case NEQ: return( (!(dLeft==dRight))?eTrue:eFalse);
  540. case GT:  return( (dLeft>dRight)    ?eTrue:eFalse);
  541. case GE:  return( (dLeft>=dRight)   ?eTrue:eFalse);
  542. case LT:  return( (dLeft<dRight)    ?eTrue:eFalse);
  543. case LE:  return( (dLeft<=dRight)   ?eTrue:eFalse);
  544.     }
  545.     DebugHTML(__FILE__,__LINE__,0,"WARN:COMPARE DBL:Unknown OP:%d",iOp);
  546.     return(eFalse);
  547. }
  548. static eBoolean_t
  549. CompareString(int iOp,char *pLeft,char *pRight)
  550. {
  551.     DebugHTML(__FILE__,__LINE__,2,"COMPARE STR:%s %d %s",pLeft,iOp,pRight);
  552.     switch(iOp){
  553. case EQ:  return(is_match(pLeft,pRight)   ?eTrue:eFalse);
  554. case NEQ: return(!(is_match(pLeft,pRight))?eTrue:eFalse);
  555. case GT:  return((iStrCmp(pLeft,pRight)>0)    ?eTrue:eFalse);
  556. case GE:  return((iStrCmp(pLeft,pRight)>=0)   ?eTrue:eFalse);
  557. case LT:  return((iStrCmp(pLeft,pRight)<0)    ?eTrue:eFalse);
  558. case LE:  return((iStrCmp(pLeft,pRight)<=0)   ?eTrue:eFalse);
  559.     }
  560.     DebugHTML(__FILE__,__LINE__,0,"WARN:COMPARE STR:Unknown OP:%d",iOp);
  561.     MsgPush("WARN:COMPARE STR:Unknown OP:%d",iOp);
  562.     return(eFalse);
  563. }
  564. static eBoolean_t
  565. IsNumber(Scalar_t *p)
  566. {
  567.     if(!p){
  568. DebugHTML(__FILE__,__LINE__,0,"IsNumber:Scalar is NULL");
  569. MsgPush("IsNumber:Scalar is NULL");
  570. return(eFalse);
  571.     }
  572.     if(p->esType==eDoubleType || p->esType==eIntType)
  573. return(eTrue);
  574.     return(eFalse);
  575. }
  576. Scalar_t *
  577. ScalarUpper(Scalar_t *pList)
  578. {
  579.     Scalar_t *pTop;
  580.     char sBuf[MAX_BUFSIZ];
  581.     DebugHTML(__FILE__,__LINE__,3,"Called Upper(%x)",pList);
  582.     if(!pList){
  583. DebugHTML(__FILE__,__LINE__,0,"ScalarUpper:Scalar is NULL(%x)",pList);
  584. MsgPush("ScalarUpper:Scalar is NULL");
  585. return(&gsNullScalar);
  586.     }
  587.     if(pList->esType != eListType) {
  588. DebugHTML(__FILE__,__LINE__,0,"WARN:UPPER:Invalid arg type passed to Function");
  589. return(&gsNullScalar);
  590.     }
  591.     sBuf[0]=0;
  592.     while( (pTop = (Scalar_t *)DEQ(pList->uVal.pList)) ) {
  593. char *pTmp = ScalarToString(pTop);
  594. strcat(sBuf,pTmp);
  595.     }
  596.     ToUpper(sBuf);
  597.     return(MkScalar(eStringType,sBuf,1+iStrLen(sBuf)));
  598. }
  599. Scalar_t *
  600. ScalarLower(Scalar_t *pList)
  601. {
  602.     Scalar_t *pTop;
  603.     char sBuf[MAX_BUFSIZ];
  604.     if(!pList) {
  605. DebugHTML(__FILE__,__LINE__,0,"ScalarLower:Scalar is NULL(%x)",pList);
  606. MsgPush("ScalarLower:Scalar is NULL");
  607. return(&gsNullScalar);
  608.     }
  609.     if(pList->esType != eListType) {
  610. DebugHTML(__FILE__,__LINE__,0,"WARN:LOWER:Invalid arg type passed to Function");
  611. return(&gsNullScalar);
  612.     }
  613.     sBuf[0]=0;
  614.     while( (pTop = (Scalar_t *)DEQ(pList->uVal.pList)) ) {
  615. char *pTmp = ScalarToString(pTop);
  616. strcat(sBuf,pTmp);
  617.     }
  618.     ToLower(sBuf);
  619.     return(MkScalar(eStringType,sBuf,1+iStrLen(sBuf)));
  620. }
  621. Scalar_t *
  622. ScalarSubstr(Scalar_t *pList)
  623. {
  624.     char *pTmp;
  625.     int iSize,iOffset,iLength;
  626.     Scalar_t *pString = 0
  627.     ,*pOffset = 0
  628.     ,*pLength = 0
  629. ;
  630.     if(!pList){
  631. DebugHTML(__FILE__,__LINE__,0,"ScalarSubstr:Scalar is NULL(%x)",pList);
  632. MsgPush("ScalarSubstr:Scalar is NULL");
  633. return(&gsNullScalar);
  634.     }
  635.     iSize = l_size(pList->uVal.pList);
  636.     if(iSize==2){
  637. pString=(Scalar_t *)DEQ(pList->uVal.pList);
  638. pOffset=(Scalar_t *)DEQ(pList->uVal.pList);
  639. pTmp   = ScalarToString(pString);
  640. iOffset= (int)ScalarToDouble(pOffset);
  641. if(iOffset<iStrLen(pTmp)) {
  642.     pString->esType = eStringType;
  643.     pString->uVal.pString = (pTmp+iOffset);
  644.     pString->lSize = 1+iStrLen(pString->uVal.pString);
  645.     return(pString);
  646. }
  647.     } else if (iSize==3) {
  648. pString=(Scalar_t *)DEQ(pList->uVal.pList);
  649. pOffset=(Scalar_t *)DEQ(pList->uVal.pList);
  650. pLength=(Scalar_t *)DEQ(pList->uVal.pList);
  651. pTmp   = ScalarToString(pString);
  652. iOffset= (int)ScalarToDouble(pOffset);
  653. iLength= (int)ScalarToDouble(pLength);
  654. /* Reusing iSize as length of first arg */
  655. iSize = iStrLen(pTmp);
  656. if(iOffset<iSize) {
  657.     pString->uVal.pString = (pTmp + iOffset);
  658.     if((iOffset+iLength) <iSize)
  659. *(pTmp + iOffset + iLength) = 0;
  660.     pString->esType = eStringType;
  661.     pString->lSize = 1+iStrLen(pString->uVal.pString);
  662.     return(pString);
  663. }
  664.     } else {
  665. DebugHTML(__FILE__,__LINE__,0,"WARN:SUBSTR:Invalid args to Substr");
  666.     }
  667.     return(&gsNullScalar);
  668. }
  669. Scalar_t *
  670. ScalarLength(Scalar_t *pList)
  671. {
  672.     Scalar_t *pTop;
  673.     int iLen=0, lLen=0;
  674.     char sLenBuf[MAX_INTEGER_DIGITS];
  675.     if(!pList){
  676. DebugHTML(__FILE__,__LINE__,0,"ScalarLength:Scalar is NULL(%x)",pList);
  677. MsgPush("ScalarLength:Scalar is NULL");
  678. return(&gsNullScalar);
  679.     }
  680.     if(pList->esType != eListType) {
  681. DebugHTML(__FILE__,__LINE__,0
  682.  ,"WARN:LENGTH:Invalid arg type passed to Function"
  683.  );
  684. return(&gsNullScalar);
  685.     }
  686.     iLen=0, lLen=0;
  687.     while( (pTop = (Scalar_t *)DEQ(pList->uVal.pList)) ) {
  688. /* char *pTmp = ScalarToString(pTop);
  689. /* iLen += iStrLen(pTmp);
  690.  */
  691. lLen += (pTop->lSize>0)?(pTop->lSize) -1:0;
  692. /* DebugHTML(__FILE__,__LINE__,0,"lSize=%d",lLen);
  693.  */
  694.     }
  695.     sprintf(sLenBuf,"%d",lLen);
  696.     return(MkScalar(eDoubleType, sLenBuf,1+iStrLen(sLenBuf)));
  697. }
  698. Scalar_t *
  699. ScalarNVL(Scalar_t *pList)
  700. {
  701.     Scalar_t *pTop;
  702.     DebugHTML(__FILE__,__LINE__,3,"Called NVL");
  703.     if(!pList){
  704. DebugHTML(__FILE__,__LINE__,0,"ScalarNVL:Scalar is NULL(%x)",pList);
  705. MsgPush("ScalarNVL:Scalar is NULL");
  706. return(&gsNullScalar);
  707.     }
  708.     pTop = (Scalar_t *)DEQ(pList->uVal.pList);
  709.     if(IsNullCond(pTop)) {
  710. DebugHTML(__FILE__,__LINE__,2,"NVL:NULL Condition");
  711. return((Scalar_t *)DEQ(pList->uVal.pList));
  712.     }
  713.     DebugHTML(__FILE__,__LINE__,2,"NVL:NOT NULL Condition");
  714.     return(pTop);
  715. }
  716. Scalar_t *
  717. ScalarHost(Scalar_t *pList)
  718. {
  719.     Scalar_t *pTop;
  720.     char sBuf[MAX_BUFSIZ];
  721.     int c, iCharCount, iStatus;
  722.     FILE *pF;
  723. #ifdef WIN32
  724.     MsgPush("SQLweb/NT: Doesn't Support HOST");
  725.     return(&gsNullScalar);
  726. #endif
  727. #ifndef WIN32
  728.     {
  729.     DebugHTML(__FILE__,__LINE__,3,"Called Host");
  730.     if(!pList){
  731. DebugHTML(__FILE__,__LINE__,0,"ScalarHost:Scalar is NULL(%x)",pList);
  732. MsgPush("ScalarHost:Scalar is NULL");
  733. return(&gsNullScalar);
  734.     }
  735.     sBuf[0]=0;
  736.     while( (pTop = (Scalar_t *)DEQ(pList->uVal.pList)) ) {
  737. char *pTmp = ScalarToString(pTop);
  738. strcat(sBuf,pTmp);
  739.     }
  740.     DebugHTML(__FILE__,__LINE__,2,"Running: `%s`",sBuf);
  741.     pF = popen(sBuf,"r");
  742.     if(!pF){
  743. DebugHTML(__FILE__,__LINE__,0,"POpen Failed: (%s)",sBuf);
  744. MsgPush("Host:Can't popen(%s,"r")", sBuf);
  745. return(&gsNullScalar);
  746.     }
  747.     DebugHTML(__FILE__,__LINE__,3,"Open'd(%x)",pF);
  748.     for( c=fgetc(pF), iCharCount=0
  749. ;c != EOF && iCharCount<MAX_BUFSIZ
  750. ;c=fgetc(pF), iCharCount++ )
  751.     {
  752. sBuf[iCharCount] = c;
  753.     }
  754.     /*
  755.     /* NULL the string...
  756.      */
  757.     if(iCharCount && sBuf[iCharCount-1]=='n')
  758.  sBuf[iCharCount-1]=0;
  759.     else sBuf[iCharCount] = 0;
  760.     DebugHTML(__FILE__,__LINE__,3,"Read %d chars",iCharCount);
  761.     iStatus = pclose(pF);
  762.     DebugHTML(__FILE__,__LINE__,3,"popen:%d:%d",iStatus,c);
  763.     return(MkScalar(eStringType, sBuf,1+iStrLen(sBuf)));
  764.     }
  765. #endif
  766. }
  767. Scalar_t *
  768. ScalarSaveFile(Scalar_t *pList)
  769. {
  770.     Scalar_t *pScalarFileName
  771.     ,*pScalarData
  772.     ;
  773.     char *pFileName;
  774.     long lSize;
  775.     int iListSize;
  776.     FILE *pF;
  777.     DebugHTML(__FILE__,__LINE__,3,"Called SaveFile");
  778.     if(!pList){
  779. DebugHTML(__FILE__,__LINE__,0,"SaveFile:Scalar is NULL(%x)",pList);
  780. MsgPush("ScalarSaveFile:Scalar is NULL");
  781. return(&gsNullScalar);
  782.     }
  783.     /*
  784.     /* Check number of parameters (the USAGE)
  785.      */
  786.     iListSize = l_size(pList->uVal.pList);
  787.     if(iListSize != 2) {
  788. DebugHTML(__FILE__,__LINE__,0
  789.  ,"WARN:SAVEFILE:USAGE:SaveFile(filename,data)"
  790.  );
  791. MsgPush("ScalarSaveFile:Scalar is NULL");
  792. return(&gsNullScalar);
  793.     }
  794.     /*
  795.     /* Get Filename 
  796.      */
  797.     pScalarFileName = (Scalar_t *)DEQ(pList->uVal.pList);
  798.     pScalarData = (Scalar_t *)DEQ(pList->uVal.pList);
  799.     pFileName = ScalarToString(pScalarFileName);
  800.     pF=fopen(pFileName,"w");
  801.     if(!pF){
  802. DebugHTML(__FILE__,__LINE__,0,"SaveFile:Open Failed:%d",errno);
  803. MsgPush("ScalarSaveFile:Open Failed");
  804. return(&gsNullScalar);
  805.     }
  806.     lSize = pScalarData->lSize;
  807.     lSize = fwrite(pScalarData->uVal.pString,lSize,1,pF);
  808.     fclose(pF);
  809.     pScalarFileName->esType = eBoolType;
  810.     pScalarFileName->uVal.bBool = lSize==1?eTrue:eFalse;
  811.     pScalarFileName->lSize = 0;
  812.     return(pScalarFileName);
  813. }
  814. Scalar_t *
  815. ScalarToChar(Scalar_t *pList)
  816. {
  817.     char *pFmtStr
  818.  ,*pInpStr
  819.  ,sBuf[BUFSIZ]
  820.  ;
  821.     int iSize;
  822.     Scalar_t *pInput = 0
  823.     ,*pFormat = 0
  824. ;
  825.     if(!pList){
  826. DebugHTML(__FILE__,__LINE__,0,"ScalarToChar:Scalar is NULL(%x)",pList);
  827. MsgPush("ScalarToChar:Scalar is NULL");
  828. return(&gsNullScalar);
  829.     }
  830.     iSize = l_size(pList->uVal.pList);
  831.     if(iSize!=2){
  832. DebugHTML(__FILE__,__LINE__,0,"WARN:TO_CHAR:usage error:to_char(input,fmt)");
  833. return(&gsNullScalar);
  834.     }
  835.     /* Get the Parameters
  836.      */
  837.     pInput =(Scalar_t *)DEQ(pList->uVal.pList);
  838.     pFormat=(Scalar_t *)DEQ(pList->uVal.pList);
  839.     /* Convert Each Parameter to a string
  840.      */
  841.     pInpStr= ScalarToString(pInput);
  842.     pFmtStr= ScalarToString(pFormat);
  843.     /*
  844.     /* Convert input string using format mask
  845.      */
  846.     FormatString(pInpStr,pFmtStr,sBuf);
  847.     return(MkScalar(eStringType, sBuf,1+iStrLen(sBuf)));
  848. }
  849. Scalar_t *
  850. ScalarToNumber(Scalar_t *pList)
  851. {
  852.     int  iDotFlag = 0
  853. ,iDigFlag = 0;
  854.     Scalar_t *pScalar;
  855.     char *pInStr;
  856.     char sBuf[MAX_BUFSIZ], *psBuf=sBuf;
  857.     /* fprintf(stderr,"ToNumber(!)n");fflush(stderr);
  858.      */
  859.     if(!pList){
  860. DebugHTML(__FILE__,__LINE__,0,"ScalarToNumber:Scalar is NULL(%x)",pList);
  861. MsgPush("ScalarToNumber:Scalar is NULL");
  862. return(&gsNullScalar);
  863.     }
  864.     pScalar = DEQ(pList->uVal.pList);
  865.     pInStr = ScalarToString(pScalar);
  866.     for( ; *pInStr; pInStr++) {
  867. switch(*pInStr){
  868.     case '-' : 
  869. if(iDigFlag) break;
  870.     case '.' : 
  871. if(iDotFlag) break;
  872. iDotFlag=1;
  873.     case '0' :
  874.     case '1' :
  875.     case '2' :
  876.     case '3' :
  877.     case '4' :
  878.     case '5' :
  879.     case '6' :
  880.     case '7' :
  881.     case '8' :
  882.     case '9' :
  883. iDigFlag=1;
  884. *psBuf++ = *pInStr;
  885. break;
  886. } /* end of switch */
  887.     } /* end of for */
  888.     *psBuf = '';
  889.     /* fprintf(stderr,"ToNumber(%s)n",sBuf);fflush(stderr);
  890.      */
  891.     return(MkScalar(eStringType,sBuf,1+iStrLen(sBuf)));
  892. }
  893. Scalar_t *
  894. ScalarLPad(Scalar_t *pList)
  895. {
  896.     int  iSize
  897. ,iPadSize
  898. ;
  899.     Scalar_t   *pSource
  900. ,*pSize
  901. ,*pChar
  902. ;
  903.     char  *pStrSource
  904. ,*pStrChar = " "
  905. ,sBuf[MAX_BUFSIZ]
  906. ;
  907.     /* fprintf(stderr,"LPad(!)n");fflush(stderr);
  908.      */
  909.     if(!pList){
  910. DebugHTML(__FILE__,__LINE__,0,"ScalarLPad:Scalar is NULL(%x)",pList);
  911. MsgPush("ScalarLPad:Scalar is NULL");
  912. return(&gsNullScalar);
  913.     }
  914.     iSize = l_size(pList->uVal.pList);
  915.     if(iSize != 2 && iSize !=3) {
  916. DebugHTML(__FILE__,__LINE__,0,"WARN:LPAD:USAGE:LPad(input,size[,padchar])");
  917. return(&gsNullScalar);
  918.     }
  919.     pSource = DEQ(pList->uVal.pList);
  920.     pSize   = DEQ(pList->uVal.pList);
  921.     if(iSize == 3) {
  922. pChar = DEQ(pList->uVal.pList);
  923.     }
  924.     pStrSource = ScalarToString(pSource);
  925.     iPadSize = (int)ScalarToDouble(pSize);
  926.     pStrChar = ScalarToString(pChar);
  927.     if(iPadSize >= MAX_BUFSIZ) {
  928. DebugHTML(__FILE__,__LINE__,0
  929. ,"WARN:LPAD:overflow, truncated to %d",MAX_BUFSIZ);
  930. iPadSize = MAX_BUFSIZ -1;
  931.     }
  932.     memset(sBuf, *pStrChar, iPadSize);
  933.     sBuf[iPadSize] = 0;
  934.     strcpy(&sBuf[iPadSize-iStrLen(pStrSource)],pStrSource);
  935.     return(MkScalar(eStringType,sBuf,1+iStrLen(sBuf)));
  936. }
  937. Scalar_t *
  938. ScalarRPad(Scalar_t *pList)
  939. {
  940.     int  iSize
  941. ,iPadSize
  942. ;
  943.     Scalar_t   *pSource
  944. ,*pSize
  945. ,*pChar
  946. ;
  947.     char  *pStrSource
  948. ,*pStrChar = " "
  949. ,sBuf[MAX_BUFSIZ]
  950. ;
  951.     /* fprintf(stderr,"RPad(!)n");fflush(stderr);
  952.      */
  953.     if(!pList){
  954. DebugHTML(__FILE__,__LINE__,0,"ScalarRPad:Scalar is NULL(%x)",pList);
  955. MsgPush("ScalarRPad:Scalar is NULL");
  956. return(&gsNullScalar);
  957.     }
  958.     iSize = l_size(pList->uVal.pList);
  959.     if(iSize != 2 && iSize !=3) {
  960. DebugHTML(__FILE__,__LINE__,0,"WARN:RPAD:USAGE:RPad(input,size[,padchar])");
  961. return(&gsNullScalar);
  962.     }
  963.     pSource = DEQ(pList->uVal.pList);
  964.     pSize   = DEQ(pList->uVal.pList);
  965.     if(iSize == 3) {
  966. pChar = DEQ(pList->uVal.pList);
  967.     }
  968.     pStrSource = ScalarToString(pSource);
  969.     iPadSize = (int)ScalarToDouble(pSize);
  970.     pStrChar = ScalarToString(pChar);
  971.     if(iPadSize >= MAX_BUFSIZ) {
  972. DebugHTML(__FILE__,__LINE__,0
  973. ,"WARN:RPAD:overflow, truncated to %d",MAX_BUFSIZ);
  974. iPadSize = MAX_BUFSIZ -1;
  975.     }
  976.     memset(sBuf, *pStrChar, iPadSize);
  977.     sBuf[iPadSize] = 0;
  978.     strncpy(sBuf,pStrSource,iStrLen(pStrSource));
  979.     return(MkScalar(eStringType, sBuf,1+iStrLen(sBuf)));
  980. }
  981. Scalar_t *
  982. ScalarLTrim(Scalar_t *pList)
  983. {
  984.     int  iSize
  985. ;
  986.     Scalar_t   *pSource
  987. ,*pChar
  988. ;
  989.     char  *pStrSource
  990. ,*pStrChar = " "
  991. ,sBuf[MAX_BUFSIZ]
  992. ;
  993.     if(!pList){
  994. DebugHTML(__FILE__,__LINE__,0,"ScalarTrim:Scalar is NULL(%x)",pList);
  995. MsgPush("ScalarLTrim:Scalar is NULL");
  996. return(&gsNullScalar);
  997.     }
  998.     iSize = l_size(pList->uVal.pList);
  999.     if(iSize != 1 && iSize !=2) {
  1000. DebugHTML(__FILE__,__LINE__,0,"WARN:LTRIM:USAGE:LTrim(input[,trimchar])");
  1001. return(&gsNullScalar);
  1002.     }
  1003.     /*
  1004.     /* Get String version of Variable
  1005.      */
  1006.     pSource = DEQ(pList->uVal.pList);
  1007.     pStrSource = ScalarToString(pSource);
  1008.     /*
  1009.     /* Now Get The "Trimoff Char"
  1010.      */
  1011.     if(iSize == 2) {
  1012. pChar = DEQ(pList->uVal.pList);
  1013. pStrChar = ScalarToString(pChar);
  1014.     }
  1015.     while(*pStrSource == *pStrChar)
  1016. pStrSource++;
  1017.     if(*pStrSource)
  1018.  strcpy(sBuf,pStrSource);
  1019.     else sBuf[0] = 0;
  1020.     return(MkScalar(eStringType, sBuf,1+iStrLen(sBuf)));
  1021. }
  1022. Scalar_t *
  1023. ScalarRTrim(Scalar_t *pList)
  1024. {
  1025.     int  iSize
  1026. ;
  1027.     Scalar_t   *pSource
  1028. ,*pChar
  1029. ;
  1030.     char  *pStrSource
  1031. ,*pStrChar = " "
  1032. ;
  1033.     if(!pList){
  1034. DebugHTML(__FILE__,__LINE__,0,"ScalarRTrim:Scalar is NULL(%x)",pList);
  1035. MsgPush("ScalarRTrim:Scalar is NULL");
  1036. return(&gsNullScalar);
  1037.     }
  1038.     iSize = l_size(pList->uVal.pList);
  1039.     if(iSize != 1 && iSize !=2) {
  1040. DebugHTML(__FILE__,__LINE__,0,"WARN:RTRIM:USAGE:RTrim(input[,padchar])");
  1041. return(&gsNullScalar);
  1042.     }
  1043.     pSource = DEQ(pList->uVal.pList);
  1044.     pStrSource = ScalarToString(pSource);
  1045.     if(iSize == 2) {
  1046. pChar = DEQ(pList->uVal.pList);
  1047. pStrChar = ScalarToString(pChar);
  1048.     }
  1049.     iSize = iStrLen(pStrSource);
  1050.     while( *(pStrSource+ (--iSize)) == *pStrChar)
  1051. ; /* nothing */
  1052.     *(pStrSource + iSize +1) = 0;
  1053.     return(MkScalar(eStringType, pStrSource,1+iStrLen(pStrSource)));
  1054. }
  1055. static void
  1056. ToUpper(char *pBuf)
  1057. {
  1058.     int c;
  1059.     for(c= *pBuf;c;c = *++pBuf)
  1060. *pBuf=(char)toupper(c);
  1061.     return;
  1062. }
  1063. static void
  1064. ToLower(char *pBuf)
  1065. {
  1066.     int c;
  1067.     for(c = *pBuf;c; c= *++pBuf)
  1068. *pBuf = (char)tolower(c);
  1069.     return;
  1070. }
  1071. static void
  1072. FormatString(char *pInpStr,char *pFmtStr,char *pOutBuf)
  1073. {
  1074.     char *pInDecPt
  1075. ,*pFmtDecPt
  1076. ;
  1077.     int  iInDecSize
  1078. ,iFmtPrecision
  1079. ,iNewDecSize
  1080. ,iNewBufSize
  1081. ,iCommaFlag
  1082. ,i
  1083. ;
  1084.     DebugHTML(__FILE__,__LINE__,3,"FormatString(%s,%s,buf)",pInpStr,pFmtStr);
  1085.     pInDecPt = (char *)strchr(pInpStr,'.');
  1086.     pFmtDecPt= (char *)strchr(pFmtStr,'.');
  1087.     iInDecSize   = (pInDecPt) ? pInDecPt - pInpStr : iStrLen(pInpStr);
  1088.     iFmtPrecision= (pFmtDecPt)? iStrLen(pFmtDecPt+1) : 0;
  1089.     iCommaFlag =  (strchr(pFmtStr,',')) ? 1 : 0;
  1090.     iNewDecSize= (iCommaFlag)
  1091. ? (iInDecSize + ((iInDecSize-1)/3)) /* Fmt str has commas */
  1092. : iInDecSize     /* Fmt str NO commas  */
  1093. ;
  1094.     iNewBufSize= iNewDecSize + ((iFmtPrecision>0)?1:0) + iFmtPrecision;
  1095. /*    fprintf(stderr,"NSiz=%d (%d + %d + %d) (fmtprec=%s)n"
  1096. /*      , iNewBufSize
  1097. /*      , iNewDecSize
  1098. /*      , ((iFmtPrecision>0)?1:0) 
  1099. /*      , iFmtPrecision
  1100. /*      , pFmtDecPt+1
  1101. /*      );
  1102. /*    fflush(stderr);
  1103.  */
  1104.     for(i=0;i<iNewBufSize;i++) {
  1105. /* Place Decimal point when not included in pInpStr
  1106.  */
  1107. if(i==iNewDecSize && !pInDecPt) {
  1108.     *pOutBuf++ = '.';
  1109. }
  1110. /* if a comma goes here
  1111.  */
  1112. else if(iCommaFlag /* format string has comma */
  1113.     && i>0 /* no leading comma */
  1114.     && iNewDecSize-i>0 /* no comma after decpt */
  1115.     && ((iNewDecSize-i)%4)==0) /* comma position */
  1116. {
  1117.     *pOutBuf++ = ','; /* Insert Comma */
  1118. }else {
  1119.     *pOutBuf++ = (*pInpStr) ?*pInpStr++ : '0';
  1120. }
  1121.     }
  1122.     *pOutBuf = 0;
  1123.     return;
  1124. }
  1125. extern eBoolean_t
  1126. AssignCond(Scalar_t *pScalarName
  1127.   ,Scalar_t *pScalarValue
  1128.   )
  1129. {
  1130.     char *pValue
  1131. ,*pName
  1132. ;
  1133.     if(!pScalarName) {
  1134. DebugHTML(__FILE__,__LINE__,0 ,"WARN:ASSIGN:No Symbol Name");
  1135. MsgPush("WARN:ASSIGN:No Symbol Name");
  1136. return(eFalse);
  1137.     }
  1138.     pName=pScalarName->pName? pScalarName->pName: ScalarToString(pScalarName);
  1139.     DebugHTML(__FILE__,__LINE__,2,"AssignCond(%s)",pName); 
  1140.     if(!pScalarValue) {
  1141. DebugHTML(__FILE__,__LINE__,0
  1142.  ,"WARN:ASSIGN:No Symbol Value for %s"
  1143.  ,pName
  1144.  );
  1145. /* return(eFalse);
  1146.  */
  1147. pValue = "";
  1148.     } else {
  1149. pValue = ScalarToString(pScalarValue); /* Determine Value */
  1150.     }
  1151.     SELSym(pName,pValue);
  1152.     DebugHTML(__FILE__,__LINE__,2,"AssignCond:Completed");
  1153.     return(eTrue);
  1154. }
  1155. extern Scalar_t *
  1156. ScalarGetSym(Scalar_t *pScalar
  1157.     ,char *pRule
  1158. )
  1159. {
  1160.     char *pBuf, *pName;
  1161.     Scalar_t *pNewScalar;
  1162.     long lSize;
  1163.     if(!pScalar){
  1164. DebugHTML(__FILE__,__LINE__,0,"ScalarGetSym:%s:Scalar is NULL",pRule);
  1165. MsgPush("ScalarGetSym:%s:Scalar is NULL",pRule);
  1166. return(pScalar);
  1167.     }
  1168.     pName =  pScalar->pName? pScalar->pName: ScalarToString(pScalar);
  1169.     if(!pName || iStrLen(pName)==0) {
  1170. DebugHTML(__FILE__,__LINE__,0,"ScalarGetSym:No Name");
  1171. return(pScalar);
  1172.     }
  1173.     (void)GetRawSymbolValueREF(pName,&pBuf,&lSize);
  1174.     DebugHTML(__FILE__,__LINE__,2,"ScalarGetSym(%s,%s):%s:%d"
  1175.     ,pName
  1176.     ,pBuf?pBuf:""
  1177.     ,pRule
  1178.     ,lSize
  1179.     );
  1180.     pNewScalar = MkScalar(eStringType,pBuf,lSize);
  1181.     pNewScalar->pName = DupBuf(pName);
  1182.     return(pNewScalar);
  1183. }
  1184. Scalar_t *
  1185. ScalarGetSymARR(Scalar_t *pScalar,Scalar_t *pArrayOffset)
  1186. {
  1187.     char *pBuf, *pName;
  1188.     int iOffset;
  1189.     Scalar_t *pNewScalar;
  1190.     if(!pScalar || !pArrayOffset){
  1191. DebugHTML(__FILE__,__LINE__,0,"ScalarARRGetSym(%x,%x):Scalar is NULL"
  1192. ,pScalar
  1193. ,pArrayOffset
  1194. );
  1195. MsgPush("ScalarARRGetSym:Scalar is NULL");
  1196. return(pScalar);
  1197.     }
  1198.     pName =  pScalar->pName? pScalar->pName: ScalarToString(pScalar);
  1199.     if(!pName || iStrLen(pName)==0) {
  1200. DebugHTML(__FILE__,__LINE__,0,"ScalarGetSym:No Name");
  1201. return(pScalar);
  1202.     }
  1203.     iOffset = (int)ScalarToDouble(pArrayOffset);
  1204.     DebugHTML(__FILE__,__LINE__,2,"ScalarGetSym(%s,%d):%s",pName,iOffset); 
  1205.     (void)GetARRSymbolValueREF(pName,iOffset,&pBuf);
  1206.     pNewScalar = MkScalar(eStringType,pBuf,1+iStrLen(pBuf));
  1207.     pNewScalar->pName = DupBuf(pName);
  1208.     return(pNewScalar);
  1209. }
  1210. Scalar_t *
  1211. ScalarGetCookieValue(Scalar_t *pList)
  1212. {
  1213.     int iListSize;
  1214.     long lSize;
  1215.     char *pName, *pBuf;
  1216.     Scalar_t *pCookieName;
  1217.     DebugHTML(__FILE__,__LINE__,3,"Called GetCookieValue()");
  1218.     if(!pList){
  1219. DebugHTML(__FILE__,__LINE__,0,"GetCookieValue:Scalar is NULL(0)");
  1220. MsgPush("GetCookieValue:Scalar is NULL");
  1221. return(&gsNullScalar);
  1222.     }
  1223.     /* Check number of parameters (the USAGE)
  1224.      */
  1225.     iListSize = l_size(pList->uVal.pList);
  1226.     if(iListSize != 1) {
  1227. DebugHTML(__FILE__,__LINE__,0
  1228.  ,"WARN:GetCookieValue:USAGE:GetCookieValue(CookieName)"
  1229.  );
  1230. return(&gsNullScalar);
  1231.     }
  1232.     /*
  1233.     /* Get CookieName 
  1234.      */
  1235.     pCookieName=(Scalar_t *)DEQ(pList->uVal.pList);
  1236.     pName=ScalarToString(pCookieName);
  1237.     lSize=0L;
  1238.     (void)GetCookieValueREF(pName,&pBuf,&lSize);
  1239.     if(lSize>0){
  1240. return( MkScalar(eStringType,pBuf,1+iStrLen(pBuf)) );
  1241.     }
  1242.     DebugHTML(__FILE__,__LINE__,1 ,"WARN:GetCookie(%s):No HTTP_COOKIE",pName);
  1243.     return(&gsNullScalar);
  1244. }
  1245. Scalar_t *
  1246. ScalarReplace(Scalar_t *pList)
  1247. {
  1248.     char *pStr, *pSrch, *pRepl, *pResult;
  1249.     int iSize;
  1250.     Scalar_t *pString = 0
  1251.     ,*pSearch = 0
  1252.     ,*pReplace = 0
  1253. ;
  1254.     DebugHTML(__FILE__,__LINE__,3,"ScalarReplace()");
  1255.     if(!pList){
  1256. DebugHTML(__FILE__,__LINE__,0,"ScalarReplace:Scalar is NULL(%x)",pList);
  1257. MsgPush("ScalarReplace:Scalar is NULL");
  1258. return(&gsNullScalar);
  1259.     }
  1260.     iSize = l_size(pList->uVal.pList);
  1261.     if(iSize==2){
  1262. pString=(Scalar_t *)DEQ(pList->uVal.pList);
  1263. pSearch=(Scalar_t *)DEQ(pList->uVal.pList);
  1264. pStr   = ScalarToString(pString);
  1265. pSrch  = ScalarToString(pSearch);
  1266.         DebugHTML(__FILE__,__LINE__,2,"ScalarReplace(%s,%s)",pStr,pSrch);
  1267. pResult= Replace( pStr, pSrch, "" );
  1268. pString->esType = eStringType;
  1269. pString->uVal.pString = pResult;
  1270. pString->lSize = iStrLen(pResult);
  1271. return(pString);
  1272.     } else if (iSize==3) {
  1273. pString =(Scalar_t *)DEQ(pList->uVal.pList);
  1274. pSearch =(Scalar_t *)DEQ(pList->uVal.pList);
  1275. pReplace=(Scalar_t *)DEQ(pList->uVal.pList);
  1276. pStr   = ScalarToString(pString);
  1277. pSrch  = ScalarToString(pSearch);
  1278. pRepl  = ScalarToString(pReplace);
  1279.         DebugHTML(__FILE__,__LINE__,2,"ScalarReplace(%s,%s,%s)"
  1280.  ,pStr
  1281.  ,pSrch
  1282.  ,pRepl
  1283.  );
  1284. pResult= Replace( pStr, pSrch, pRepl );
  1285. pString->esType = eStringType;
  1286. pString->uVal.pString = pResult;
  1287. pString->lSize = iStrLen(pResult);
  1288. return(pString);
  1289.     } else {
  1290. DebugHTML(__FILE__,__LINE__,0,"WARN:SUBSTR:Invalid args to Replace");
  1291.     }
  1292.     return(&gsNullScalar);
  1293. }
  1294. static char *
  1295. Replace( char *pBuf, char *pSrch, char *pRepl )
  1296. {
  1297.     char *p, *pE, *po, *pOut;
  1298.     long lOutSize;
  1299.     lOutSize=GetReplaceSize(pBuf,pSrch,pRepl);
  1300. /* Calc size of resultant string */
  1301.     po=pOut=(char*)malloc(lOutSize+1);
  1302. /* Get storage */
  1303.     (void)memset(pOut,0,lOutSize);
  1304. /* just in case ... cleanup space */
  1305.     for(pE=pBuf,p=strstr(pBuf,pSrch); p; p=strstr(pE,pSrch)) {
  1306. while(pE<p)
  1307.     *po++ = *pE++; /* copy characters not being replaced */
  1308. strcpy(po,pRepl); /* copy replace string */
  1309. pE = p + strlen(pSrch); /* move pointer on input string ahead */
  1310. po = po + strlen(pRepl);/* move pointer on output string ahead */
  1311.     }
  1312.     while(*pE) /* process remaining part of string */
  1313. *po++ = *pE++; /* copy characters */
  1314.     *po=0; /* don't forget the all important NULL */
  1315.     return( pOut ); /* OK, otta here! */
  1316. }
  1317. static long
  1318. GetReplaceSize(char *pBuf, char *pSrch, char *pRepl )
  1319. {
  1320.     char *p, *pE;
  1321.     long lStrCount = 0;
  1322.     for( p=strstr(pBuf,pSrch); p; p=strstr(pE,pSrch)) {
  1323. pE = p + strlen(pSrch);
  1324. pE++;
  1325. lStrCount++; /* Count occurances of "pSrch" */
  1326.     }
  1327.     return (strlen(pBuf)+(lStrCount*(strlen(pRepl)-strlen(pSrch))) );
  1328. /* Calc Size of replaced string */
  1329. }
  1330. Scalar_t *
  1331. ScalarAscii(Scalar_t *pList)
  1332. {
  1333.     char *pStr;
  1334.     Scalar_t *pInt;
  1335.     int iSize, iChar;
  1336.     DebugHTML(__FILE__,__LINE__,3,"ScalarAscii()");
  1337.     if(!pList){
  1338. DebugHTML(__FILE__,__LINE__,0,"ScalarAscii:Scalar is NULL(%x)",pList);
  1339. MsgPush("ScalarAscii:Scalar is NULL");
  1340. return(&gsNullScalar);
  1341.     }
  1342.     iSize = l_size(pList->uVal.pList);
  1343.     if(iSize!=1){
  1344. DebugHTML(__FILE__,__LINE__,0,"WARN:Invalid args to Ascii");
  1345. return(&gsNullScalar);
  1346.     }
  1347.     pInt=(Scalar_t *)DEQ(pList->uVal.pList);
  1348.     pStr=ScalarToString(pInt);
  1349.     DebugHTML(__FILE__,__LINE__,2,"ScalarAscii(%s)",pStr);
  1350.     iChar = (int) *pStr;
  1351.     pInt->esType = eIntType;
  1352.     pInt->uVal.iInt = iChar;
  1353.     pInt->lSize = 1;
  1354.     return(pInt);
  1355. }
  1356. Scalar_t *
  1357. ScalarCHR(Scalar_t *pList)
  1358. {
  1359.     char *pStr, sChar[2];
  1360.     Scalar_t *pString;
  1361.     int iSize, iChar;
  1362.     DebugHTML(__FILE__,__LINE__,3,"ScalarCHR()");
  1363.     if(!pList){
  1364. DebugHTML(__FILE__,__LINE__,0,"ScalarCHR:Scalar is NULL(%x)",pList);
  1365. MsgPush("ScalarCHR:Scalar is NULL");
  1366. return(&gsNullScalar);
  1367.     }
  1368.     iSize = l_size(pList->uVal.pList);
  1369.     if(iSize!=1){
  1370. DebugHTML(__FILE__,__LINE__,0,"WARN:Invalid args to CHR");
  1371. return(&gsNullScalar);
  1372.     }
  1373.     pString=(Scalar_t *)DEQ(pList->uVal.pList);
  1374.     iChar = (int) ScalarToDouble(pString);
  1375.     DebugHTML(__FILE__,__LINE__,2,"ScalarCHR(%d)",iChar);
  1376.     sChar[0] = (char)iChar;
  1377.     sChar[1] = (char)0;
  1378.     DebugHTML(__FILE__,__LINE__,2,"ScalarCHR(%s,%c)",sChar,iChar);
  1379.     pString->esType = eStringType;
  1380.     pString->uVal.pString = DupBuf(sChar);
  1381.     pString->lSize =iStrLen(sChar);
  1382.     return(pString);
  1383. }