home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / nosac106.zip / cvsreport.cmd < prev    next >
OS/2 REXX Batch file  |  2000-12-23  |  18KB  |  559 lines

  1. /*
  2.  *      CVSREPORT.CMD - NOSA Client - V1.06 C.Langanke for Netlabs 1999,2001
  3.  *
  4.  *     Syntax: cvsreport
  5.  *
  6.  *     This program egnerates a HTML form for reporting changes to the
  7.  *     change report database via email.
  8.  *
  9.  *     The archivename is read out of the environment variable %NOSAC_ARCHIVE%
  10.  *     The username is read out of the environment variable %USER%
  11.  */
  12. /* First comment is used as help text */
  13.  
  14.  SIGNAL ON HALT
  15.  TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
  16.  PARSE VAR TitleLine CmdName'.CMD 'Info
  17.  Title     = CmdName Info
  18.  
  19.  env          = 'OS2ENVIRONMENT';
  20.  TRUE         = (1 = 1);
  21.  FALSE        = (0 = 1);
  22.  Redirection  = '> NUL 2>&1';
  23.  CrLf         = "0d0a"x;
  24.  '@ECHO OFF'
  25.  
  26.  /* OS/2 errorcodes */
  27.  ERROR.NO_ERROR           =  0;
  28.  ERROR.INVALID_FUNCTION   =  1;
  29.  ERROR.FILE_NOT_FOUND     =  2;
  30.  ERROR.PATH_NOT_FOUND     =  3;
  31.  ERROR.ACCESS_DENIED      =  5;
  32.  ERROR.NOT_ENOUGH_MEMORY  =  8;
  33.  ERROR.INVALID_FORMAT     = 11;
  34.  ERROR.INVALID_DATA       = 13;
  35.  ERROR.NO_MORE_FILES      = 18;
  36.  ERROR.WRITE_FAULT        = 29;
  37.  ERROR.READ_FAULT         = 30;
  38.  ERROR.GEN_FAILURE        = 31;
  39.  ERROR.INVALID_PARAMETER  = 87;
  40.  ERROR.ENVVAR_NOT_FOUND   = 203;
  41.  
  42.  GlobalVars = 'Title CmdName env TRUE FALSE CrLf Redirection ERROR.';
  43.  SAY;
  44.  
  45.  /* show help */
  46.  ARG Parm .
  47.  IF (POS('?', Parm) > 0) THEN
  48.  DO
  49.     rc = ShowHelp();
  50.     EXIT(ERROR.INVALID_PARAMETER);
  51.  END;
  52.  
  53.  /* load RexxUtil */
  54.  CALL RxFuncAdd    'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
  55.  CALL SysLoadFuncs;
  56.  
  57.  /* load FTP util */
  58.  CALL RxFuncAdd    'FtpLoadFuncs', 'rxFtp', 'FtpLoadFuncs';
  59.  CALL FtpLoadFuncs 'QUIET';
  60.  
  61.  /* Defaults */
  62.  GlobalVars = GlobalVars 'Var. OptionDelimiter';
  63.  OptionDelimiter    = ';'
  64.  ErrorMsg           = '';
  65.  rc                 = ERROR.NO_ERROR;
  66.  CallDir            = GetCallDir();
  67.  DefaultEmailAdress = 'NOSA-change-report@netlabs.org';
  68.  
  69.  ArchiveVarname     = 'NOSAC_ARCHIVE';
  70.  
  71.  
  72.  DO UNTIL (TRUE)
  73.  
  74.     /* check parameters */
  75.     Archive = VALUE(ArchiveVarname,, env);
  76.     IF (Archive = '') THEN
  77.     DO
  78.        ErrorMsg = 'enrionment variable' ArchiveVarname 'not found. Execute cvsenv first.';
  79.  
  80.        rc = ERROR.ENVVAR_NOT_FOUND;
  81.        LEAVE;
  82.     END;
  83.  
  84.     PARSE ARG EmailAdress .;
  85.     User = VALUE('USER',,env);
  86.     IF (User = '') THEN
  87.     DO
  88.        ErrorMsg = 'environment variable user not defined.';
  89.        rc = ERROR.INVALID_PARAMETER;
  90.        LEAVE;
  91.     END;
  92.  
  93.     EmailAdress = STRIP(EmailAdress);
  94.     IF (EmailAdress = '') THEN
  95.        EmailAdress = DefaultEmailAdress;
  96.  
  97.     /* var exists ? */
  98.     VarFile  = CallDir'\html\report.var';
  99.     IF (\FileExist( VarFile)) THEN
  100.     DO
  101.        ErrorMsg = 'variable file' VarFile 'not found.';
  102.        rc = ERROR.FILE_NOT_FOUND;
  103.        LEAVE;
  104.     END;
  105.  
  106.     /* -------------------------------------------------------------- */
  107.  
  108.     /* read all variables */
  109.     ErrorMsg = '';
  110.     rc = ReadVariables( VarFile);
  111.     IF (rc \= ERROR.NO_ERROR) THEN
  112.        LEAVE;
  113.  
  114.     /* write html file */
  115.     HtmlFile   = CallDir'\html\'Archive'.html';
  116.     rc = WriteHtmlFile( HtmlFile, Archive, User, EmailAdress);
  117.     IF (rc \= ERROR.NO_ERROR) THEN
  118.        LEAVE;
  119.  
  120.     /* start netscape with the resulting file */
  121.     CALL CHAROUT, 'Starting browser ... ';
  122.     'START NETSCAPE' HtmlFile;
  123.     SAY 'Ok.';
  124.  
  125.  END;
  126.  
  127.  /* exit */
  128.  IF (rc \= ERROR.NO_ERROR) THEN
  129.  DO
  130.     IF (ErrorMsg \= '') THEN
  131.        SAY CmdName': Error:' ErrorMsg;
  132.     'PAUSE'
  133.  END;
  134.  EXIT( rc);
  135.  
  136. /* ------------------------------------------------------------------------- */
  137. HALT:
  138.  SAY 'Interrupted by user.';
  139.  EXIT(ERROR.GEN_FAILURE);
  140.  
  141. /* ------------------------------------------------------------------------- */
  142. ShowHelp: PROCEDURE EXPOSE (GlobalVars)
  143.  
  144.  SAY Title;
  145.  SAY;
  146.  
  147.  PARSE SOURCE . . ThisFile
  148.  DO i = 1 TO 3
  149.     rc = LINEIN(ThisFile);
  150.  END;
  151.  
  152.  ThisLine = LINEIN(Thisfile);
  153.  DO WHILE (ThisLine \= ' */')
  154.     SAY SUBSTR(ThisLine, 7);
  155.     ThisLine = LINEIN(Thisfile);
  156.  END;
  157.  
  158.  rc = LINEOUT(Thisfile);
  159.  
  160.  RETURN('');
  161.  
  162. /* ------------------------------------------------------------------------- */
  163. FileExist: PROCEDURE
  164.  PARSE ARG FileName
  165.  
  166.  RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
  167.  
  168. /* ------------------------------------------------------------------------- */
  169. GetCalldir: PROCEDURE
  170. PARSE SOURCE . . CallName
  171.  CallDir = FILESPEC('Drive', CallName)||FILESPEC('Path', CallName);
  172.  RETURN(LEFT(CallDir, LENGTH(CallDir) - 1));
  173.  
  174. /* ------------------------------------------------------------------------- */
  175. ParseLine: PROCEDURE EXPOSE env
  176.  PARSE ARG ThisLine
  177.  
  178.  Delimiter = '%';
  179.  
  180.  ThisLineCopy = '';
  181.  CurrentPos   = 1;
  182.  
  183.  /* search variable */
  184.  VarStart = POS(Delimiter, ThisLine);
  185.  DO WHILE (VarStart > 0)
  186.  
  187.     VarEnd       = Pos(Delimiter, ThisLine, VarStart + 1);
  188.     ThisVar      = SUBSTR(ThisLine, VarStart + 1, VarEnd - VarStart - 1);
  189.     ThisVarValue = VALUE(ThisVar,,env);
  190.  
  191.     /* extend copy */
  192.     ThisLineCopy = ThisLineCopy||,
  193.                    SUBSTR(ThisLine, CurrentPos, VarStart - CurrentPos)||,
  194.                    ThisVarValue;
  195.     CurrentPos   = VarEnd + 1;
  196.  
  197.     /* search next var */
  198.     VarStart = POS(Delimiter, ThisLine, CurrentPos);
  199.  END;
  200.  
  201.  /* take ofer rest of line */
  202.  ThisLineCopy = ThisLineCopy||SUBSTR(ThisLine, CurrentPos);
  203.  
  204.  RETURN(ThisLineCopy);
  205.  
  206. /* ========================================================================= */
  207. ReadVariables: PROCEDURE EXPOSE (GlobalVars)
  208.  PARSE ARG VarFile;
  209.  
  210.  rc             = ERROR.NO_ERROR;
  211.  LineCount      = 0;
  212.  CommentChars   = ';:#';
  213.  GlobalOptions  = 'TARGET SUBJECT SUBMIT RESET';
  214.  Controls       = 'HIDDEN INPUT SELECT TEXTAREA';
  215.  ControlOptions = 'CONTROL PROMPT NAME TYPE VALUE ATTRIBUTES INFO OPTIONS VALIDATE';
  216.  
  217.  ErrorMsg       = '';
  218.  ErrorLine      = 0;
  219.  
  220.  DO UNTIL (TRUE)
  221.  
  222.     /* reset variable stem */
  223.     Drop(Var.);
  224.     Var.  = '';
  225.     Var.0 = 0;
  226.  
  227.     /* read in vars */
  228.     DO WHILE (LINES( VarFile) > 0)
  229.  
  230.        /* read a line */
  231.        LineCount = LineCount + 1;
  232.        ThisLine = STRIP( LINEIN( VarFile));
  233.  
  234.        /* ignore empty lines and comments */
  235.        IF (ThisLine = '') THEN ITERATE;
  236.        IF (WORDS( ThisLine) < 2) THEN ITERATE;
  237.        IF (POS( LEFT( ThisLine, 1), CommentChars) > 0) THEN ITERATE;
  238.  
  239.        PARSE VAR ThisLine OptionName OptionValue;
  240.        OptionName  = TRANSLATE( STRIP( OptionName));
  241.        OptionValue = STRIP( OptionValue);
  242.  
  243.        /* is it a valid option ? */
  244.        SELECT
  245.           WHEN (WORDPOS( OptionName, GlobalOptions) > 0) THEN
  246.           DO
  247.              Var.OptionName = ParseLine( OptionValue);
  248.              ITERATE;
  249.           END;
  250.  
  251.           WHEN (OptionName = 'CONTROL') THEN
  252.           DO
  253.              /* open a new control definition */
  254.              i     = Var.0 + 1;
  255.              Var.i = OptionValue;
  256.              Var.0 = i;
  257.              ITERATE;
  258.           END;
  259.  
  260.           WHEN (WORDPOS( OptionName, ControlOptions) > 0) THEN
  261.           DO
  262.              /* check if a control definition is already open */
  263.              IF (Var.0 = 0) THEN
  264.              DO
  265.                 ErrorMsg  = 'invalid: usage of control option outside of a control definition';
  266.                 rc = ERROR.INVALID_DATA;
  267.                 LEAVE;
  268.              END;
  269.  
  270.  
  271.              /* save value */
  272.              /* Values are to be checked for environment variables */
  273.              i                = Var.0;
  274.              Var.i.OptionName = ParseLine( OptionValue);
  275.  
  276.           END;
  277.  
  278.           OTHERWISE
  279.           DO
  280.              /* give an error */
  281.              ErrorMsg  = 'Invalid option:' OptionName;
  282.              ErrorLine = LineCount;
  283.              rc = ERROR.INVALID_DATA;
  284.           END;
  285.  
  286.        END; /* SELECT */
  287.  
  288.        /* break out in case of error */
  289.        IF (rc \= ERROR.NO_ERROR) THEN
  290.           LEAVE;
  291.  
  292.     END; /* DO WHILE (LINES( VarFile) > 0) */
  293.  
  294.  END; /* DO UNTIL (TRUE) */
  295.  
  296.  /* report error */
  297.  IF (rc \= ERROR.NO_ERROR) THEN
  298.     SAY 'error in line' LineCount':' ErrorMsg;
  299.  RETURN(rc);
  300.  
  301. /* ========================================================================= */
  302. WriteHtmlFile: PROCEDURE EXPOSE (GlobalVars)
  303.  PARSE ARG HtmlFile, Archive, User, EmailAdress;
  304.  
  305.  rc          = ERROR.NO_ERROR;
  306.  YellowColor = '#ffffe8';
  307.  GreenColor  = '#f7fff7';
  308.  
  309.  DO UNTIL (TRUE)
  310.  
  311.     /* delete old file */
  312.     rc = SysFileDelete( HtmlFile);
  313.     IF (WORDPOS( rc, '0 2') = 0) THEN
  314.     DO
  315.        ErrorMsg = 'Cannot write change report form.';
  316.        LEAVE;
  317.     END;
  318.     rc = ERROR.NO_ERROR;
  319.  
  320.     CALL CHAROUT, 'Generating change report form for archive' Archive '... ';
  321.  
  322.     /* --------------------------------------------------------------- */
  323.  
  324.     /* write header */
  325.     rc = LINEOUT( HtmlFile, '<html>');
  326.     rc = LINEOUT( HtmlFile, '<head>');
  327.     rc = LINEOUT( HtmlFile, '<title>OS/2 Netlabs Open Source Archive Change Report</title>');
  328.     rc = LINEOUT( HtmlFile, '<meta http-equiv="content-type" content="text/html;CHARSET=iso8859-1">');
  329.  
  330.     /* --------------------------------------------------------------- */
  331.  
  332.     /* write start of JavaScript */
  333.     rc = LINEOUT( HtmlFile, '<script language="JavaScript">');
  334.     rc = LINEOUT( HtmlFile, '  <!--');
  335.     rc = LINEOUT( HtmlFile, '');
  336.  
  337.     /* --------------------------------------------------------------- */
  338.  
  339.     /* commands for preloading bitmaps */
  340.     rc = LINEOUT( HtmlFile, '  RequiredBitmap     = new Image();');
  341.     rc = LINEOUT( HtmlFile, '  RequiredBitmap.src = "image/required.gif";');
  342.     rc = LINEOUT( HtmlFile, '  ErrorBitmap        = new Image();');
  343.     rc = LINEOUT( HtmlFile, '  ErrorBitmap.src    = "image/error.gif";');
  344.     rc = LINEOUT( HtmlFile, '');
  345.  
  346.     /* start of CheckInput */
  347.     rc = LINEOUT( HtmlFile, '  function CheckInput()');
  348.     rc = LINEOUT( HtmlFile, '  {');
  349.  
  350.     /* write JavaScript commands for input validation for each mandandotry object */
  351.     DO i = 1 TO Var.0
  352.        Var.i.Validate =  TRANSLATE(Var.i.Validate);
  353.  
  354.        /* select if clause first */
  355.        SELECT
  356.  
  357.           WHEN (Var.i.Validate = 'EMPTY') THEN
  358.              CheckClause = '(document.ChangeReport.'Var.i.Name'.value == "")';
  359.  
  360.           WHEN (Var.i.Validate = 'VALUE') THEN
  361.              CheckClause = '((document.ChangeReport.'Var.i.Name'.value == "") ||',
  362.                             '(document.ChangeReport.'Var.i.Name'.value == "'Var.i.Value'"))';
  363.  
  364.           WHEN (Var.i.Validate = 'FIRSTOPTION') THEN
  365.           DO
  366.              /* get first option */
  367.              EndOfFirstOption = POS( OptionDelimiter, Var.i.Options);
  368.              IF (EndOfFirstOption = 0) THEN
  369.                 EndOfFirstOption =LENGTH( Var.i.Options) + 1;
  370.              FirstOption = LEFT( Var.i.Options, EndOfFirstOption - 1);
  371.  
  372.              CheckClause = '(document.ChangeReport.'Var.i.Name'.options.selectedIndex == "undefined")';
  373.           END;
  374.  
  375.           WHEN (Var.i.Validate = '') THEN ITERATE;
  376.  
  377.           /* should we warn or interrupt here ? */
  378.           OTHERWISE ITERATE;
  379.  
  380.        END;
  381.  
  382.        /* write commands now */
  383.        rc = LINEOUT( HtmlFile, '   if' CheckClause);
  384.        rc = LINEOUT( HtmlFile, '    {');
  385.        rc = LINEOUT( HtmlFile, '     alert("'Var.i.Info'");');
  386.        rc = LINEOUT( HtmlFile, '     document.ChangeReport.'Var.i.Name'.focus();');
  387.        rc = LINEOUT( HtmlFile, '     document.'Var.i.Name'_BITMAP.src = ErrorBitmap.src');
  388.        rc = LINEOUT( HtmlFile, '     return false;');
  389.        rc = LINEOUT( HtmlFile, '    }');
  390.        rc = LINEOUT( HtmlFile, '   else');
  391.        rc = LINEOUT( HtmlFile, '     document.'Var.i.Name'_BITMAP.src = RequiredBitmap.src');
  392.     END;
  393.  
  394.     /* end of CheckInput */
  395.     rc = LINEOUT( HtmlFile, '  return true;');
  396.     rc = LINEOUT( HtmlFile, '  }');
  397.  
  398.     /* --------------------------------------------------------------- */
  399.  
  400.     /* start of ResetBitmaps */
  401.     rc = LINEOUT( HtmlFile, '  function ResetBitmaps()');
  402.     rc = LINEOUT( HtmlFile, '  {');
  403.     DO i = 1 TO Var.0
  404.        IF (Var.i.Validate \= '') THEN
  405.           rc = LINEOUT( HtmlFile, '   document.'Var.i.Name'_BITMAP.src = RequiredBitmap.src');
  406.     END;
  407.  
  408.     /* end of ResetBitmaps */
  409.     rc = LINEOUT( HtmlFile, '  }');
  410.  
  411.  
  412.     /* --------------------------------------------------------------- */
  413.  
  414.     /* write end of of JavaScript and end of header */
  415.     rc = LINEOUT( HtmlFile, '  // -->');
  416.     rc = LINEOUT( HtmlFile, '');
  417.     rc = LINEOUT( HtmlFile, '  </script>');
  418.     rc = LINEOUT( HtmlFile, '</head>');
  419.  
  420.     /* --------------------------------------------------------------- */
  421.  
  422.     /* write body start */
  423.     rc = LINEOUT( HtmlFile, '<body bgcolor='GreenColor'>');
  424.     rc = LINEOUT( HtmlFile, '');
  425.     rc = LINEOUT( HtmlFile, '<center>');
  426.     rc = LINEOUT( HtmlFile, '<img src="image/nllogo.gif">');
  427.     rc = LINEOUT( HtmlFile, '<br>');
  428.     rc = LINEOUT( HtmlFile, '<font size=+2><b>Open Source Archive Change Report</b></font>');
  429.     rc = LINEOUT( HtmlFile, '</center>');
  430.     rc = LINEOUT( HtmlFile, '');
  431.     rc = LINEOUT( HtmlFile, '<form action="mailto:'EmailAdress'?subject='Var.subject'" name="ChangeReport" method=post enctype="text/plain">');
  432.     rc = LINEOUT( HtmlFile, '');
  433.     rc = LINEOUT( HtmlFile, '   <table cellpadding=2 cellspacing=2 bgcolor='YellowColor' bordercolor='YellowColor' bordercolordark='YellowColor' bordercolorlight='YellowColor'>');
  434.  
  435.     /* write JavaScript commands for table entries here */
  436.     DO i = 1 TO Var.0
  437.  
  438.        /* prepare for selection */
  439.        ControlType = TRANSLATE( Var.i);
  440.        SetValue    = Var.i.Value;
  441.        IF (SetValue \= '') THEN
  442.           SetValue = 'value="'SetValue'" ';
  443.  
  444.        /* write table row start */
  445.        rc = LINEOUT( HtmlFile, '      <tr>');
  446.  
  447.        /* select controltype */
  448.        SELECT
  449.  
  450.           WHEN (ControlType = 'HIDDEN') THEN
  451.           DO
  452.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  453.              rc = LINEOUT( HtmlFile, '            <input type=hidden name="'Var.i.Name'" value="'Var.i.value'">');
  454.              rc = LINEOUT( HtmlFile, '            'Var.i.Prompt);
  455.              rc = LINEOUT( HtmlFile, '         </td>');
  456.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  457.              rc = LINEOUT( HtmlFile, '            <b>'Var.i.Value'</b>');
  458.              rc = LINEOUT( HtmlFile, '         </td>');
  459.           END;
  460.  
  461.           WHEN (ControlType = 'SELECT') THEN
  462.           DO
  463.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  464.              rc = LINEOUT( HtmlFile, '            'Var.i.Prompt);
  465.              rc = LINEOUT( HtmlFile, '         </td>');
  466.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  467.  
  468.              rc = CHAROUT( HtmlFile, '            <select name="'Var.i.Name'" size=1>');
  469.              OptionList = Var.i.Options;
  470.              PARSE VAR OptionList FirstOption';'OptionList;
  471.              rc = CHAROUT( HtmlFile, '<option selected>'FirstOption);
  472.              DO WHILE (OptionList \= '')
  473.                 PARSE VAR OptionList NextOption';'OptionList;
  474.                 rc = CHAROUT( HtmlFile, '<option>'NextOption);
  475.              END;
  476.              rc = LINEOUT( HtmlFile, '</select>');
  477.              rc = LINEOUT( HtmlFile, '         </td>');
  478.           END;
  479.  
  480.           WHEN (ControlType = 'TEXT') THEN
  481.           DO
  482.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  483.              rc = LINEOUT( HtmlFile, '            'Var.i.Prompt);
  484.              rc = LINEOUT( HtmlFile, '         </td>');
  485.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  486.              rc = LINEOUT( HtmlFile, '            <input type=text name="'Var.i.Name'" 'Var.i.attributes' 'SetValue'>');
  487.              rc = LINEOUT( HtmlFile, '         </td>');
  488.           END;
  489.  
  490.           WHEN (ControlType = 'TEXTAREA') THEN
  491.           DO
  492.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  493.              rc = LINEOUT( HtmlFile, '            'Var.i.Prompt);
  494.              rc = LINEOUT( HtmlFile, '         </td>');
  495.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  496.              rc = LINEOUT( HtmlFile, '            <textarea name="'Var.i.Name'" 'Var.i.attributes' 'SetValue'></textarea>');
  497.              rc = LINEOUT( HtmlFile, '         </td>');
  498.           END;
  499.  
  500.           /* should we warn or interrupt here ? */
  501.           OTHERWISE NOP;
  502.  
  503.        END;
  504.        /* need validate mark ? */
  505.        SELECT
  506.  
  507.           WHEN (ControlType = 'HIDDEN') THEN
  508.           DO
  509.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  510.              rc = LINEOUT( HtmlFile, '            <img src="image/blank.gif">');
  511.              rc = LINEOUT( HtmlFile, '         </td>');
  512.           END;
  513.  
  514.           WHEN (Var.i.Validate \= '') THEN
  515.           DO
  516.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  517.              rc = LINEOUT( HtmlFile, '            <img name="'Var.i.Name'_BITMAP" src="image/required.gif">');
  518.              rc = LINEOUT( HtmlFile, '         </td>');
  519.           END;
  520.           OTHERWISE
  521.           DO
  522.              rc = LINEOUT( HtmlFile, '         <td bgcolor='YellowColor'>');
  523.              rc = LINEOUT( HtmlFile, '            <img src="image/blank.gif">');
  524.              rc = LINEOUT( HtmlFile, '         </td>');
  525.           END;
  526.  
  527.        END;
  528.  
  529.        /* write table row end */
  530.        rc = LINEOUT( HtmlFile, '      </tr>');
  531.     END;
  532.  
  533.     /* write body end */
  534.     rc = LINEOUT( HtmlFile, '</table>');
  535.     rc = LINEOUT( HtmlFile, '<p>');
  536.     rc = LINEOUT( HtmlFile, '<input type=submit value="'Var.submit'" onClick="return CheckInput();">');
  537.     rc = LINEOUT( HtmlFile, '<input type=reset value="'Var.reset'" onClick="ResetBitmaps()">');
  538.     rc = LINEOUT( HtmlFile, '');
  539.     rc = LINEOUT( HtmlFile, '</form>');
  540.     rc = LINEOUT( HtmlFile, '</html>');
  541.  
  542.     /* --------------------------------------------------------------- */
  543.  
  544.     SAY 'Ok.'
  545.  
  546.  END; /* DO UNTIL (TRUE) */
  547.  
  548.  rcx = STREAM( HtmlFile, 'C', 'CLOSE');
  549.  
  550.  /* report error */
  551.  IF (rc \= ERROR.NO_ERROR) THEN
  552.  DO
  553.     SAY 'error:' ErrorMsg;
  554.     IF (ErrorMsg \= '') THEN
  555.        SAY CmdName': Error:' ErrorMsg;
  556.  END;
  557.  RETURN(rc);
  558.  
  559.