From 2771f5feddda09bed04d609683bf95df053924a4 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 9 Apr 1996 06:47:28 +0000 Subject: [PATCH] Function scan_areadef doesn't use sscanf (%n fails on this Linux). --- bfile/cfile.c | 8 +++++-- bfile/mfile.c | 67 +++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 59 insertions(+), 16 deletions(-) diff --git a/bfile/cfile.c b/bfile/cfile.c index f07d613..91fa2ad 100644 --- a/bfile/cfile.c +++ b/bfile/cfile.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: cfile.c,v $ - * Revision 1.11 1996-03-26 15:59:05 adam + * Revision 1.12 1996-04-09 06:47:28 adam + * Function scan_areadef doesn't use sscanf (%n fails on this Linux). + * + * Revision 1.11 1996/03/26 15:59:05 adam * The directory of the shadow table file can be specified by the new * bf_lockDir call. * @@ -98,6 +101,7 @@ CFile cf_open (MFile mf, MFile_area area, const char *fname, int hash_bytes; cf->rmf = mf; + logf (LOG_LOG, "cf_open %s", cf->rmf->name); sprintf (path, "%s-b", fname); if (!(cf->block_mf = mf_open (area, path, block_size, wflag))) { @@ -474,7 +478,7 @@ int cf_write (CFile cf, int no, int offset, int num, const void *buf) int cf_close (CFile cf) { - logf (LOG_LOG, "cf_close"); + logf (LOG_LOG, "cf_close %s", cf->rmf->name); logf (LOG_LOG, "hits=%d miss=%d bucket_in_memory=%d total=%d", cf->no_hits, cf->no_miss, cf->bucket_in_memory, cf->head.next_bucket - cf->head.first_bucket); diff --git a/bfile/mfile.c b/bfile/mfile.c index 6dd5fa1..8443799 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: mfile.c,v $ - * Revision 1.17 1996-03-20 13:29:11 quinn + * 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 @@ -84,8 +87,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 +97,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; } -- 1.7.10.4