/* ** ** Copyright (C) 1993 Swedish University Network (SUNET) ** ** ** This program is developed by UDAC, Uppsala University by commission ** of the Swedish University Network (SUNET). ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITTNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ** ** ** Martin.Wendel@its.uu.se ** Torbjorn.Wictorin@its.uu.se ** ** ITS ** P.O. Box 887 ** S-751 08 Uppsala ** Sweden ** */ #include #include #include "emil.h" #define MAXSZ 16*1024 /* Maximum amount to allocate */ #define MULTF 2 /* Increase factor */ #ifdef SIGDANGER extern int psdanger(int); #endif long memall = 0; extern int in_fd; static void * Zalloc(void * old, off_t prevsize, off_t newsize) { /* Allocate memory */ void * Z; memall = memall + newsize - prevsize; #ifdef DEBUG alloc_total += newsize - prevsize; if (edebug) { fprintf(stderr, "* Allocated %lu, new total: %lu\n", newsize - prevsize, alloc_total); fflush(stderr); } #endif if (old == NULL) { assert (prevsize == 0); Z = malloc((size_t)newsize); } else { assert (prevsize != 0); assert (prevsize < newsize); Z = realloc(old,(size_t)newsize); } if (Z == NULL) { logger(LOG_ERR,"load_data cannot allocate memory"); closelog(); fprintf(stderr, "Emil: load_data: cannot allocate memory (using %lu bytes)\n", memall); fflush(stderr); exit(EX_OSERR); } memset(((char *) Z) + prevsize, 0, newsize - prevsize); return Z; } struct data * load_data() { struct data *out; long chunk; #ifdef SIGDANGER long border; #endif char * tmp; int l; int left; #ifdef DEBUG if (edebug) fprintf(stderr, "* Load data\n"); #endif /* Allocate an output struct */ out = (struct data *) Yalloc(sizeof(struct data)); /* And an initial output buffer */ chunk = pz; left = chunk; out->contents = (char *) Zalloc(NULL,0,chunk); out->size = chunk; /* Read all on standard input and reallocate buffer if required */ while ((l=read(in_fd, (out->contents + out->end), chunk - 1)) > 0) { out->end += l; left -= l; if (left < chunk) { chunk *= MULTF; if (chunk > MAXSZ) chunk = MAXSZ; #ifdef SIGDANGER border = (psdanger(SIGDANGER) * pz) / 2; if (chunk > border) chunk = border; #endif #ifdef DEBUG if (edebug) fprintf(stderr, "read %d characters\n", l); if (edebug) fprintf(stderr,"load_data: realloc %lud to %lud\n", out->size,chunk + out->size); #endif out->contents = (char *)Zalloc(out->contents,out->size,out->size+chunk); out->size += chunk; left += chunk; } } out->contents[out->end] = 0; /* Count number of lines */ for ( tmp = out->contents, out->lend = 0; (tmp= index(tmp,'\n')) != NULL; tmp++) out->lend++; return(out); } int append_data(struct data *d, char *c, int len, int busize) { if (d->size == 0) { if ((d->contents = Zalloc(NULL, 0, busize)) == NULL) return(NOK); d->size = busize; } while ((len + d->end + 2) > d->size) /* TW 941220 */ { if ((d->contents = Zalloc(d->contents,d->size,d->size+busize)) == NULL) return(NOK); d->size += busize; } /* bcopy(c, (d->contents + d->end), len); */ memcpy((d->contents + d->end), c, (off_t) len); d->end += len; d->bodyend += len; *(d->contents + d->end) = '\0'; return(OK); } int append_char(struct data *d, char c, int busize) { if (d->size == 0) { if ((d->contents = Zalloc(NULL, 0, busize)) == NULL) return(NOK); d->size = busize; } while ((3 + d->end) > d->size) { if ((d->contents = Zalloc(d->contents,d->size,d->size+busize)) == NULL) return(NOK); d->size += busize; } *(d->contents + d->end) = c; d->end += 1; d->bodyend += 1; *(d->contents + d->end) = '\0'; return(OK); }