4. Emettere sezioni di HTML e spedire il buffer
 
        
        Per queste operazioni si utilizza la procedura
        
wrtsection.
        In una chiamata si possono emettere una o più sezioni.
        
Importante.
        Una volta che tutte le sezioni desiderate
        sono state emesse, non si dimentichi di
        
spedire al client il buffer di output.
        Questo si fa emettendo una sezione fittizia di nome
        
*fini.
        Esempio:
        
        | 
 * Emetti una sola sezione
C                   callp     wrtsection('start')
 * Emetti due sezioni
C                   callp     wrtsection('part1 part2')
 * Spedisci il buffer html al client
C                   callp     wrtsection('*fini') | 
        
        Nota 4. Il nome della sezione non risente del maiuscolo/minuscolo.
        La lunghezza massima è di 50 caratteri. Non si accettano nè lettere accentate nè caratteri speciali.
        
Nota 5. La procedura wrtSection può avere due parametri facoltativi:
        
        - Indicatore NoNewLine.
 Lo si imposta ad *on per segnalare che la wrtsection
            NON deve inserire il carattere di a-capo x'15' alla fine di ogni riga dell'HTML.
            Ciò è indispensabile quando al browser vengono inviati dei dati binari.
- Valore NoDataString.
 Segnala che cosa va fatto quando viene trovata una variabile di output
            a cui non è stato assegnato valore alcumo tramite UpdHtmlVar.
 In sua assenza, alle variabili di output non valorizzate viene assegnato il valore
            "**Missing Data**".
        Esempi:
        
| D NoDataString    c                   '<b>*** no substitution! ***</b>'
 * Write a section without newline characters
C                   callp     wrtsection('mysection':*on)
 * Write a section with non-default warning for
 * missing substitution variables
C                   callp     wrtsection('mysection':*off:
C                             NoDataString) | 
        
        
        
         
        5. Procedure particolari di output
 
        
        
         
        La procedura
        wrtNoSection
        invia dati al browser senza usare variabili di sostituzione
        nè sezioni.
        È ideale quando si debba inviare in output
        un grosso blocco di dati,
        per esempio quando si tratti di emettere immagini o comunque
        dati non testuali.
        L'esempio seguente illustra come leggere un file IFS esterno
        (una pagina HTML, una immagine, ...) e come inserirla
        nel buffer di output di un programma CGI:
            
        | D IfsInpBuff      s          10000a   varying
D InpBuffLen      s             10i 0
D IfsObj          s            255a
D FileHandle      s             10i 0
D ReturnInt       s             10i 0
D BytesIn         s             10i 0
* ... ... ...
* Read an IFS object into "IfsInpBuff"
C                   eval      IfsObj = '/mypath/mysubpath/myobj.xxx'
*   1-Open the IFS file
C                   eval      FileHandle = open(%trim(IfsObj)
C                               : O_RDONLY + O_TEXTDATA)
*   2-Read the IFS file
C                   eval      BytesIn = read(FileHandle
C                               : %addr(IfsInpBuff)
C                               : %size(IfsInpBuff))
*   3-Close the IFS file
C                   eval      ReturnInt = close(FileHandle)
C                   eval      IfsInpBuff = %trim(IfsInpBuff)
* Insert the string read into the CGI output buffer
C     ' '           checkr    IfsInpBuff    InpBuffLen
C                   callp     WrtNoSection(%addr(IfsInpBuff):
C                             InpBuffLen) | 
        
         
        
        
         
        La procedura
        clrHtmlBuffer
        pulisce tutto quanto è stato posto
        nel buffer di output HTML, purchè
        non sia già stato spedito al client
        o scritto in uno stream file.
        Questo è utile quando la logica del programma
        impone di fornire in output qualcosa di diverso
        da quanto è già stato posto nel buffer.
            
         
        
        
         
        La procedura
        getHtmlBytesBuffered
        Restituisce la lunghezza (numero di byte)
            del buffer HTML di output
        La lunghezza aumenta ogni volta che si scrive dell'output
            con la procedura WrtSection o con la procedura
            WrtNoSection
        La lunghezza viene ripristinata a 0 quando si esegue
            WrtSection('*fini') oppure WrtHtmlToStmf
        Se si lascia che la lunghezza del buffer HTML di output
            superi i 16 Mb, il programma CGI fallisce.
        
Questa procedura può essere utile per decidere
        di troncare una pagina HTML di output quando le sue
        dimensioni superino un limite ragionevole.
            
        | 
D buffsize        s             10i 0
C                   eval      buffsize = getHtmlBytesBuffered | 
        
         
        
        
         
        La procedura
        getHtmlBufferP
        Restituisce il puntatore al buffer HTML di output ed il numero di byte utilizzati in questo buffer.
        Utile per effettuare del debugging o per prelevare dal buffer quanto ivi scritto.
            
        | 
 D OutBuffer       s          32767    based(OutbufferP)
 D OutBufferInfo   ds
 D  OutBufferP                     *
 D  OutBufferLen                 10u 0
 C                   eval      OutBufferInfo=callp(GetHtmlBufferP) | 
        
         
        
        
        
        La procedura
        crtTagOpt
        Restituisce una tag HTML <option value="...">...</option>
            da utilizzarsi nell'ambito di una <select ...> .
        Naturalmente esistono altri modi per creare le <option>
            all'interno di una selection list.
        
        | 
/$strselect
<table>
<tr><td>Please select desired date:</td></tr>
<tr><td><select name="date">
/$option
/%optionvalue%/
/$endselect
</select>
        </td></tr>
</table>
         | 
        
        | 
     D dates           s             15    dim(3)
     D i               s             10i 0
     D optionValue     s            200    varying
      /free
           wrtsection('strselect');
           for i=1 to 3;
              optionValue=CrtTagOpt(%char(i):dates(i));
              updhtmlvar('optionvalue':optionValue);
              wrtsection('option');
           endfor;
           wrtsection('endselect');
         | 
        
        Abbiamo un programma che dimostra l'utilizzo della procedura CrtTagOpt: