/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */ /*********************************************************************/ /* file: files.c - funtions for logfile and reading/writing comfiles */ /* TINTIN + + */ /* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */ /* coded by peter unold 1992 */ /* New code by Bill Reiss 1993 */ /*********************************************************************/ /* file @@@added -- perry */ #ifdef HAVE_STRING_H #include <string.h> #else #ifdef HAVE_STRINGS_H #include <strings.h> #endif #endif #include "tintin.h" int mygets(buf, size, fp) char *buf; int size; FILE *fp; { char *ptr = buf; char c; int cmt, brace; cmt = FALSE; brace = 0; do { c = getc(fp); } while (isspace(c)); if (c == EOF) return 0; while (1) { switch (c) { case '{': *ptr++ = c; brace++; break; case '}': *ptr++ = c; brace--; break; case '/': if ((c = getc(fp)) == '*') { while (1) { if ((c = getc(fp)) == '*') { if ((c = getc(fp)) == '/') break; } if (c == EOF) { *ptr++ = '\0'; return 1; } } } else if (c == '/') { while ((c = getc(fp)) != '\n') { if (c == EOF) { *ptr++ = '\0'; return 1; } } } else { *ptr++ = '/'; ungetc(c, fp); } break; case '\\': switch ((c = getc(fp))) { case '[': *ptr++ = '\033'; break; default: *ptr++ = '\\'; ungetc(c, fp); break; } break; case '\n': case '\r': if (brace <= 0) { *ptr++ = '\0'; return 1; } do { c = getc(fp); } while (isspace(c)); ungetc(c, fp); break; case '\0': *ptr++ = c; return 1; case EOF: *ptr++ = '\0'; return 1; default: *ptr++ = c; break; } if (ptr - buf >= size) return 1; c = getc(fp); } return 0; }