home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 155_01 / onedlib.c < prev    next >
Text File  |  1979-12-31  |  3KB  |  183 lines

  1. /* HEADER: xxx.yy;
  2.    TITLE: ONED;
  3.    DATE: 8/18/83;
  4.    DESCRIPTION: "UNIX like library functions called by oned
  5.       fgets -- Read one line.
  6.       setjmp -- Save registers for later restoration by longjmp.
  7.       longjmp -- Transfer execution to previously called setjmp.
  8.       Coded in 8080 assembly language for use with C/80 compiler.";
  9.    KEYWORDS: UNIX library;
  10.    FILENAME: ONEDLIB.C;
  11.    CRC: xxxx;
  12.    SYSTEM: CP/M;
  13.    COMPILERS: C/80;
  14.    AUTHORS: David L. Fox;
  15.    REFERENCES: AUTHORS: Edward K. Ream;
  16.          TITLE: "RED--A Better C Screen Editor, Part II";
  17.          CITATION: "Doctor Dobb's Journal 82, 89(August 1983).";
  18.       ENDREF
  19. */
  20. /* Library functions needed to simulate a UNIX like environment. */
  21.  
  22. /* fgets(s, n, fdesc) reads n-1 characters, or up to a new-line
  23.    (which is retained), whichever comes first, from the file
  24.    specified by fdesc into s.  s is null terminated.  Fgets returns
  25.    its first argument.  Returns NULL on EOF. */
  26.  
  27. char *
  28. fgets(s, n, fdesc)
  29. char *s;
  30. int n, fdesc;
  31. {
  32. /*    char *t;
  33. /*    int i, c;
  34. /*    
  35. /*    t=s;
  36. /*    for (i = 0; (c = getc(fdesc)) != '\n'; ++i, ++s)
  37. /*    {    if (c == EOF) return(NULL);
  38. /*        *s = c;
  39. /*        if (i == n-1)
  40. /*        {
  41. /*            *s = '\0';    /* need to ungetc(c); here */
  42. /*            return(t);
  43. /*        }
  44. /*    }
  45. /*    *s = c;
  46. /*    *++s = '\0';
  47. /*    return(t);
  48. */
  49. #asm
  50. ; Assembly language version 18 Aug 83
  51.     LXI    H,2
  52.     DAD    SP
  53.     MOV    C,M
  54.     INX    H
  55.     MOV    B,M    ; fdesc into b,c
  56.     INX    H
  57.     MOV    E,M
  58.     INX    H
  59.     MOV    D,M    ; n into d,e
  60.     DCX    D
  61.     INX    H
  62.     MOV    A,M
  63.     INX    H
  64.     MOV    H,M
  65.     MOV    L,A    ; s into h,l
  66.     PUSH    H
  67.     PUSH    H
  68. fg.lp:    MOV    A,E
  69.     ORA    D
  70.     JZ    fg.d1    ; return if n == 0
  71.     PUSH    D
  72.     PUSH    B
  73.     CALL    getc
  74.     POP    B
  75.     MOV    A,H
  76.     ANA    L
  77.     CMA
  78.     ORA    A
  79.     JZ    fg.eof    ; return on EOF
  80.     MOV    A,L    ; char into a
  81.     POP    D
  82.     POP    H
  83.     MOV    M,A
  84.     INX    H
  85.     PUSH    H    ; save new s
  86.     CPI    10
  87.     JZ    fg.d1    ; check for \n
  88.     DCX    D    ; decrement n
  89.     JMP    fg.lp
  90. fg.eof:    POP    B
  91.     POP    H
  92.     XRA    A
  93.     MOV    M,A
  94.     POP    B
  95.     MOV    H,A
  96.     MOV    L,A    ; return 0
  97.     RET
  98. fg.d1:    POP    H
  99.     XRA    A
  100.     MOV    M,A    ; terminate string
  101.     POP    H
  102.             ; compiler adds return
  103. #endasm
  104. }
  105.  
  106. setjmp(env)
  107. char *env;
  108. {
  109. #asm
  110. ; Version: 7 Aug 83
  111. ;
  112. ; Adapted from deffa.csm  BDS C version 1.46, 3/22/82
  113. ; Original by Leor Zolman
  114. ; Modified by E. K. Ream
  115. ; Published Aug 83 DDJ
  116. ; Modified by DLF for C/80
  117. ;
  118. ; setjmp(env)
  119. ; env is 6 byte environment buffer
  120. ; returns 0 when called, non-zero for return from longjmp
  121. ;
  122.     LXI    H,2        ; get arg into h,l
  123.     DAD    SP
  124.     CALL    h.
  125.     MOV    M,E        ; save d,e
  126.     INX    H
  127.     MOV    M,D
  128.     INX    H
  129.     XCHG        ; save sp
  130.     LXI    H,0
  131.     DAD    SP
  132.     XCHG
  133.     MOV    M,E
  134.     INX    H
  135.     MOV    M,D
  136.     INX    H
  137.     POP    D        ; save return address
  138.     PUSH    D
  139.     MOV    M,E
  140.     INX    H
  141.     MOV    M,D
  142.     LXI    H,0        ; return 0
  143. #endasm
  144. }
  145.  
  146. longjmp(buffer, return_value)
  147. char *buffer;
  148. int return_value;
  149. {
  150. #asm
  151. ;
  152. ;    unlike the BDS C version of this routine,
  153. ;    the return_value is REQUIRED
  154. ;
  155.     LXI    H,4        ; get first arg
  156.     DAD    SP
  157.     CALL    h.
  158.     MOV    C,M        ; restore d,e, put it in b,c
  159.     INX    H
  160.     MOV    B,M
  161.     INX    H
  162.     MOV    E,M        ; restore sp, put it in de
  163.     INX    H
  164.     MOV    D,M
  165.     INX    H
  166.     SHLD    temp_lj    ; save pointer to return address
  167.     LXI    H,2        ; get second arg
  168.     DAD    SP
  169.     CALL    h.
  170.     XCHG        ; old sp into h,l second arg in d,e
  171.     SPHL        ; restore old sp
  172.     POP    H        ; pop return addr off stack
  173.     LHLD    temp_lj    ; get ptr to ra
  174.     CALL    h.        ; new ret. addr. into h,l
  175.     XCHG        ; ra in d,e ret val in h,l
  176.     PUSH    D
  177.     MOV    D,B    ; copy bc to de
  178.     MOV    E,C
  179.     RET
  180. temp_lj: DS    2
  181. #endasm
  182. }
  183.