225 |
|
{ |
226 |
|
int incomm = 0; |
227 |
|
char *cp = buf; |
228 |
< |
char dummyc; |
228 |
> |
char dummys[2]; |
229 |
|
int c; |
230 |
|
|
231 |
|
if ((buf == NULL) | (len <= 0)) { |
232 |
< |
buf = &dummyc; |
233 |
< |
len = 1; |
232 |
> |
buf = dummys; |
233 |
> |
len = sizeof(dummys); |
234 |
|
} |
235 |
|
while ((c = getc(fp)) != EOF && |
236 |
|
(isspace(c) || (incomm += (c == '!')))) { |
237 |
|
if (c == '\n') |
238 |
|
incomm = 0; |
239 |
< |
if (cp-buf < len-1) |
239 |
> |
if (cp-buf < len-2) |
240 |
|
*cp++ = c; |
241 |
+ |
else if (cp-buf == len-2) |
242 |
+ |
*cp++ = '\n'; |
243 |
|
} |
244 |
|
*cp = '\0'; |
245 |
|
if (c != EOF) |
250 |
|
IDF_OBJECT * |
251 |
|
idf_readobject(IDF_LOADED *idf, FILE *fp) |
252 |
|
{ |
253 |
< |
char abuf[IDF_MAXARGL], cbuf[IDF_MAXLINE]; |
253 |
> |
char abuf[IDF_MAXARGL], cbuf[100*IDF_MAXLINE]; |
254 |
|
int delim; |
255 |
|
IDF_OBJECT *pnew; |
256 |
|
|
257 |
|
if ((delim = idf_read_argument(abuf, fp, 1)) == EOF) |
258 |
|
return(NULL); |
259 |
< |
idf_read_comment(cbuf, IDF_MAXLINE, fp); |
259 |
> |
idf_read_comment(cbuf, sizeof(cbuf), fp); |
260 |
|
pnew = idf_newobject(idf, abuf, cbuf, NULL); |
261 |
|
while (delim == ',') |
262 |
|
if ((delim = idf_read_argument(abuf, fp, 1)) != EOF) { |
263 |
< |
idf_read_comment(cbuf, IDF_MAXLINE, fp); |
263 |
> |
idf_read_comment(cbuf, sizeof(cbuf), fp); |
264 |
|
idf_addfield(pnew, abuf, cbuf); |
265 |
|
} |
266 |
|
if (delim != ';') |
353 |
|
return(idf); /* success! */ |
354 |
|
} |
355 |
|
|
356 |
+ |
/* Check string for end-of-line */ |
357 |
+ |
static int |
358 |
+ |
idf_hasEOL(const char *s) |
359 |
+ |
{ |
360 |
+ |
while (*s) |
361 |
+ |
if (*s++ == '\n') |
362 |
+ |
return(1); |
363 |
+ |
return(0); |
364 |
+ |
} |
365 |
+ |
|
366 |
|
/* Write a object and fields to an open file */ |
367 |
|
int |
368 |
|
idf_writeparam(IDF_OBJECT *param, FILE *fp, int incl_comm) |
375 |
|
fputc(',', fp); |
376 |
|
if (incl_comm) |
377 |
|
fputs(param->rem, fp); |
378 |
+ |
else |
379 |
+ |
fputc('\n', fp); |
380 |
|
for (fptr = param->flist; fptr != NULL; fptr = fptr->next) { |
381 |
|
if (!incl_comm) |
382 |
< |
fputs("\n ", fp); |
382 |
> |
fputs(" ", fp); |
383 |
|
fputs(fptr->val, fp); |
384 |
< |
fputc((fptr->next==NULL ? ';' : ','), fp); |
384 |
> |
if (fptr->next == NULL) { |
385 |
> |
fputc(';', fp); |
386 |
> |
if (incl_comm && !idf_hasEOL(fptr->rem)) |
387 |
> |
fputc('\n', fp); |
388 |
> |
} else |
389 |
> |
fputc(',', fp); |
390 |
|
if (incl_comm) |
391 |
|
fputs(fptr->rem, fp); |
392 |
+ |
else |
393 |
+ |
fputc('\n', fp); |
394 |
|
} |
395 |
|
if (!incl_comm) |
396 |
< |
fputs("\n\n", fp); |
396 |
> |
fputc('\n', fp); |
397 |
|
return(!ferror(fp)); |
398 |
|
} |
399 |
|
|
428 |
|
{ |
429 |
|
if (idf == NULL) |
430 |
|
return; |
431 |
+ |
while (idf->pfirst != NULL) { |
432 |
+ |
IDF_OBJECT *pdel = idf->pfirst; |
433 |
+ |
idf->pfirst = pdel->dnext; |
434 |
+ |
while (pdel->flist != NULL) { |
435 |
+ |
IDF_FIELD *fdel = pdel->flist; |
436 |
+ |
pdel->flist = fdel->next; |
437 |
+ |
free(fdel); |
438 |
+ |
} |
439 |
+ |
free(pdel); |
440 |
+ |
} |
441 |
+ |
lu_done(&idf->ptab); |
442 |
|
if (idf->hrem != NULL) |
443 |
|
free(idf->hrem); |
444 |
< |
while (idf->pfirst != NULL) |
413 |
< |
idf_delobject(idf, idf->pfirst); |
414 |
< |
lu_done(&idf->ptab); |
444 |
> |
free(idf); |
445 |
|
} |