home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / Assembleur / ESA.lha / ESA / examples / sss / opt.ei < prev    next >
Text File  |  1998-10-30  |  7KB  |  242 lines

  1. *******************************************************************************
  2. * ParseCmdLn v1.1.2
  3. *******************************************************************************
  4. * INFO    executes the parsing of a command line and sets the variables
  5. *    accordingly
  6. * SYNOPSIS    success = ParseCmdLn[StrPtr]
  7. *    d0            a0
  8. * IN    StrPtr    ptr to command line string
  9. * OUT    success    0=ERROR! else OK
  10. * MODIFIES    FileName    filled with the input filename
  11. *    BaseName    filled with the base name (if specified)
  12. *    flags    bit # F_QUIETMODE updated
  13. *******************************************************************************
  14.  
  15.     function ParseCmdLn[a0],a0:d0
  16.  
  17.     moveq.l    #0,d0    ;retcode
  18.  
  19.     SkipSpaces[a0]
  20.     when.s #"-q"=(a0).w    ;if quiet mode
  21.      bset.b    #F_QUIETMODE,flags    ;set appropriate flag
  22.      addq.l    #2,a0    ;skip "-q"
  23.      SkipSpaces[a0]
  24.     ewhen
  25.  
  26.     when.s GetFName[sav:a0,#InFile]    ;if InFile specified (correctly)
  27.      SkipSpaces[a0]
  28.  
  29.      move.l    Valu[a0],ChnkSize    ;get chunk length
  30.      when.s d0 & {#$7fffffff╗=d0}    ;d0 returned by Valu[]
  31.       SkipSpaces[a0]
  32.       when.s ~GetFName[a0,#OutBase]    ;if OutBase not specified (correctly)
  33.        clr.b    OutBase    ;void its path
  34.       ewhen
  35.       moveq.l    #-1,d0    ;cmdline is good
  36.      othw
  37.       moveq.l    #0,d0    ;error
  38.      ewhen
  39.  
  40.     ewhen
  41.  
  42.     efunc
  43.  
  44. *******************************************************************************
  45. * GetFName v1.1.1
  46. *******************************************************************************
  47. * INFO    copies a filename, discarding the ""s or ''s (if present);
  48. *    it stops at the first ENTER,BLANK or SPACE and NULL-terminates
  49. *    the string copied
  50. * SYNOPSIS    NewStrPtr = GetFName[StrPtr,DstBuf]
  51. *    a0            a1     a2
  52. * IN    StrPtr    ptr to string (filename)
  53. *    DstBuf    adr of destination buffer
  54. * OUT    NewStrPtr    ptr after source filename (0 if ERROR!)
  55. * WARNING    be careful there is *no* check!!!
  56. *******************************************************************************
  57.  
  58.     function    GetFName[a1-a2],d0/a1-a2:a0
  59.  
  60.     move.b    (a1),d0    ;get the 1st char
  61.  
  62.     when.s {#"'"=d0.b}|{#'"'=d0.b}    ;if quoted...
  63.      CpyQtd.s[a1,a2]    ;returns in a0.l
  64.  
  65.     owhen {#0=d0.b}|{#10=d0.b}|{#' '=d0.b} ;else if BLANK or ENTER...
  66.      suba.l    a0,a0    ;error!
  67.  
  68.     othw
  69.      addq.l    #1,a1    ;skip char already picked
  70.      repeat
  71.       move.b    d0,(a2)+    ;store char
  72.       move.b    (a1)+,d0    ;get new char
  73.      until.s {#0=d0.b}|{#10=d0.b}|{#' '=d0.b}
  74.      clr.b    (a2)    ;NULL-terminated
  75.      movea.l    a1,a0    ;update source ptr
  76.     ewhen
  77.  
  78.     pop
  79.  
  80. *******************************************************************************
  81. * CpyQtd v1.1.1
  82. *******************************************************************************
  83. * INFO    copies a string enclosed between two quotes: it is considered
  84. *    a "quote" the first char of the string;
  85. *    the copy is NULL-terminated;
  86. *    it fails at the first ENTER or BLANK
  87. * SYNOPSIS    CpyQtd[StrPtr,DstBuf]
  88. *           a1     a2
  89. * IN    StrPtr    ptr to string (filename)
  90. *    DstBuf    adr of destination buffer
  91. * MODIFIES    a0.l    ptr after string (0 if ERROR!)
  92. * WARNING    be careful there is *no* check!!!
  93. * NOTE    local proc of GetFName[]
  94. *******************************************************************************
  95. *
  96.     procedure loc:CpyQtd[a1-a2],d0-d1/a1-a2
  97.     move.b    (a1)+,d0    ;get "quote"
  98.     repeat
  99.      move.b    (a1)+,d1
  100.  
  101.      switch.s d1.b
  102.      -> d0        ;successful copy
  103.       clr.b    (a1)    ;NULL-termination
  104.       moveq.l    #0,d1    ;exit loop
  105.      -> #0        ;unvalid char, exit loop
  106.       suba.l    a1,a1    ;error
  107.      -> #10        ;unvalid char
  108.       moveq.l    #0,d1    ;exit loop
  109.       suba.l    a1,a1    ;error
  110.      def
  111.       move.b    d1,(a2)+    ;copy char
  112.      eswitch
  113.  
  114.     until.s ~d1.b
  115.     movea.l    a1,a0    ;new string ptr
  116.  
  117.     eproc
  118. *
  119. *******************************************************************************
  120.  
  121.     efunc
  122.  
  123.  
  124. *******************************************************************************
  125. * Settings v1.0.4
  126. *******************************************************************************
  127. * INFO    reserves the memory and opens the files according to the values
  128. *    retrived by ParseCmdLine[]
  129. * SYNOPSIS    ErrCode = Settings[]
  130. *    d0
  131. * OUT    ErrCode    0=OK, else E_xxxxxx (see defs.i)
  132. * REQUIRES    _DOSName    address of "dos.library",0
  133. *******************************************************************************
  134.  
  135.     function    Settings[],d1/a0-a1/a6:d0
  136.  
  137.     move.l    ChnkSize,d0
  138.     moveq.l    #0,d1    ;best available mem
  139.     movea.l    4.w,a6
  140.     jsr    (_LVOAllocMem,a6)
  141.  
  142.     when d0.l        ;if enough mem 4 a whole
  143.      move.l    ChnkSize,WrkBufLen    ;chunk, bufsize=chunksize
  144.     othw        ;else alloc biggest buf available
  145.      move.l    #MEMF_LARGEST,d1
  146.      jsr    (_LVOAvailMem,a6)
  147.      move.l    d0,WrkBufLen    ;size of biggest buf
  148.      moveq.l    #0,d1    ;best available mem
  149.      jsr    (_LVOAllocMem,a6)
  150.     ewhen
  151.  
  152.     when d0.l        ;if buf successfully reserved
  153.      move.l    d0,WrkBufAdr    ;keep buf adr
  154.      move.l    #InFile,d1
  155.      move.l    #MODE_OLDFILE,d2
  156.      movea.l    _DOSBase,a6
  157.      jsr    (_LVOOpen,a6)
  158.  
  159.      when d0.l
  160.       move.l    d0,InFileHnd    ;store handle
  161.  
  162.       lea.l    OutBase,a0
  163.       when.s    ~(a0).b    ;if no OutBase specified
  164.        lea.l    InFile,a1    ;copy source filename
  165.        repeat
  166.         move.b    (a1)+,d0
  167.         move.b    d0,(a0)+
  168.        until ~d0.b
  169.  
  170.       othw
  171.        while (a0)+.b    ;find end of OutBase
  172.        ewhile
  173.       ewhen
  174.  
  175.       move.b    #'.',(-1,a0)    ;extension dot
  176.       move.l    a0,ExtnAdr    ;store ptr to final BLANK
  177.  
  178.       move.l    GetFileSize[InFileHnd],InFileSze
  179.       divul.l    ChnkSize,d1:d0    ;d0=max chunk #
  180.       when.s ~d1.l
  181.        subq.l    #1,d0    ;max chunk #
  182.       ewhen
  183.       when.s #MAXCHNKSNMB╗d0    ;if reasonable # of chunks
  184.        move.l    d0,MaxChnk
  185.        moveq.l    #1,d1    ;min # of digits
  186.        while.s #10½=d0.l
  187.         addq.l    #1,d1    ;1 more digit needed
  188.         divu.l    #10,d0
  189.        ewhile
  190.        move.l    d1,DgtNmb
  191.        moveq.l    #0,d0    ;no error
  192.       othw
  193.        moveq.l    #E_CHNKNB,d0    ;too many chunks
  194.       ewhen
  195.  
  196.      othw
  197.       moveq.l    #E_SOUFLE,d0
  198.      ewhen
  199.  
  200.     othw
  201.      moveq.l    #E_LOWMEM,d0    ;not enough mem
  202.     ewhen
  203.  
  204.     efunc
  205.  
  206. *******************************************************************************
  207. * GiveInfo v1.0.0
  208. *******************************************************************************
  209. * INFO    prints some info about the current operations
  210. * SYNOPSIS    GiveInfo[]
  211. * NOTE    - Print[] and Stru[] always called without "sav:"
  212. *      (regs already saved)
  213. *    - uses TmpBuf
  214. *******************************************************************************
  215.  
  216.     procedure GiveInfo[],d0-d2/a0
  217.     Print[#txt_InfoFName]
  218.     Print[#InFile]
  219.     Print[#txt_ENTER]    ;show source name
  220.  
  221.     Print[#txt_InfoOFile]
  222.     Stru[#0,ExtnAdr,DgtNmb]    ;build 1st extension
  223.     Print[#OutBase]    ;show 1st chunk filename
  224.  
  225.     when.s MaxChnk.l    ;if 2+ chunks
  226.      Print[#txt_InfoArrow]
  227.      Stru[MaxChnk,ExtnAdr,DgtNmb]    ;build last extension
  228.      Print[#OutBase]    ;show last chunk filename
  229.     ewhen
  230.     Print[#txt_ENTER]
  231.  
  232.     Print[#txt_InfoCSize]
  233.     Stru[ChnkSize,#TmpBuf,#10]
  234.     Print[#TmpBuf]    ;show chunk size
  235.     Print[#txt_InfoBytes]
  236.  
  237.     Print[#txt_InfoBSize]
  238.     Stru[WrkBufLen,#TmpBuf,#10]
  239.     Print[#TmpBuf]    ;show buffer size
  240.     Print[#txt_InfoBytes]
  241.     eproc
  242.