|
|
1.1 ! root 1: /* ugtlin.c ! 2: Read a line with backslash continuations. ! 3: ! 4: Copyright (C) 1992 Ian Lance Taylor ! 5: ! 6: This file is part of the Taylor UUCP uuconf library. ! 7: ! 8: This library is free software; you can redistribute it and/or ! 9: modify it under the terms of the GNU Library General Public License ! 10: as published by the Free Software Foundation; either version 2 of ! 11: the License, or (at your option) any later version. ! 12: ! 13: This library is distributed in the hope that it will be useful, but ! 14: WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 16: Library General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU Library General Public ! 19: License along with this library; if not, write to the Free Software ! 20: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 24: */ ! 25: ! 26: #include "uucnfi.h" ! 27: ! 28: #if USE_RCS_ID ! 29: const char _uuconf_ugtlin_rcsid[] = "$Id: ugtlin.c,v 1.1 93/07/30 08:08:12 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: /* Read a line from a file with backslash continuations. This updates ! 33: the qglobal->ilineno count for each additional line it reads. */ ! 34: ! 35: int ! 36: _uuconf_getline (qglobal, pzline, pcline, e) ! 37: struct sglobal *qglobal; ! 38: char **pzline; ! 39: size_t *pcline; ! 40: FILE *e; ! 41: { ! 42: int ctot; ! 43: char *zline; ! 44: size_t cline; ! 45: ! 46: ctot = -1; ! 47: ! 48: zline = NULL; ! 49: cline = 0; ! 50: ! 51: while (TRUE) ! 52: { ! 53: int cchars; ! 54: ! 55: if (ctot < 0) ! 56: cchars = getline (pzline, pcline, e); ! 57: else ! 58: cchars = getline (&zline, &cline, e); ! 59: if (cchars < 0) ! 60: { ! 61: if (zline != NULL) ! 62: free ((pointer) zline); ! 63: if (ctot >= 0) ! 64: return ctot; ! 65: else ! 66: return cchars; ! 67: } ! 68: ! 69: if (ctot < 0) ! 70: ctot = cchars; ! 71: else ! 72: { ! 73: if (*pcline <= ctot + cchars) ! 74: { ! 75: char *znew; ! 76: ! 77: if (*pcline > 0) ! 78: znew = (char *) realloc ((pointer) *pzline, ! 79: (size_t) (ctot + cchars + 1)); ! 80: else ! 81: znew = (char *) malloc ((size_t) (ctot + cchars + 1)); ! 82: if (znew == NULL) ! 83: { ! 84: free ((pointer) zline); ! 85: return -1; ! 86: } ! 87: *pzline = znew; ! 88: *pcline = ctot + cchars + 1; ! 89: } ! 90: ! 91: memcpy ((pointer) ((*pzline) + ctot), (pointer) zline, ! 92: (size_t) (cchars + 1)); ! 93: ctot += cchars; ! 94: } ! 95: ! 96: if (ctot < 2 ! 97: || (*pzline)[ctot - 1] != '\n' ! 98: || (*pzline)[ctot - 2] != '\\') ! 99: { ! 100: if (zline != NULL) ! 101: free ((pointer) zline); ! 102: return ctot; ! 103: } ! 104: ! 105: ++qglobal->ilineno; ! 106: ! 107: ctot -= 2; ! 108: (*pzline)[ctot] = '\0'; ! 109: } ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.