home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / e / mailinglists / binaries / readstr-study.lha / rwt5.e < prev   
Text File  |  1993-07-24  |  7KB  |  240 lines

  1. /* Timing of the buffered read string function used in EPP, slightly */
  2. /* modified here for readability.                                    */
  3.  
  4. MODULE 'dos/dos'
  5.  
  6. OBJECT st_stackType  /* Belongs to stack routines. */
  7.   top, count
  8. ENDOBJECT
  9.  
  10. OBJECT et_procInfoType  /* Belongs to timer routines. */
  11.   visits : LONG
  12.   started : datestamp
  13.   elapsed : datestamp
  14.   name : LONG
  15. ENDOBJECT
  16.  
  17. /* Belong to timer routines. */
  18. DEF et_procInfoArray : PTR TO et_procInfoType,
  19.     et_stack : st_stackType,
  20.     et_numberOfProcs = 0,
  21.     et_idRunning = -1 /* Used to turn timer off/on  */
  22.                       /* in case of recursive call. */
  23.                       /* Used by et_StartTime AND   */
  24.                       /* et_StopTime.               */
  25.  
  26. ENUM ER_NONE,
  27.      ER_MEM
  28.  
  29. RAISE ER_MEM IF String () = NIL,
  30.       ER_MEM IF New () = NIL
  31.  
  32. /* Belongs to readStr() routine. */
  33. OBJECT readDataType       /* You need one of these for each file. */
  34. /*-- public: ---------*/
  35.   fh : LONG               /* := handle of file you have opened    */
  36.   bufSize : LONG          /* := inputBuffer size                  */
  37.   maxLineLength : LONG    /* := StrMax() (may be dynamic to read  */
  38. /*-- private: --------*/  /*    in strings of different length.)  */
  39.   inputBuffer : LONG      /* create this with New()               */
  40.   length : LONG           /* num bytes read into inputBuffer      */
  41.   pos : LONG              /* next available char in inputBuffer   */
  42. ENDOBJECT
  43.  
  44. /*-- Stack routines used by timer ----------------------------------------*/
  45.  
  46. PROC st_init (theStack : PTR TO st_stackType)
  47. /* Simply declare the stack variable as st_stackType.   The status of the */
  48. /* stack can be checked by testing stackname.count.                       */
  49.   theStack.top := NIL
  50.   theStack.count := 0
  51. ENDPROC
  52.   /* st_init */
  53.  
  54. PROC st_push (theStack : PTR TO st_stackType, addr)
  55.   DEF newList, tempList
  56.   newList := List (1)
  57.   ListCopy (newList, [addr], ALL)
  58.   tempList := Link (newList, theStack.top)
  59.   theStack.top := tempList
  60.   theStack.count := theStack.count + 1
  61. ENDPROC
  62.   /* st_push */
  63.  
  64. PROC st_pop (theStack : PTR TO st_stackType)
  65.   DEF list, addr = NIL
  66.   IF theStack.count
  67.     list := theStack.top
  68.     addr := ^list
  69.     theStack.top := Next (list)
  70.     theStack.count := theStack.count - 1
  71.   ENDIF
  72. ENDPROC  addr
  73.   /* st_pop */
  74.  
  75. /*-- Timer routines ------------------------------------------------------*/
  76.  
  77. PROC et_init (numberOfProcs)
  78.   DEF i, elapsed : PTR TO datestamp
  79.   et_numberOfProcs := numberOfProcs + 1
  80.   et_procInfoArray := New ((SIZEOF et_procInfoType) * et_numberOfProcs)
  81.   FOR i := 0 TO numberOfProcs
  82.     et_procInfoArray [i].visits := 0
  83.     elapsed := et_procInfoArray [i].elapsed
  84.     elapsed.minute := 0
  85.     elapsed.tick := 0
  86.   ENDFOR
  87.   st_init (et_stack)
  88. ENDPROC
  89.  
  90. PROC et_startTimer (id, name)
  91.   DEF current : datestamp,
  92.       started : PTR TO datestamp,
  93.       elapsed : PTR TO datestamp
  94.   VOID DateStamp (current)
  95.  
  96.   /* Update the elapsed time of the proc that relinquished control to     */
  97.   /* child.  Init if et_idRunning = -1 (PROC main () is the *only* case.) */
  98.   IF et_idRunning = -1
  99.     et_init (id)
  100.   ELSE
  101.     started := et_procInfoArray [et_idRunning].started
  102.     elapsed := et_procInfoArray [et_idRunning].elapsed
  103.     IF current.tick < started.tick
  104.       current.tick := current.tick + 3000
  105.       current.minute := current.minute - 1
  106.     ENDIF
  107.     elapsed.tick := elapsed.tick + (current.tick - started.tick)
  108.     elapsed.minute := elapsed.minute + (current.minute - started.minute)
  109.   ENDIF
  110.   st_push (et_stack, et_idRunning)
  111.  
  112.   /* Update the start time of the child proc. */
  113.   started := et_procInfoArray [id].started
  114.   started.minute := current.minute
  115.   started.tick := current.tick
  116.   et_procInfoArray [id].name := IF name = NIL THEN '' ELSE name
  117.   et_idRunning := id
  118.   et_procInfoArray [id].visits := et_procInfoArray [id].visits + 1
  119. ENDPROC
  120.  
  121. PROC et_toMinutes (ticks) RETURN ticks / 3000
  122.  
  123. PROC et_report ()
  124.   DEF i,
  125.       totalMinute = 0,
  126.       totalTick = 0,
  127.       ds : PTR TO datestamp
  128.   FOR i := 0 TO (et_numberOfProcs - 1)
  129.     ds := et_procInfoArray [i].elapsed
  130.     ds.minute := ds.minute + et_toMinutes (ds.tick)
  131.     ds.tick := ds.tick - (et_toMinutes (ds.tick) * 3000)
  132.     WriteF ('\nid=\d, visits=\d, minute=\d, tick=\d, name=\s',
  133.             i,
  134.             et_procInfoArray [i].visits,
  135.             ds.minute,
  136.             ds.tick,
  137.             et_procInfoArray [i].name)
  138.     totalMinute := totalMinute + ds.minute
  139.     totalTick := totalTick + ds.tick
  140.   ENDFOR
  141.   totalMinute := totalMinute + et_toMinutes (totalTick)
  142.   totalTick := totalTick - (et_toMinutes (totalTick) * 3000)
  143.   WriteF ('\ntotalMinute=\d totalTick=\d\n', totalMinute, totalTick)
  144. ENDPROC
  145.  
  146. PROC et_stopTimer ()
  147.   DEF current : datestamp,
  148.       started : PTR TO datestamp,
  149.       elapsed : PTR TO datestamp
  150.   VOID DateStamp (current)
  151.  
  152.   /* Update the elapsed time of the child proc that id returning control */
  153.   /* to the parent.  None if et_idRunning = -1 (PROC main () is the      */
  154.   /* *only* case.)                                                       */
  155.   started := et_procInfoArray [et_idRunning].started
  156.   elapsed := et_procInfoArray [et_idRunning].elapsed
  157.     IF current.tick < started.tick
  158.       current.tick := current.tick + (50 * 60)
  159.       current.minute := current.minute - 1
  160.     ENDIF
  161.   elapsed.tick := elapsed.tick + (current.tick - started.tick)
  162.   elapsed.minute := elapsed.minute + (current.minute - started.minute)
  163.  
  164.   /* Update the start time of the parent proc.  None if et_idRunning = -1 */
  165.   /* (PROC main () is the *only* case.)                                   */
  166.   et_idRunning := st_pop (et_stack)
  167.   IF et_idRunning > -1
  168.     started := et_procInfoArray [et_idRunning].started
  169.     started.minute := current.minute
  170.     started.tick := current.tick
  171.   ELSE
  172.     et_report ()
  173.   ENDIF
  174. ENDPROC
  175.  
  176. /*-- readStr() routine ---------------------------------------------------*/
  177.  
  178. PROC readStr (rData : PTR TO readDataType,
  179.               string)
  180.   DEF inputBuffer,
  181.       i = 0,
  182.       pos
  183.   inputBuffer := rData.inputBuffer
  184.   pos := rData.pos
  185.   WHILE i < rData.bufSize
  186.     IF pos >= rData.length
  187.       rData.length := Read (rData.fh, inputBuffer, rData.bufSize)
  188.       IF rData.length < 1
  189.           IF i > 0
  190.             string [i++] := 10
  191.             string [i] := 0
  192.             rData.length := i
  193.           ENDIF
  194.           rData.pos := rData.length
  195.           RETURN i
  196.       ENDIF
  197.       pos := 0
  198.     ENDIF
  199.     string [i] := inputBuffer [pos++]
  200.     IF (string [i++] = 10) OR  /* LF */
  201.        (i = rData.maxLineLength)
  202.       SetStr (string, i)
  203.       rData.pos := pos
  204.       RETURN i
  205.     ENDIF
  206.   ENDWHILE
  207. ENDPROC
  208.   /* read */
  209.  
  210.  
  211. PROC main () HANDLE
  212.   DEF fho, rd : readDataType, s, l
  213.   s := String (80)
  214.  
  215.   /* Init read data object. */
  216.   rd.bufSize := 128
  217.   rd.inputBuffer := New (rd.bufSize)
  218.   rd.maxLineLength := 80 /* <-- can be dynamic if reading into */
  219.   rd.length := 0         /*     strings of different length.   */
  220.   rd.pos := 0
  221.  
  222.   fho := Open ('rwt5.out', NEWFILE)
  223.   rd.fh := Open ('testfile.txt', OLDFILE)
  224.   IF rd.fh AND fho
  225.     et_startTimer (0, 'readStr() [rewrite #3 with buffer]')
  226.     WHILE (l := readStr (rd, s)) > 0
  227.       Write (fho, s, l)
  228.     ENDWHILE
  229.     et_stopTimer ()
  230.     Close (rd.fh)
  231.     Close (fho)
  232.   ENDIF
  233.   CleanUp (0)
  234. EXCEPT
  235.   IF rd.fh THEN Close (rd.fh)
  236.   IF fho THEN Close (fho)
  237.   IF exception = ER_MEM THEN WriteF ('Not enough memory.\n')
  238.   CleanUp (0)
  239. ENDPROC
  240.