home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 223_02 / fgets.mac < prev    next >
Text File  |  1989-02-23  |  3KB  |  130 lines

  1.  
  2. ;
  3. ;    fgets(cp,len,unit)
  4. ;
  5. ;
  6. CBDOS    EQU    5    ;/* bdos entry point */
  7. CPMARG    EQU    128    ;/* CP/M command line */
  8. MAXARG    EQU    32    ;/* Maximum number of input args */
  9. STDIN    EQU    0
  10. STDOUT    EQU    1
  11. STDERR    EQU    2
  12. STDLST    EQU    4
  13. CTRLZ    EQU    26    ;control z
  14. NULL    EQU    0    ;pointer to nothing
  15. FCBSIZE    EQU    36    ;size, in bytes, of an FCB
  16. NEXTP    EQU    0    ;offset    to next-character pointer in I/O structure
  17. UNUSED    EQU    2    ;offset    to unused-positions-count in I/O structure
  18. BUFFER    EQU    6    ;offset    to disk    sector buffer in I/O structure
  19. UNGOT    EQU    5    ;offset to char ungotten by ungetc()
  20. FLAG    EQU    33    ;file-type flag    byte (in unused    part of    FCB)
  21. FREEFLG    EQU    128    ;This I/O structure is available for the taking
  22. EOFFLG    EQU    2    ;The end of this file has been hit
  23. WRTFLG    EQU    1    ;This file open    for writing
  24. BUFSIZ    EQU    1024    ;how long the sector buffer is
  25. NBUFS    EQU    8    ;number    of I/O buffers
  26. TBUFF    EQU    128    ;default cpm buffer
  27. LF    EQU    10
  28. EOL    EQU    13
  29. ;
  30. ; CP/M BDOS CALLS 
  31. ;
  32. CLOSE    EQU    16    ;close a file
  33. CPMSTR    EQU    9    ;print '$' delimited string on console
  34. CREATE    EQU    22    ;make a    file
  35. DMA    EQU    26    ;set DMA (I/O address)
  36. DELETE    EQU    19    ;delete    a file
  37. GETCH    EQU    1    ;read character    from console
  38. GETSTR    EQU    10    ;read string from console
  39. LSTOUT    EQU    5    ;write character to list device
  40. OPEN    EQU    15    ;open a    file
  41. PUTCH    EQU    2    ;write character to console
  42. QUERY    EQU    25    ;get logged-in drive id
  43. READ    EQU    20    ;read a    sector
  44. SELECT    EQU    14    ;log-in    a drive
  45. WRITE    EQU    21    ;write a sector
  46. ;
  47. ;    File i/o storage varibles found in ulink()
  48. ;
  49. EXTRN    ZZUNIT
  50. EXTRN    ZZIP
  51. EXTRN    ZZCHP
  52. EXTRN    ZZDP
  53. EXTRN    ZZFILE
  54. EXTRN    ZZMODE
  55. EXTRN    ZZCH
  56. EXTRN    ZZT
  57. EXTRN    ZZFN
  58. EXTRN    ZZNUBU
  59. EXTRN    ZZMXSC
  60. ;
  61. ;    Characteristics variable storage found in ulink()    
  62. ;
  63. EXTRN    ZZSVCH
  64. EXTRN    ZZDFLT
  65. EXTRN    ZZSTAK
  66. EXTRN    ZZMEM
  67. ;
  68. EXTRN    GETC
  69. EXTRN    GETS
  70. ;
  71. FGETS::
  72.     INX    SP    ; skip rtn addr
  73.     INX    SP
  74.     POP    B    ; unit
  75.     POP    D    ; length
  76.     POP    H    ; cp
  77.     PUSH    H
  78.     PUSH    D
  79.     PUSH    B
  80.     DCX    SP
  81.     DCX    SP
  82.     MOV    A,B        ; if(unit < 256) {
  83.     ORA    A        ;    /* assume stdin    */
  84.     JNZ    FGETS1
  85.     PUSH    H
  86.     CALL    GETS        ;    gets(cp)
  87.     POP    B        ;    return (cp);
  88.     RET            ; } else {
  89. FGETS1:    SHLD    ZZSVCH        ;    save_cp    = cp;
  90.     PUSH    D    ; keep stack right
  91. FGETS2:    POP    D
  92.     DCX    D        ;    while (--len) {
  93.     PUSH    D
  94.     MOV    A,D
  95.     ORA    E
  96.     JZ    FGETS4
  97.     PUSH    H    ; save cp
  98.     PUSH    B    ; unit
  99.     CALL    GETC        ;        c =    getc(unit);
  100.     POP    B
  101.     MOV    A,H        ;        if(c==EOF) /* c>255    */
  102.     ORA    A
  103.     JZ    FGETS3
  104.     POP    D    ; cp
  105.     LHLD    ZZSVCH        ;          if (cp<>save_cp)
  106.     XCHG            ;            /* read    something */
  107.     MOV    A,H
  108.     CMP    D
  109.     JNZ    FGETS4        ;            goto fgets4;
  110.     MOV    A,L
  111.     CMP    E
  112.     JNZ    FGETS4        ;          else
  113.     LXI    H,0        ;            /* no characters */
  114.     POP    D    ; fix stack
  115.     RET            ;            return (NULL);
  116. FGETS3:    MOV    A,L        ;        else {
  117.     POP    H
  118.     MOV    M,A        ;        *cp++ =    c;
  119.     INX    H
  120.     ANI    7FH        ;         /*    mask parity in compare */
  121.     CPI    EOL        ;        if(c=='\n')
  122.     JNZ    FGETS2
  123. FGETS4:    MVI    M,0        ;            *cp='\0';
  124.     POP    D    ; fix stack
  125.     LHLD    ZZSVCH        ;            return save_cp;
  126.     RET            ; }    }    }    }
  127.  
  128.     END
  129.  
  130.