/* 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;
}