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

  1. /* Timing of my version of readStr(), with use of returned string    */
  2. /* length value.                                                     */
  3.  
  4. MODULE 'dos/dos'
  5.  
  6. OBJECT st_stackType
  7.   top, count
  8. ENDOBJECT
  9.  
  10. OBJECT et_procInfoType
  11.   visits : LONG
  12.   started : datestamp
  13.   elapsed : datestamp
  14.   name : LONG
  15. ENDOBJECT
  16.  
  17. DEF et_procInfoArray : PTR TO et_procInfoType,
  18.     et_stack : st_stackType,
  19.     et_numberOfProcs = 0,
  20.     et_idRunning = -1 /* Used to turn timer off/on  */
  21.                       /* in case of recursive call. */
  22.                       /* Used by et_StartTime AND   */
  23.                       /* et_StopTime.               */
  24.  
  25. ENUM ER_NONE,
  26.      ER_MEM
  27.  
  28. RAISE ER_MEM IF String () = NIL
  29.  
  30. PROC st_init (theStack : PTR TO st_stackType)
  31. /* Simply declare the stack variable as st_stackType.   The status of the */
  32. /* stack can be checked by testing stackname.count.                       */
  33.   theStack.top := NIL
  34.   theStack.count := 0
  35. ENDPROC
  36.   /* st_init */
  37.  
  38. PROC st_push (theStack : PTR TO st_stackType, addr)
  39.   DEF newList, tempList
  40.   newList := List (1)
  41.   ListCopy (newList, [addr], ALL)
  42.   tempList := Link (newList, theStack.top)
  43.   theStack.top := tempList
  44.   theStack.count := theStack.count + 1
  45. ENDPROC
  46.   /* st_push */
  47.  
  48. PROC st_pop (theStack : PTR TO st_stackType)
  49.   DEF list, addr = NIL
  50.   IF theStack.count
  51.     list := theStack.top
  52.     addr := ^list
  53.     theStack.top := Next (list)
  54.     theStack.count := theStack.count - 1
  55.   ENDIF
  56. ENDPROC  addr
  57.   /* st_pop */
  58.  
  59. PROC et_init (numberOfProcs)
  60.   DEF i, elapsed : PTR TO datestamp
  61.   et_numberOfProcs := numberOfProcs + 1
  62.   et_procInfoArray := New ((SIZEOF et_procInfoType) * et_numberOfProcs)
  63.   FOR i := 0 TO numberOfProcs
  64.     et_procInfoArray [i].visits := 0
  65.     elapsed := et_procInfoArray [i].elapsed
  66.     elapsed.minute := 0
  67.     elapsed.tick := 0
  68.   ENDFOR
  69.   st_init (et_stack)
  70. ENDPROC
  71.  
  72. PROC et_startTimer (id, name)
  73.   DEF current : datestamp,
  74.       started : PTR TO datestamp,
  75.       elapsed : PTR TO datestamp
  76.   VOID DateStamp (current)
  77.  
  78.   /* Update the elapsed time of the proc that relinquished control to     */
  79.   /* child.  Init if et_idRunning = -1 (PROC main () is the *only* case.) */
  80.   IF et_idRunning = -1
  81.     et_init (id)
  82.   ELSE
  83.     started := et_procInfoArray [et_idRunning].started
  84.     elapsed := et_procInfoArray [et_idRunning].elapsed
  85.     IF current.tick < started.tick
  86.       current.tick := current.tick + 3000
  87.       current.minute := current.minute - 1
  88.     ENDIF
  89.     elapsed.tick := elapsed.tick + (current.tick - started.tick)
  90.     elapsed.minute := elapsed.minute + (current.minute - started.minute)
  91.   ENDIF
  92.   st_push (et_stack, et_idRunning)
  93.  
  94.   /* Update the start time of the child proc. */
  95.   started := et_procInfoArray [id].started
  96.   started.minute := current.minute
  97.   started.tick := current.tick
  98.   et_procInfoArray [id].name := IF name = NIL THEN '' ELSE name
  99.   et_idRunning := id
  100.   et_procInfoArray [id].visits := et_procInfoArray [id].visits + 1
  101. ENDPROC
  102.  
  103. PROC et_toMinutes (ticks) RETURN ticks / 3000
  104.  
  105. PROC et_report ()
  106.   DEF i,
  107.       totalMinute = 0,
  108.       totalTick = 0,
  109.       ds : PTR TO datestamp
  110.   FOR i := 0 TO (et_numberOfProcs - 1)
  111.     ds := et_procInfoArray [i].elapsed
  112.     ds.minute := ds.minute + et_toMinutes (ds.tick)
  113.     ds.tick := ds.tick - (et_toMinutes (ds.tick) * 3000)
  114.     WriteF ('\nid=\d, visits=\d, minute=\d, tick=\d, name=\s',
  115.             i,
  116.             et_procInfoArray [i].visits,
  117.             ds.minute,
  118.             ds.tick,
  119.             et_procInfoArray [i].name)
  120.     totalMinute := totalMinute + ds.minute
  121.     totalTick := totalTick + ds.tick
  122.   ENDFOR
  123.   totalMinute := totalMinute + et_toMinutes (totalTick)
  124.   totalTick := totalTick - (et_toMinutes (totalTick) * 3000)
  125.   WriteF ('\ntotalMinute=\d totalTick=\d\n', totalMinute, totalTick)
  126. ENDPROC
  127.  
  128. PROC et_stopTimer ()
  129.   DEF current : datestamp,
  130.       started : PTR TO datestamp,
  131.       elapsed : PTR TO datestamp
  132.   VOID DateStamp (current)
  133.  
  134.   /* Update the elapsed time of the child proc that id returning control */
  135.   /* to the parent.  None if et_idRunning = -1 (PROC main () is the      */
  136.   /* *only* case.)                                                       */
  137.   started := et_procInfoArray [et_idRunning].started
  138.   elapsed := et_procInfoArray [et_idRunning].elapsed
  139.     IF current.tick < started.tick
  140.       current.tick := current.tick + (50 * 60)
  141.       current.minute := current.minute - 1
  142.     ENDIF
  143.   elapsed.tick := elapsed.tick + (current.tick - started.tick)
  144.   elapsed.minute := elapsed.minute + (current.minute - started.minute)
  145.  
  146.   /* Update the start time of the parent proc.  None if et_idRunning = -1 */
  147.   /* (PROC main () is the *only* case.)                                   */
  148.   et_idRunning := st_pop (et_stack)
  149.   IF et_idRunning > -1
  150.     started := et_procInfoArray [et_idRunning].started
  151.     started.minute := current.minute
  152.     started.tick := current.tick
  153.   ELSE
  154.     et_report ()
  155.   ENDIF
  156. ENDPROC
  157.  
  158. PROC readStr (handle, buffer)
  159. /* Differs from E's ReadStr() in that it returns the string's length. */
  160.   DEF bytes, strMax, eoln
  161.   strMax := StrMax (buffer)
  162.   bytes := Read (handle, buffer, strMax)
  163.   eoln := InStr (buffer, '\n', 0)
  164.   IF eoln > -1
  165.     Seek (handle, -(bytes - eoln - 1), OFFSET_CURRENT)
  166.     buffer [eoln] := 0
  167.   ELSE
  168.     buffer [bytes] := 0
  169.     eoln := IF bytes = 0 THEN -1 ELSE bytes
  170.   ENDIF
  171. ENDPROC  eoln
  172.   /* readStr */
  173.  
  174. PROC main () HANDLE
  175.   DEF fh, fho, s, l
  176.   s := String (80)
  177.   fho := Open ('rwt4.out', NEWFILE)
  178.   IF (fh := Open ('testfile.txt', OLDFILE))
  179.     et_startTimer (0, 'readStr() [rewrite #2 with opt]')
  180.     WHILE (l := readStr (fh, s)) > -1
  181.       Write (fho, s, l)
  182.       Out (fho, '\n')
  183.     ENDWHILE
  184.     et_stopTimer ()
  185.     Close (fh)
  186.   ENDIF
  187.   Close (fho)
  188.   CleanUp (0)
  189. EXCEPT
  190.   IF fh THEN Close (fh)
  191.   IF fho THEN Close (fho)
  192.   IF exception = ER_MEM THEN WriteF ('Not enough memory.\n')
  193.   CleanUp (0)
  194. ENDPROC
  195.