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

Oracle数据库

开发平台:

Unix_Linux

  1. /* swoutput.c - Output routines for SQLweb
  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 <stdio.h>
  13. #include <stdlib.h>
  14. /* #include <sys/types.h>
  15.  */
  16. #include <ctype.h>
  17. #include <string.h>
  18. #include "sqlweb.h"
  19. #include "userexit.h"
  20. /*
  21. /* Internal Functions....
  22.  */
  23. static eBoolean_t LoadPageList(LIST *lPageGenNbrList);
  24. static eBoolean_t CookPage(PAGE *pPage);
  25. static eBoolean_t CookPIA(SYMBOL *pPIA);
  26. static eBoolean_t OutputPage(PAGE *pPage);
  27. static eBoolean_t OutputPI(PI *pPI);
  28. static eBoolean_t OutputPIA(SYMBOL *pPIA);
  29. static eBoolean_t GetPIFieldNameREF(PI *pPI,char **pOutFieldName);
  30. static eBoolean_t GetPIValue(PI *pPI, char *pOutValue);
  31. static eBoolean_t GetPIValueREF(PI *pPI, char **pOutValue);
  32. static eBoolean_t GetPITagType(PI *pPI, char **pOutType);
  33. static eBoolean_t SetPIValue(PI *pPI, char *pValue);
  34. static eBoolean_t SetPIAValue(PI *pPI,char *pName, char *pOutValue);
  35. static void RawOutputHTML(char *p);
  36. static eBoolean_t DumpPI(PI *pPI);
  37. static eBoolean_t DumpPIA(SYMBOL *pPIA);
  38. /*
  39. /* Global Variables used by all modules
  40. /* but owned by this one!
  41.  */
  42. eBoolean_t gbCookFlag;
  43. PAGE *gpPage;
  44. /*
  45. /* Global (local to this file) Variables...
  46.  */
  47. static LIST *galPI[MAX_TAG_LEVELS]
  48.     /* Array for storing the current PI List for
  49.     /*  each scope level
  50.      */
  51.     ;
  52. static PI   *gaPI[MAX_TAG_LEVELS]
  53.     ;
  54. eBoolean_t gbBufferOutput = eFalse;
  55. eBoolean_t
  56. swoutput(PAGE *pPage)
  57. {
  58.     DebugHTML(__FILE__,__LINE__,2,"swoutput(%x,%s)"
  59. ,pPage
  60. ,ISCOOKED ? "TRUE":"FALSE");
  61.     /*
  62.     /* Create the Global PAGE, if necessary,
  63.      */
  64.     /* Use the PAGE passed in
  65.      */
  66.     gpPage = pPage;
  67.     /*
  68.     /* Cook the raw page into something juicy...
  69.      */
  70.     if(ISCOOKED) {
  71. RETeFalse(CookPage(gpPage)
  72.  ,"Failed to expand SQLweb Page"
  73.  );
  74. if(ISeTrue(gbBufferOutput)) {
  75.     /* Time for desert....
  76.      */
  77.     if(giParseLevel==3) {
  78. DumpPage(gpPage);
  79. return(eTrue);
  80.     }
  81.     RETeFalse(OutputPage(gpPage),"OutputPage Failed");
  82. }
  83.     } else {
  84. RETeFalse(OutputPage(gpPage),"OutputPage Failed");
  85.     }
  86.     /* OutputHTML("n");
  87.      */
  88.     FlushHTMLBuf();
  89.     return(eTrue);
  90. }
  91. static eBoolean_t
  92. OutputPage(PAGE *pPage)
  93. {
  94.     DebugHTML(__FILE__,__LINE__,3,"OutputPage(%x)",pPage);
  95.     if(!pPage)
  96. return(eTrue);
  97.     PrintHTMLHeader("text/html");
  98.     return( l_scan(pPage->lPI,(PFI)OutputPI) );
  99. }
  100. static eBoolean_t
  101. OutputPI(PI *pPI)
  102. {
  103.     /* output tag
  104.      */
  105.     if(!pPI)
  106. return(eTrue);
  107.     DebugHTML(__FILE__,__LINE__,6,"OutputPI(%s)",pPI->pTagName);
  108.     if(isNotHidden(pPI)) {
  109. OutputHTML("<%s",pPI->pTagName);
  110. /*
  111. /* output TagAttributes
  112.  */
  113. RETeFalse(l_scan(pPI->lPIA,(PFI)OutputPIA)
  114.  ,"l_scan(PIA) OutputPIA Failed"
  115.  );
  116. /* output end-tag
  117.  */
  118. OutputHTML(">");
  119.     }
  120.     /* output (normal) contents
  121.      */
  122.     if(pPI && pPI->pPiContents && *(pPI->pPiContents)) {
  123.         RawOutputHTML(pPI->pPiContents);
  124.     }
  125.     /* output lPI
  126.      */
  127.     RETeFalse( l_scan(pPI->lPI,(PFI)OutputPI)
  128.      ,"Recursive call failed"
  129.      );
  130.     /*
  131.     /* Output Trailer
  132.      */
  133.     if(!isEmpty(pPI) && isNotHidden(pPI)) {
  134. OutputHTML("</%s>",pPI->pTagName);
  135.     }
  136.     FlushHTMLBuf();
  137.     return(eTrue);
  138. }
  139. static eBoolean_t
  140. CookPIA(SYMBOL *pPIA)
  141. {
  142.     char *pBuf ;
  143.     if(!pPIA)
  144. return(eTrue);
  145.     DebugHTML(__FILE__,__LINE__,5,"CookPIA(%s,%x)",pPIA->pName,pPIA->pValue);
  146.     /* Always expand the NAME= part of each attrib
  147.      */
  148.     RETeFalse2(ExpandString(pPIA->pName,&pBuf)
  149.       ,"ExpandString(%s) Failed"
  150.       ,pPIA->pName
  151.       );
  152.     FreeBuf(pPIA->pName);
  153.     pPIA->pName = pBuf;
  154.     /*
  155.     /* Only expand VALUE part when it's NOT EXPR= or SQL=
  156.     /*  ... because the parser will deal with the : variables
  157.      */
  158.     if( !(is_casematch(pBuf,"EXPR") || is_casematch(pBuf,"SQL"))) {
  159. RETeFalse2(ExpandString(pPIA->pValue,&pBuf)
  160.   ,"ExpandString(%s) Failed"
  161.   ,pPIA->pValue
  162.   );
  163. FreeBuf(pPIA->pValue);
  164. pPIA->pValue = pBuf;
  165.     } else {
  166.     /*
  167.     /* Only remove charcodes from SQL and EXPR attributes
  168.     /*  ... because the parser doesn't deal with the &gt; syntax
  169.      */
  170. RemoveCharCodes(pBuf);
  171.     }
  172.     return(eTrue);
  173. }
  174. static eBoolean_t
  175. OutputPIA(SYMBOL *pPIA)
  176. {
  177.     return ( iPrintHTMLSymbol(pPIA) );
  178. }
  179. static eBoolean_t
  180. CookPage(PAGE *pPage)
  181. {
  182.     if(!pPage)
  183. return(eTrue);
  184.     DebugHTML(__FILE__,__LINE__,3,"CookPage(%x)",pPage);
  185.     return( l_scan(pPage->lPI,(PFI)CookPI) );
  186. }
  187. eBoolean_t
  188. CookPI(PI *pPI)
  189. {
  190.     char *pFieldName
  191.      ,*pValue
  192. ;
  193.     TAG_HANDLE *pTagHandle;
  194.     eBoolean_t bExpr = eTrue;
  195.     if(pPI == NULL){
  196. MsgPush("Internal error: CookPI received NULL");
  197. return(eTrue);
  198. /* return(eFalse);
  199.  */
  200.     }
  201.     DebugHTML(__FILE__,__LINE__,5,"CookPI(%x):%s (line %d)"
  202.      ,pPI
  203.      ,pPI->pTagName
  204.      ,pPI->iLineNbr
  205.      );
  206.     for(pTagHandle= &gaTagHandlers[0]; pTagHandle->pTagName;pTagHandle++){
  207. if(is_casematch(pTagHandle->pTagName,pPI->pTagName)){
  208.     char *pBuf;
  209.     DebugHTML(__FILE__,__LINE__,2,"Handling:%s (line %d)"
  210.      ,pPI->pTagName
  211.      ,pPI->iLineNbr
  212.      );
  213.     /*
  214.     /* AUTOFAIL should be set for backward compatability...
  215.     /* May be set in the "INI" file or in "old" pages
  216.      */
  217.     if(ISeTrue(GetSymbolValueREF("SQLWEB_AUTOFAIL",&pBuf))
  218. && is_casematch("TRUE",pBuf))
  219.     {
  220. RETeFalse3((pTagHandle->fHandler)(pPI,&bExpr)
  221.   ,"Tag Handler Failed:%s (line %d)"
  222.   ,pPI->pTagName
  223.   ,pPI->iLineNbr
  224.   );
  225.     } else if(ISeFalse((pTagHandle->fHandler)(pPI,&bExpr))) {
  226. DebugHTML(__FILE__,__LINE__,0
  227. ,"ERROR: Tag Handler failed on %s (line %d)"
  228. ,pPI->pTagName
  229. ,pPI->iLineNbr
  230. );
  231. SELSym("SQLWEB_CODE","1");
  232. SELSym("SQLWEB_MESSAGE","Handler Failed");
  233. /* return(eFalse);
  234.  */
  235. return(eTrue);
  236.     }
  237.     SELSym("SQLWEB_CODE","0");
  238.     SELSym("SQLWEB_MESSAGE","Normal Successful Completion");
  239.     /* return(eTrue);
  240.      */
  241. }
  242.     }
  243.     if(ISeFalse(bExpr)){
  244. /*
  245.  */
  246. DebugHTML(__FILE__,__LINE__,3 ,"fHandler says FALSE:otta here!");
  247. /* ************************************************************
  248. /* ************************************************************
  249. /* BTW, don't reference pPI now, it has been FREE'd by fHandler
  250.  */
  251. /* if(ISeTrue(gbBufferOutput)) {
  252. /*     pPI->lPI = l_create("QUEUE"); /* Clobber list */
  253. /*     pPI->pPiContents = DupBuf(0); /* Clobber contents */
  254. /* } else {
  255. /*     FreePI(pPI);
  256. /* }
  257.  */
  258. return(eTrue);
  259.     }
  260.     /*
  261.     /* Expand Contents
  262.      */
  263.     RETeFalse2(ExpandContents(pPI)
  264.              ,"ExpandContents(%s) Failed"
  265.              ,pPI->pPiContents
  266.              );
  267.     /*
  268.     /* Expand Attributes....
  269.      */
  270.     RETeFalse(l_scan(pPI->lPIA,(PFI)CookPIA)
  271.      ,"l_scan(PIA) CookPIA Failed"
  272.      );
  273.     /*
  274.     /* Process (INPUT/TEXTAREA)/OPTION Tags
  275.      */
  276.     if((( is_casematch(pPI->pTagName,"INPUT")
  277. ||is_casematch(pPI->pTagName,"TEXTAREA"))
  278.    && (ISeTrue(GetPIFieldNameREF(pPI,&pFieldName)) && *pFieldName)
  279.    && ISeTrue(GetSymbolValueREF(pFieldName,&pValue)))
  280. ||(is_casematch(pPI->pTagName,"OPTION")
  281.    && (ISeTrue(GetPIFieldNameREF(pPI,&pFieldName)) && *pFieldName)
  282.    && ISeTrue(GetPIValueREF(pPI,&pValue))
  283.    && ISeTrue(IsSymbolValue(pFieldName,pValue))))
  284.     {
  285. if(ISeTrue(SetPIValue(pPI,pValue))) {
  286.     DebugHTML(__FILE__,__LINE__,5,"CookPI:SetPIValue(%s)OK",pFieldName);
  287. } else {
  288.     DebugHTML(__FILE__,__LINE__,1
  289.      ,"CookPI:W:SetPIValue(%s) Failed"
  290.      ,pFieldName
  291.      );
  292. }
  293.     }
  294.     if(ISeTrue(gbBufferOutput)){
  295. return(l_scan(pPI->lPI,(PFI)CookPI));
  296.     }
  297.     /********************************************
  298.     /* From here on we are only Non-Buffered Output ...
  299.      */
  300.     /*
  301.     /* Output <TAG and Attributes>
  302.      */
  303.     if(isNotHidden(pPI)) {
  304. OutputHTML("<%s",pPI->pTagName);
  305. RETeFalse(l_scan(pPI->lPIA,(PFI)OutputPIA)
  306.  ,"l_scan(PIA) OutputPIA Failed"
  307.  );
  308. OutputHTML(">");
  309.     }
  310.     /*
  311.     /* Output TAG Contents
  312.      */
  313.     if(pPI && pPI->pPiContents && *(pPI->pPiContents))
  314. RawOutputHTML(pPI->pPiContents);
  315.     /*
  316.     /* COOK and Output Subordinate TAGS, the children
  317.      */
  318.     RETeFalse(l_scan(pPI->lPI,(PFI)CookPI)
  319.      ,"l_scan(pPI->lPI,CookPI) Failed"
  320.      );
  321.     /*
  322.     /* Output the ENDING TAG </TAG>
  323.      */
  324.     if(!isEmpty(pPI) && isNotHidden(pPI)) {
  325. OutputHTML("</%s>",pPI->pTagName);
  326.     }
  327. /*
  328.  */
  329.     FreePI(pPI);
  330.     /* Don't forget to Flush!
  331.      */
  332.     FlushHTMLBuf();
  333.     return(eTrue);
  334. }
  335. static eBoolean_t
  336. GetPIFieldNameREF
  337.     (PI *pPI
  338.     ,char **pOutFieldName
  339.     )
  340. {
  341.     DebugHTML(__FILE__,__LINE__,6,"GetPIFieldNameREF(%x,%s,?)",pPI,pPI->pTagName);
  342.     if(is_casematch(pPI->pTagName,"INPUT")
  343.        || is_casematch(pPI->pTagName,"TEXTAREA")
  344.        || is_casematch(pPI->pTagName,"SELECT"))
  345.     {
  346. if(ISeTrue(GetPIAValueREF(pPI,"NAME",pOutFieldName))) {
  347.     return(eTrue);
  348. }
  349.     }
  350.     else if(is_casematch(pPI->pTagName,"OPTION")){
  351. /* For options, since they are nested below SELECTs must
  352. /* use the PARENT's i.e. pPIContext' Attirb list to determine
  353. /* the NAME
  354. /* DebugHTML(__FILE__,__LINE__,5,"dump Core!(%x,%x)"
  355. /*  ,pPI
  356. /*  ,pPI->pPIContext);
  357. /* FlushHTMLBuf();
  358.  */
  359. PI *pPI2;
  360. for(pPI2=pPI->pPIContext;pPI2;pPI2=pPI2->pPIContext) {
  361.     if(ISeTrue(GetPIAValueREF(pPI2,"NAME",pOutFieldName))){
  362. return(eTrue);
  363.     }
  364. }
  365.     }
  366.     *pOutFieldName=0;
  367.     return(eFalse);
  368. }
  369. /* static eBoolean_t
  370. /* GetPIValue
  371. /*     (PI *pPI
  372. /*     ,char *pOutValue
  373. /*     )
  374. /* {
  375. /*     /* Basically, look for a VALUE attribute
  376. /*      */
  377. /*     DebugHTML(__FILE__,__LINE__,5,"GetPIValue(%s)",pPI->pTagName);
  378. /*     if(ISeTrue(GetPIAValue(pPI,"VALUE",pOutValue))){
  379. /*  /* Got IT! */
  380. /*  return(eTrue);
  381. /*     }
  382. /*     /* Only OPTIONS use the Contents as the backup value holder...
  383. /*      */
  384. /*     if(is_casematch(pPI->pTagName,"OPTION") && pPI->pPiContents){
  385. /*  DebugHTML(__FILE__,__LINE__,6,"GetPIValue(%s)",pPI->pPiContents);
  386. /*  strcpy(pOutValue,pPI->pPiContents);
  387. /*  return(eTrue);
  388. /*     }
  389. /*     
  390. /*     /*
  391. /*     /* Couln't find the value...
  392. /*      */
  393. /*     *pOutValue=0;
  394. /*     return(eFalse);
  395. /* }
  396. /* */
  397. static eBoolean_t
  398. GetPIValueREF
  399.     (PI *pPI
  400.     ,char **pOutValue
  401.     )
  402. {
  403.     /* Basically, look for a VALUE attribute
  404.      */
  405.     DebugHTML(__FILE__,__LINE__,5,"GetPIValueREF(%s)",pPI->pTagName);
  406.     if(ISeTrue(GetPIAValueREF(pPI,"VALUE",pOutValue))){
  407. /* Got IT! */
  408. return(eTrue);
  409.     }
  410.     /* Only OPTIONS use the Contents as the backup value holder...
  411.      */
  412.     if(is_casematch(pPI->pTagName,"OPTION") && pPI->pPiContents){
  413. DebugHTML(__FILE__,__LINE__,6,"GetPIValueREF(%s)",pPI->pPiContents);
  414. (*pOutValue)=pPI->pPiContents;
  415. return(eTrue);
  416.     }
  417.     
  418.     /*
  419.     /* Couln't find the value...
  420.      */
  421.     (*pOutValue)=DupBuf(0);
  422.     return(eFalse);
  423. }
  424. static eBoolean_t
  425. GetPITagType
  426.     (PI *pPI
  427.     ,char **pOutType
  428.     )
  429. {
  430.     if(ISeTrue(GetPIAValueREF(pPI,"TYPE",pOutType))) {
  431. /* Got it! */
  432. return(eTrue);
  433.     }
  434.     /* Default is TEXT
  435.      */
  436.     (*pOutType) = "TEXT";
  437.     return(eTrue);
  438. }
  439. static eBoolean_t
  440. SetPIValue
  441.     (PI *pPI
  442.     ,char *pValue
  443.     )
  444. {
  445.     char *pType
  446. ,*pValue2
  447. ;
  448.     DebugHTML(__FILE__,__LINE__,5,"SetPIValue(%s,%s)",pPI->pTagName,pValue);
  449.     if(is_casematch(pPI->pTagName,"INPUT")) {
  450. RETeFalse(GetPITagType(pPI,&pType)
  451.  ,"GetPITagType failed"
  452.  );
  453. /* TYPE in(TEXT,PASSWORD)
  454. /* set VALUE Attribute to pValue
  455.  */
  456. if(    is_casematch(pType,"TEXT")
  457.     || is_casematch(pType,"PASSWORD")
  458.     || is_casematch(pType,"HIDDEN"))
  459. {
  460.     if(!pValue || !(*pValue)){
  461. /* Delete VALUE Attrib, since it's value is NULL
  462. /* If it works, it works!
  463.  */
  464. SYMBOL *p;
  465. p=l_delete(pPI->lPIA,l_find,iCmpSymbolpName,"VALUE");
  466. if(p){
  467.     FreePIA(p);
  468. }
  469.     } else {
  470. DebugHTML(__FILE__,__LINE__,5,"SettingV(%s,%s)",pType,pValue);
  471. return( SetPIAValue(pPI,"VALUE",pValue));
  472.     }
  473. }
  474. /* TYPE in(CHECKBOX,RADIO)
  475. /* Set CHECKED Attribute
  476.  */
  477. if(is_casematch(pType,"RADIO") || is_casematch(pType,"CHECKBOX")){
  478.     if(ISeFalse(GetPIValueREF(pPI,&pValue2))){
  479. pValue= "on"; /* Value is set to "on" when
  480.      /* there is no VALUE attrib */
  481.     }
  482.     /*
  483.     /* On a MATCH, SET/Create the CHECKED ATTRIBUTE
  484.      */
  485.     if(is_match(pValue2,pValue)){
  486. return( SetPIAValue(pPI,"CHECKED",""));
  487.     /*
  488.     /* No Match -- make sure the CHECKED ATTRIBUTE is Gone!
  489.      */
  490.     } else {
  491. SYMBOL *p;
  492. p=l_delete(pPI->lPIA,l_find,iCmpSymbolpName,"CHECKED");
  493. if(p) {
  494.     FreePIA(p);
  495. }
  496.     }
  497.     return(eTrue);
  498. }
  499.     }
  500.     if(is_casematch(pPI->pTagName,"TEXTAREA")){
  501. while(*pValue == 'n') ++pValue;
  502. /* Mosaic tends to stick leading 'n' is there
  503.  */
  504. FreeBuf(pPI->pPiContents);
  505. pPI->pPiContents = DupBuf(pValue);
  506. return(eTrue);
  507. /* strcpy(pOutValue,pPI->pPiContents);
  508.  */
  509.     }
  510.     /*
  511.     /* OPTION TAG that has a VALUE
  512.      */
  513.     if(is_casematch(pPI->pTagName,"OPTION")
  514. && ISeTrue(GetPIValueREF(pPI,&pValue2)))
  515.     {
  516. /*
  517. /* IF Symbol VALUE Matches this OPTION
  518. /* Set the SELECTED ATTRIBUTE
  519.  */
  520. if( is_match(pValue2,pValue)) {
  521.     if(ISeFalse( SetPIAValue(pPI,"SELECTED",""))){
  522. MsgPush("SetPIAValue failed on OPTION");
  523. return(eFalse);
  524.     } else {
  525. DebugHTML(__FILE__,__LINE__,5,"Set OPTION:%s",pValue);
  526. return(eTrue);
  527.     }
  528. /*
  529. /* IF the VALUES Don't match make sure the 
  530. /* SELECTED ATTRIBUTE is DELETED
  531.  */
  532. } else {
  533.     SYMBOL *p;
  534.     /* If they don't match, erase the SELECTED attribute 
  535.      */
  536.     p=l_delete(pPI->lPIA,l_find,iCmpSymbolpName,"SELECTED");
  537.     if(p){
  538. FreePIA(p);
  539.     }
  540. }
  541.     }
  542.     return(eTrue);
  543. }
  544. /* eBoolean_t
  545. /* GetPIAValue
  546. /*     (PI *pPI
  547. /*     ,char *pName
  548. /*     ,char *pOutValue
  549. /*     )
  550. /* {
  551. /*     SYMBOL *pSym;
  552. /*     DebugHTML(__FILE__,__LINE__,5,"GetPIAValue(%x,%s,...)",pPI,pName);
  553. /* 
  554. /*     if(!pPI) {
  555. /*  *pOutValue=0;
  556. /*  return(eFalse);
  557. /*     }
  558. /* 
  559. /*     pSym=l_find(pPI->lPIA,iCmpSymbolpName,pName);
  560. /*     if(!pSym){
  561. /*  *pOutValue=0;
  562. /*  return(eFalse);
  563. /*     }
  564. /*     strcpy(pOutValue,pSym->pValue);
  565. /*     return(eTrue);
  566. /* }
  567.  */
  568. eBoolean_t
  569. GetPIAValueREF
  570.     (PI *pPI
  571.     ,char *pName
  572.     ,char **pOutValue
  573.     )
  574. {
  575.     SYMBOL *pSym;
  576.     DebugHTML(__FILE__,__LINE__,5,"GetPIAValueREF(%x,%s,...)",pPI,pName);
  577.     if(!pPI) {
  578. (*pOutValue)=DupBuf(0);
  579. return(eFalse);
  580.     }
  581.     pSym=l_find(pPI->lPIA,iCmpSymbolpName,pName);
  582.     if(!pSym){
  583. (*pOutValue)=DupBuf(0);
  584. return(eFalse);
  585.     }
  586.     (*pOutValue) = pSym->pValue;
  587.     return(eTrue);
  588. }
  589. static eBoolean_t
  590. SetPIAValue
  591.     (PI *pPI
  592.     ,char *pName
  593.     ,char *pValue
  594.     )
  595. {
  596.     SYMBOL *pSym;
  597.     DebugHTML(__FILE__,__LINE__,6,"setPIAValue(%s,%s)",pName,pValue);
  598.     pSym=l_find(pPI->lPIA,iCmpSymbolpName,pName);
  599.     if(!pSym){
  600. pSym = NewPIA();
  601. if(!pSym){
  602.     MsgPush("NewPIA failed");
  603.     return(eFalse);
  604. }
  605. /* (void)memset((pSym),0,sizeof(SYMBOL));
  606.  */
  607. pSym->iType=0; /* Not used, best init it, though */
  608. pSym->pName=DupBuf(pName);
  609. pSym->pValue=DupBuf(pValue);
  610. return( ENQ(pPI->lPIA,pSym) );
  611.     }
  612.     /* toss origional value
  613.      */
  614.     FreeBuf(pSym->pValue);
  615.     pSym->pValue = DupBuf(pValue);
  616.     return(eTrue);
  617. }
  618. static void
  619. RawOutputHTML(char *p)
  620. {
  621.     FlushHTMLBuf();
  622.     fprintf(stdout,"%s",p);
  623.     fflush (stdout);
  624.     return;
  625. }
  626. eBoolean_t
  627. DumpPage(PAGE *pPage)
  628. {
  629.     eBoolean_t bRet;
  630.     bRet=l_scan(pPage->lPI,(PFI)DumpPI);
  631.     fprintf(stdout,"n");
  632.     return(bRet);
  633. }
  634. static eBoolean_t
  635. DumpPI(PI *pPI)
  636. {
  637.     if(!pPI)
  638. return(eTrue);
  639.     fprintf(stdout,"n%*s%s (line=%d) (depth=%d) "
  640.    ,(pPI->iLevel)*2 ," "
  641.    ,pPI->pTagName
  642.    ,pPI->iLineNbr
  643.    ,pPI->iLevel
  644.    );
  645.     (void)l_scan(pPI->lPIA,(PFI)DumpPIA);
  646.     if(l_size(pPI->lPI)>0) {
  647. RETeFalse( l_scan(pPI->lPI,(PFI)DumpPI)
  648.  ,"Recursive call failed"
  649.  );
  650. fprintf(stdout,"n%*s/%s"
  651. ,(pPI->iLevel)*2 ," "
  652. ,pPI->pTagName
  653. );
  654.     }
  655.     return(eTrue);
  656. }
  657. static eBoolean_t
  658. DumpPIA(SYMBOL *pPIA)
  659. {
  660.     char sBuf[BUFSIZ];
  661.     (void)memset(sBuf,0,BUFSIZ);
  662.     if(pPIA->pValue)
  663. strncpy(sBuf,pPIA->pValue,10);
  664.     fprintf(stdout,"(%s=%s)",pPIA->pName,sBuf);
  665.     return(eTrue);
  666. }