midrange.com code scratchpad
Name:
buffread1
Scriptlanguage:
Plain Text
Tabwidth:
4
Date:
02/05/2009 10:51:15 pm
IP:
Logged
Description:
Reading an IFS stream file looking for arbitrary-length record delimiters (_C_IFS_f* version).
Code:
  1.      H bnddir('QC2LE')
  2.      D getRecord       PR            10I 0
  3.      D  file                               like(fopen)
  4.      D  record                    65535A   VARYING
  5.      D                                     OPTIONS(*VARSIZE)
  6.      D  maxSize                      10I 0 VALUE
  7.      D  recordStart...
  8.      D                               10A   VARYING
  9.      D                                     CONST
  10.      D  recordEnd...
  11.      D                               10A   VARYING
  12.      D                                     CONST
  13.  
  14.      D fopen...
  15.      D                 PR              *   extproc('_C_IFS_fopen')
  16.      D  fname...
  17.      D                                 *   value
  18.      D                                     options(*string)
  19.      D  openMode...
  20.      D                                 *   options(*string)
  21.      D                                     value
  22.      D fclose...
  23.      D                 PR            10I 0 extproc('_C_IFS_fclose')
  24.      D  fileHandle...
  25.      D                                 *   value
  26.      D ferror          PR            10I 0 extproc('_C_IFS_ferror')
  27.      D   fh                            *   value
  28.      D
  29.      D strerror        PR              *   extproc('strerror')
  30.      D   errno                       10I 0 value
  31.      D
  32.      D get_errno       PR              *   ExtProc('__errno')
  33.  
  34.       /copy QCOPYSRC,UTTIFS
  35.  
  36.      D fh...
  37.      D                 S                   like(fopen)
  38.      D reclen...
  39.      D                 S                   like(getRecord)
  40.      D record...
  41.      D                 S            500A   varying
  42.      D start...
  43.      D                 S               z
  44.      D end...
  45.      D                 S               z
  46.      D runtime...
  47.      D                 S             11A   dtaara('RUNTIME')
  48.      D errno...
  49.      D                 S             10I 0 based(pErrno)
  50.       /free
  51.        start = %timestamp();
  52.  
  53.        fh = fopen('/home/adamg/readtest/onebig' + x'00' : 'r');
  54.        if (fh = *NULL);
  55.          pErrno = get_errno();
  56.          return;
  57.        endif;
  58.  
  59.        recLen = getRecord(fh : record : %size(record) -2 : '<B>' : '<E>');
  60.        dow (reclen > 0);
  61.          recLen = getRecord(fh : record : %size(record) -2 : '<B>' : '<E>');
  62.        enddo;
  63.  
  64.        callp fclose(fh);
  65.  
  66.        end = %timestamp();
  67.  
  68.        in *lock runTime;
  69.        runTime = %char(%diff(end : start : *ms));
  70.        out runTime;
  71.  
  72.        *inlr = *on;
  73.        return;
  74.       /end-free
  75.  
  76.      P*--------------------------------------------------
  77.      P* Procedure name: getRecord
  78.      P* Purpose:        Retrieve one event or alarm record from the file
  79.      P* Returns:        The number of bytes in the record, -1 if an error o...
  80.      P*                          ccurred
  81.      P* Parameter:      file => The file from which to read
  82.      P* Parameter:      record => The variable which will receive the record
  83.      P* Parameter:      maxSize => The maximum number of bytes that the rec...
  84.      P*                          ord variable can hold
  85.      P*--------------------------------------------------
  86.      P getRecord       B
  87.      D getRecord       PI            10I 0
  88.      D  fileHandle                         like(fopen)
  89.      D  record                    65535A   VARYING
  90.      D                                     OPTIONS(*VARSIZE)
  91.      D  maxSize                      10I 0 VALUE
  92.      D  recordStart...
  93.      D                               10A   VARYING
  94.      D                                     CONST
  95.      D  recordEnd...
  96.      D                               10A   VARYING
  97.      D                                     CONST
  98.  
  99.      D fread...
  100.      D                 PR            10U 0 extproc('_C_IFS_fread')
  101.      D  readBuff...
  102.      D                                 *   value
  103.      D  buffSize...
  104.      D                               10U 0 value
  105.      D  readSize...
  106.      D                               10U 0 value
  107.      D  fileHandle...
  108.      D                                 *   value
  109.  
  110.      D* Local fields
  111.      D miniBuff...
  112.      D                 DS
  113.      D   mbChar...
  114.      D                                1A   dim(10)
  115.      D
  116.      D recordStarted...
  117.      D                 S               N
  118.      D recordEnded...
  119.      D                 S               N
  120.      D bytesRead       S             10U 0
  121.      D totalRead...
  122.      D                 S             10U 0
  123.      D miniBuffLen...
  124.      D                 S              3U 0
  125.      D errno...
  126.      D                 S                   like(ferror)
  127.      D pErrString...
  128.      D                 S               *
  129.      D errString...
  130.      D                 S             15A
  131.  
  132.       /free
  133.        %len(record) = 0;
  134.  
  135.        if (%len(recordStart) > %len(recordEnd));
  136.          miniBuffLen = %len(recordStart);
  137.        else;
  138.          miniBuffLen = %len(recordEnd);
  139.        endif;
  140.  
  141.        bytesRead = fread(%addr(miniBuff) : 1 : miniBuffLen : fileHandle);
  142.        if (bytesRead = 0);
  143.          errno = ferror(fileHandle);
  144.          pErrString = strerror(errno);
  145.        endif;
  146.        doW (bytesRead > 0 AND NOT recordEnded AND totalRead < maxSize);
  147.          if (NOT recordStarted);
  148.            recordStarted =
  149.                  (%subst(miniBuff : 1 : %len(recordStart)) = recordStart);
  150.            if (recordStarted);
  151.              if (miniBuffLen = %len(recordStart));
  152.                %subst(miniBuff : 1 : %len(recordStart)) = *blanks;
  153.                bytesRead =
  154.                           fread(%addr(miniBuff) : 1 : miniBuffLen : fileHandle);
  155.              else;
  156.                miniBuff = %subst(miniBuff : %len(recordStart) + 1);
  157.                bytesRead = fread(
  158.                             %addr(mbChar(%len(recordStart) + 1)) :
  159.                             1 :
  160.                             miniBuffLen - %len(recordStart) :
  161.                             fileHandle
  162.                            );
  163.              endif;
  164.            endif;
  165.          endif;
  166.  
  167.          if (recordStarted AND NOT recordEnded);
  168.            record    += mbChar(1);
  169.            totalRead += 1;
  170.          endif;
  171.  
  172.          miniBuff  = %subst(miniBuff : 2);
  173.          bytesRead = fread(%addr(mbChar(miniBuffLen)) : 1 : 1 :  fileHandle);
  174.          recordEnded   = (%subst(miniBuff : 1 : %len(recordEnd)) = recordEnd);
  175.        enddo;
  176.  
  177.        return totalRead;
  178.       /end-free
  179.      P getRecord       E
© 2004-2019 by midrange.com generated in 0.008s valid xhtml & css