home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d09xx / d0904.lha / Fill / Source / cf.e next >
Text File  |  1993-08-26  |  3KB  |  159 lines

  1. /* Creates a file of size specified in command line. */
  2.  
  3.  
  4.  
  5.  
  6. MODULE 'dos/Dos'
  7.  
  8.  
  9.  
  10. /* Runtime exceptions. */
  11. ENUM ER_NONE,
  12.      ER_USAGE,
  13.      ER_MEM,
  14.      ER_OUTFILE
  15.  
  16.  
  17.  
  18. /*=== Command-line Argument Parser =======================================*/
  19.  
  20. CONST BUFSIZE = 488
  21.  
  22. DEF argFileSize,
  23.     argDestPath = NIL
  24.  
  25.  
  26.  
  27. PROC skipSpaces (bool, theString, startPos)
  28.   DEF char [1] : STRING,
  29.       endPos, length
  30.  
  31.   length := StrLen (theString)
  32.   IF startPos = length THEN RETURN startPos
  33.  
  34.   endPos := startPos
  35.   MidStr (char, theString, endPos, 1)
  36.   WHILE (StrCmp (char, ' ', 1)) = bool
  37.      /* bool=TRUE then skip space; bool=FALSE then skip non-space */
  38.     IF endPos = length THEN RETURN endPos
  39.     INC endPos
  40.     MidStr (char, theString, endPos, 1)
  41.   ENDWHILE
  42. ENDPROC endPos
  43.   /* skipSpaces */
  44.  
  45.  
  46. PROC getArg (theArg, index)
  47.   DEF startPos, endPos,
  48.       i, length
  49.  
  50.   IF arg [] <= 0
  51.     StrCopy (theArg, '', ALL)
  52.     RETURN FALSE
  53.   ENDIF
  54.  
  55.   length := StrLen (arg)
  56.   startPos := 0
  57.   endPos := skipSpaces (FALSE, arg, startPos)
  58.  
  59.   FOR i := 2 TO index
  60.     startPos := skipSpaces (FALSE, arg, startPos)
  61.     startPos := skipSpaces (TRUE, arg, startPos)
  62.     IF startPos = length
  63.       /* Request past end of argument is invalid. */
  64.       StrCopy (theArg, '', ALL)
  65.       RETURN FALSE
  66.     ENDIF
  67.     endPos := skipSpaces (FALSE, arg, startPos)
  68.   ENDFOR
  69.  
  70.   MidStr (theArg, arg, startPos, (endPos - startPos))
  71.  
  72. ENDPROC TRUE
  73.   /* getArg */
  74.  
  75.  
  76.  
  77. PROC parseCommandLineArguments () HANDLE
  78.   DEF index = 1,
  79.       theArg
  80.  
  81.   theArg := String (StrLen (arg))
  82.   IF theArg = NIL THEN Raise (ER_MEM)
  83.  
  84.   FOR index := 1 TO 2
  85.     IF getArg (theArg, index)
  86.       IF index = 1
  87.           argFileSize := Val (theArg, NIL)
  88.           IF argFileSize < 0 THEN Raise (ER_USAGE)
  89.       ELSE  /* Last arg, must be DestPath. */
  90.         argDestPath := String (StrLen (theArg))
  91.         IF argDestPath = NIL THEN Raise (ER_MEM)
  92.         StrCopy (argDestPath, theArg, ALL)
  93.       ENDIF
  94.     ENDIF
  95.   ENDFOR
  96.  
  97.   Dispose (theArg)
  98.  
  99. EXCEPT
  100.  
  101.   IF theArg THEN Dispose (theArg)
  102.   Raise (exception)
  103.  
  104. ENDPROC
  105.   /* parseCommandLineArguments */
  106.  
  107.  
  108. /*=== End Command-line Argument Parser ===================================*/
  109.  
  110.  
  111. PROC main () HANDLE
  112.   DEF destFileHandle = NIL,
  113.       numberOfWrites,
  114.       bytesWritten,
  115.       buffer, i
  116.  
  117.   IF arg [] = 0 THEN Raise (ER_USAGE)
  118.  
  119.   parseCommandLineArguments ()
  120.   IF argDestPath = NIL THEN Raise (ER_USAGE)
  121.  
  122.   buffer := String (BUFSIZE)
  123.   IF buffer = NIL THEN Raise (ER_MEM)
  124.   FOR i := 1 TO BUFSIZE DO StrAdd (buffer, 'x', ALL)
  125.  
  126.   WriteF ('\n\nCreating file: \s', argDestPath)
  127.  
  128.   destFileHandle := Open (argDestPath, NEWFILE)
  129.   IF destFileHandle = NIL THEN Raise (ER_OUTFILE)
  130.  
  131.   numberOfWrites := argFileSize / BUFSIZE
  132.   FOR i := 1 TO numberOfWrites
  133.     bytesWritten := Write (destFileHandle, buffer, BUFSIZE)
  134.     IF bytesWritten < BUFSIZE THEN Raise (ER_OUTFILE)
  135.   ENDFOR
  136.   FOR i := 1 TO (argFileSize - (numberOfWrites * BUFSIZE)) DO Out (destFileHandle, 'x')
  137.  
  138.   Close (destFileHandle)
  139.  
  140.   WriteF ('\nDone.\n\n')
  141.  
  142.   CleanUp (0)
  143.  
  144. EXCEPT
  145.  
  146.   IF destFileHandle THEN Close (destFileHandle)
  147.  
  148.   SELECT exception
  149.     CASE ER_USAGE;             WriteF ('\nUsage:  CreateFile <bytes> <filespec>')
  150.     CASE ER_MEM;               WriteF ('\nInsufficient memory.')
  151.     CASE ER_OUTFILE;           WriteF ('\nError opening or writing to file.')
  152.   ENDSELECT
  153.  
  154.   WriteF ('\n\n')
  155.  
  156.   CleanUp (exception)
  157.  
  158. ENDPROC
  159.