|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #if defined(LIBC_SCCS) && !defined(lint) ! 19: .asciz "@(#)gets.s 5.4 (Berkeley) 6/27/88" ! 20: #endif /* LIBC_SCCS and not lint */ ! 21: ! 22: /* ! 23: * char *gets(s); ! 24: * char *s; ! 25: * ! 26: * argument: a target string ! 27: * side effects: reads bytes up to and including a newline from the ! 28: * standard input into the target string and replaces the newline ! 29: * with a null to null-terminate the string. ! 30: * result: the target string if successful, 0 otherwise. ! 31: */ ! 32: ! 33: #include "DEFS.h" ! 34: ! 35: #define NL 0xa ! 36: ! 37: ENTRY(gets, R11|R10) ! 38: ! 39: #define S r11 ! 40: movl 4(ap),S ! 41: #define IPTR r10 ! 42: #define _CNT ! 43: #define _PTR 4 ! 44: #define _BASE 8 ! 45: #define _BUFSIZ 12 ! 46: #define _FLAG 16 ! 47: movab __iob,IPTR ! 48: ! 49: #define OLD_S 4(ap) ! 50: ! 51: /* ! 52: * If no characters, call _filbuf() to get some. ! 53: */ ! 54: tstl _CNT(IPTR) ! 55: jgtr Lscan ! 56: ! 57: Lloop: ! 58: pushl IPTR ! 59: calls $1,__filbuf ! 60: tstl r0 /* What did _filbuf() return? */ ! 61: jlss Leof ! 62: cmpb r0,$NL ! 63: jneq 1f ! 64: clrb (S) ! 65: jbr Lret ! 66: 1: ! 67: movb r0,(S)+ /* Save the returned character */ ! 68: tstl _BASE(IPTR) /* Is input buffered? */ ! 69: jeql Lloop ! 70: ! 71: /* ! 72: * Look for a newline in the buffer. ! 73: */ ! 74: Lscan: ! 75: locc $NL,_CNT(IPTR),*_PTR(IPTR) ! 76: jeql Lagain ! 77: ! 78: /* ! 79: * Success -- copy the data and return. ! 80: */ ! 81: subl3 r0,_CNT(IPTR),r2 ! 82: subl2 r2,_CNT(IPTR) ! 83: movc3 r2,*_PTR(IPTR),(S) /* Copy the data */ ! 84: clrb (r3) ! 85: movl r1,_PTR(IPTR) ! 86: decl _CNT(IPTR) /* Skip the newline */ ! 87: incl _PTR(IPTR) ! 88: ! 89: /* ! 90: * Normal return. ! 91: */ ! 92: Lret: ! 93: movl OLD_S,r0 ! 94: ret ! 95: ! 96: /* ! 97: * If we run out of characters, copy the buffer and loop. ! 98: */ ! 99: Lagain: ! 100: movc3 _CNT(IPTR),*_PTR(IPTR),(S) /* Copy the data */ ! 101: movl r3,S ! 102: movl _BASE(IPTR),_PTR(IPTR) /* Reset stdio */ ! 103: clrl _CNT(IPTR) ! 104: jbr Lloop ! 105: ! 106: /* ! 107: * End of file? Check to see if we copied any data. ! 108: */ ! 109: Leof: ! 110: cmpl S,OLD_S ! 111: jeql Lerror ! 112: clrb (S) ! 113: jbr Lret ! 114: ! 115: /* ! 116: * Error/eof return -- null pointer. ! 117: */ ! 118: Lerror: ! 119: clrl r0 ! 120: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.