version 1.14, 2008/10/09 10:58:32 |
version 1.15, 2008/10/16 16:34:32 |
|
|
#include <ctype.h> |
#include <ctype.h> |
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
|
#include <limits.h> |
#include <regex.h> |
#include <regex.h> |
#include <stddef.h> |
#include <stddef.h> |
#include <stdio.h> |
#include <stdio.h> |
|
|
* together. Empty strings and files are ignored. |
* together. Empty strings and files are ignored. |
*/ |
*/ |
char * |
char * |
cu_fgets(char **outbuf, size_t *outlen) |
cu_fgets(char **outbuf, size_t *outsize) |
{ |
{ |
static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF; |
static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF; |
static FILE *f; /* Current open file */ |
static FILE *f; /* Current open file */ |
|
|
size_t len; |
size_t len; |
char *p; |
char *p; |
|
|
|
if (*outbuf == NULL) |
|
*outsize = 0; |
|
|
again: |
again: |
switch (state) { |
switch (state) { |
case ST_EOF: |
case ST_EOF: |
|
|
case ST_FILE: |
case ST_FILE: |
if ((p = fgetln(f, &len)) != NULL) { |
if ((p = fgetln(f, &len)) != NULL) { |
linenum++; |
linenum++; |
if (len >= *outlen) { |
if (len >= *outsize) { |
do { |
|
*outlen *= 2; |
|
} while (len >= *outlen); |
|
free(*outbuf); |
free(*outbuf); |
*outbuf = xmalloc(*outlen); |
*outsize = ROUNDLEN(len + 1); |
|
*outbuf = xmalloc(*outsize); |
} |
} |
memcpy(*outbuf, p, len); |
memcpy(*outbuf, p, len); |
(*outbuf)[len] = '\0'; |
(*outbuf)[len] = '\0'; |
|
|
if (linenum == 0 && s[0] == '#' && s[1] == 'n') |
if (linenum == 0 && s[0] == '#' && s[1] == 'n') |
nflag = 1; |
nflag = 1; |
p = *outbuf; |
p = *outbuf; |
len = *outlen; |
len = *outsize; |
for (;;) { |
for (;;) { |
if (len-- <= 1) { |
if (len <= 1) { |
*outbuf = xrealloc(*outbuf, *outlen * 2); |
*outbuf = xrealloc(*outbuf, |
p = *outbuf + *outlen - len - 1; |
*outsize + _POSIX2_LINE_MAX); |
len += *outlen; |
p = *outbuf + *outsize - len; |
*outlen *= 2; |
len += _POSIX2_LINE_MAX; |
|
*outsize += _POSIX2_LINE_MAX; |
} |
} |
switch (*s) { |
switch (*s) { |
case '\0': |
case '\0': |
|
|
return (*outbuf); |
return (*outbuf); |
default: |
default: |
*p++ = *s++; |
*p++ = *s++; |
|
len--; |
} |
} |
} |
} |
} |
} |