Recently saw some discussion (I don't remember if it was this list) about function text buffer limitations. The function file_to_string() in db.c does possess such a limitation. When reading in a file greater than MAX_STRING_LENGTH in size, you'll exceed the temp buffer. This may be a problem with certain files, especially policies, handbook and background. The obvious solution is to write shorter files, but if you'll want to hack the source some, here is a replacement. Please note, the method of calling it is completely different, in order to simplify it's use. char *file_to_string (char *path) { FILE *fh; if ((fh = fopen (path, "r")) == NULL) { perror ("fopen"); return NULL; } else { char *buffer, *b_point; long measure; int b_taken, b_empty, b_read, nl_left; /* measure and rewind */ fseek (fh, 0, SEEK_END); measure = ftell (fh); rewind (fh); nl_left = 50; measure += nl_left; /* assume 50 newlines, heuristic value */ b_empty = measure; b_taken = 0; /* allocate initial guess, may have to realloc */ CREATE (buffer, char, b_empty); b_point = buffer; /* fgets returns NULL on EOF, or maybe error */ while (fgets (b_point, b_empty, fh) != NULL) { /* since we're adding linefeeds, increment */ b_read = strlen (point) + 1; b_taken += b_read; b_empty -= b_read; b_point += b_read; nl_left --; /* no newline padding left? then realloc */ if (nl_left < 1) { nl_left += 50; b_empty += nl_left; measure += nl_left; RECREATE (buffer, char, measure); b_point = buffer + b_taken; } strcpy (b_point - 2, "\r\n"); } fclose (fh); /* should probably put a EOF check here */ return buffer; } } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST