X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=bfile%2Fmfile.c;h=750a3b3efc7822f392be6de0b8f29407fc01949f;hb=e127268c91736bf5a116cbc24653da4b845ca046;hp=6dd5fa1e512685841c249c5d34f6b38b596f318c;hpb=b8d492961ba89859e02543581d097b75a59b546c;p=idzebra-moved-to-github.git diff --git a/bfile/mfile.c b/bfile/mfile.c index 6dd5fa1..750a3b3 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -4,7 +4,19 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: mfile.c,v $ - * Revision 1.17 1996-03-20 13:29:11 quinn + * Revision 1.21 1996-10-29 13:56:18 adam + * Include of zebrautl.h instead of alexutil.h. + * + * Revision 1.20 1996/05/14 12:10:16 quinn + * Bad areadef scan + * + * Revision 1.19 1996/05/01 07:16:30 quinn + * Fixed ancient bug. + * + * Revision 1.18 1996/04/09 06:47:30 adam + * Function scan_areadef doesn't use sscanf (%n fails on this Linux). + * + * Revision 1.17 1996/03/20 13:29:11 quinn * Bug-fix * * Revision 1.16 1995/12/12 15:57:57 adam @@ -72,7 +84,7 @@ #include #include -#include +#include #include static MFile_area_struct *open_areas = 0; @@ -84,8 +96,7 @@ static int scan_areadef(MFile_area ma, const char *name) * If no definition is given, use current directory, unlimited. */ const char *ad = res_get_def(common_resource, name, ".:-1b"); - int offset = 0, rs, size, multi, rd; - char dirname[FILENAME_MAX+1], unit; + char dirname[FILENAME_MAX+1]; mf_dir **dp = &ma->dirs, *dir = *dp; if (!ad) @@ -95,29 +106,66 @@ static int scan_areadef(MFile_area ma, const char *name) } for (;;) { - rs = sscanf(ad + offset, "%[^:]:%d%c %n", dirname, &size, &unit, &rd); - if (rs <= 1) - break; - if (rs != 3) + const char *ad0 = ad; + int i = 0, fact = 1, multi, size = 0; + + while (*ad == ' ' || *ad == '\t') + ad++; + if (!*ad) + break; + while (*ad && *ad != ':') { - logf (LOG_FATAL, "Illegal directory description: %s", ad + offset); - return -1; - } - switch (unit) + if (i < FILENAME_MAX) + dirname[i++] = *ad; + ad++; + } + dirname[i] = '\0'; + if (*ad++ != ':') + { + logf (LOG_FATAL, "Missing colon after path: %s", ad0); + return -1; + } + if (i == 0) + { + logf (LOG_FATAL, "Empty path: %s", ad0); + return -1; + } + while (*ad == ' ' || *ad == '\t') + ad++; + if (*ad == '-') + { + fact = -1; + ad++; + } + else if (*ad == '+') + ad++; + size = 0; + if (*ad < '0' || *ad > '9') + { + logf (LOG_FATAL, "Missing size after path: %s", ad0); + return -1; + } + size = 0; + while (*ad >= '0' && *ad <= '9') + size = size*10 + (*ad++ - '0'); + switch (*ad) { case 'B': case 'b': multi = 1; break; case 'K': case 'k': multi = 1024; break; case 'M': case 'm': multi = 1048576; break; + case '\0': + logf (LOG_FATAL, "Missing unit: %s", ad0); + return -1; default: - logf (LOG_FATAL, "Illegal unit: %c in %s", unit, ad + offset); + logf (LOG_FATAL, "Illegal unit: %c in %s", *ad, ad0); return -1; } + ad++; *dp = dir = xmalloc(sizeof(mf_dir)); dir->next = 0; strcpy(dir->name, dirname); - dir->max_bytes = dir->avail_bytes = size * multi; + dir->max_bytes = dir->avail_bytes = fact * size * multi; dp = &dir->next; - offset += rd; } return 0; } @@ -130,7 +178,7 @@ static int file_position(MFile mf, int pos, int offset) (c < mf->no_files -1 && pos > mf->files[c].top)) { c = 0; - while (mf->files[c].top >= 0 && mf->files[c].top < pos) + while (c + 1 < mf->no_files && mf->files[c].top < pos) { off += mf->files[c].blocks; c++; @@ -337,7 +385,7 @@ MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag) for (i = 0; i < new->no_files; i++) { new->files[i].blocks = new->files[i].bytes / new->blocksize; - if (i == new->no_files) + if (i == new->no_files - 1) new->files[i].top = -1; else new->files[i].top = i ? (new->files[i-1].top + new->files[i].blocks)