X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=bfile%2Fmfile.c;h=6b7be96ade84e928d851893d1fa959ff36c0f48f;hb=c0a1c79e55f706009113b2de3c11a6f13d4a0e7d;hp=c34eec0f2cfed10dbdfb287bbba6059a7ae5b1f3;hpb=0c819048d11d510e40ece7112ab4c95d8c7d86a9;p=idzebra-moved-to-github.git diff --git a/bfile/mfile.c b/bfile/mfile.c index c34eec0..6b7be96 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -1,10 +1,33 @@ /* - * Copyright (C) 1994-1998, Index Data I/S + * Copyright (C) 1994-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: mfile.c,v $ - * Revision 1.27 1998-02-10 11:55:07 adam + * Revision 1.34 1999-05-26 07:49:12 adam + * C++ compilation. + * + * Revision 1.33 1999/05/12 13:08:06 adam + * First version of ISAMS. + * + * Revision 1.32 1999/04/28 14:53:07 adam + * Fixed stupid bug regarding split-files. + * + * Revision 1.31 1999/02/18 12:49:33 adam + * Changed file naming scheme for register files as well as record + * store/index files. + * + * Revision 1.30 1999/02/02 14:50:02 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.29 1998/05/27 14:28:34 adam + * Fixed bug in mf_write. 'Cap off' byte written at wrong offset. + * + * Revision 1.28 1998/05/20 10:00:35 adam + * Fixed register spec so that colon isn't treated as size separator + * unless followed by [0-9+-] in order to allow DOS drive specifications. + * + * Revision 1.27 1998/02/10 11:55:07 adam * Minor changes. * * Revision 1.26 1997/10/27 14:25:38 adam @@ -96,7 +119,7 @@ #include #include -#ifdef WINDOWS +#ifdef WIN32 #include #else #include @@ -130,8 +153,10 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad) ad++; if (!*ad) break; - while (*ad && *ad != ':') + while (*ad) { + if (*ad == ':' && strchr ("+-0123456789", ad[1])) + break; if (i < FILENAME_MAX) dirname[i++] = *ad; ad++; @@ -178,7 +203,7 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad) return -1; } ad++; - *dp = dir = xmalloc(sizeof(mf_dir)); + *dp = dir = (mf_dir *) xmalloc(sizeof(mf_dir)); dir->next = 0; strcpy(dir->name, dirname); dir->max_bytes = dir->avail_bytes = fact * size * multi; @@ -233,7 +258,7 @@ static int cmp_part_file(const void *p1, const void *p2) */ MFile_area mf_init(const char *name, const char *spec) { - MFile_area ma = xmalloc(sizeof(*ma)); + MFile_area ma = (MFile_area) xmalloc(sizeof(*ma)); mf_dir *dirp; meta_file *meta_f; part_file *part_f = 0; @@ -264,7 +289,7 @@ MFile_area mf_init(const char *name, const char *spec) { if (*dent->d_name == '.') continue; - if (sscanf(dent->d_name, "%[^.].mf.%d", metaname, &number) != 2) + if (sscanf(dent->d_name, "%[^-]-%d.mf", metaname, &number) != 2) { logf (LOG_DEBUG, "bf: %s is not a part-file.", dent->d_name); continue; @@ -281,7 +306,7 @@ MFile_area mf_init(const char *name, const char *spec) /* new metafile */ if (!meta_f) { - meta_f = xmalloc(sizeof(*meta_f)); + meta_f = (meta_file *) xmalloc(sizeof(*meta_f)); meta_f->ma = ma; meta_f->next = ma->mfiles; meta_f->open = 0; @@ -361,7 +386,7 @@ void mf_destroy(MFile_area ma) */ MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag) { - struct meta_file *mnew; + meta_file *mnew; int i; char tmp[FILENAME_MAX+1]; mf_dir *dp; @@ -371,13 +396,15 @@ MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag) assert (ma); for (mnew = ma->mfiles; mnew; mnew = mnew->next) if (!strcmp(name, mnew->name)) + { if (mnew->open) abort(); else break; + } if (!mnew) { - mnew = xmalloc(sizeof(*mnew)); + mnew = (meta_file *) xmalloc(sizeof(*mnew)); strcpy(mnew->name, name); /* allocate one, empty file */ mnew->no_files = 1; @@ -394,7 +421,7 @@ MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag) return 0; } mnew->files[0].dir = dp; - sprintf(tmp, "%s/%s.mf.%d", dp->name, mnew->name, 0); + sprintf(tmp, "%s/%s-%d.mf", dp->name, mnew->name, 0); mnew->files[0].path = xstrdup(tmp); mnew->ma = ma; mnew->next = ma->mfiles; @@ -452,16 +479,18 @@ int mf_close(MFile mf) /* * Read one block from a metafile. Interface mirrors bfile. */ -int mf_read(MFile mf, int no, int offset, int num, void *buf) +int mf_read(MFile mf, int no, int offset, int nbytes, void *buf) { int rd, toread; if ((rd = file_position(mf, no, offset)) < 0) + { if (rd == -2) return 0; else exit(1); - toread = num ? num : mf->blocksize; + } + toread = nbytes ? nbytes : mf->blocksize; if ((rd = read(mf->files[mf->cur_file].fd, buf, toread)) < 0) { logf (LOG_FATAL|LOG_ERRNO, "mf_read: Read failed (%s)", @@ -477,7 +506,7 @@ int mf_read(MFile mf, int no, int offset, int num, void *buf) /* * Write. */ -int mf_write(MFile mf, int no, int offset, int num, const void *buf) +int mf_write(MFile mf, int no, int offset, int nbytes, const void *buf) { int ps, nblocks, towrite; mf_dir *dp; @@ -502,8 +531,9 @@ int mf_write(MFile mf, int no, int offset, int num, const void *buf) mf->files[mf->cur_file].path, nblocks); if ((ps = file_position(mf, (mf->cur_file ? mf->files[mf->cur_file-1].top : 0) + - mf->files[mf->cur_file].blocks + nblocks, 0)) < 0) + mf->files[mf->cur_file].blocks + nblocks - 1, 0)) < 0) exit(1); + logf (LOG_DEBUG, "ps = %d", ps); if (write(mf->files[mf->cur_file].fd, &dummych, 1) < 1) { logf (LOG_ERRNO|LOG_FATAL, "write dummy"); @@ -534,7 +564,7 @@ int mf_write(MFile mf, int no, int offset, int num, const void *buf) mf->files[mf->cur_file].blocks = mf->files[mf->cur_file].bytes = 0; mf->files[mf->cur_file].fd = -1; - sprintf(tmp, "%s/%s.mf.%d", dp->name, mf->name, + sprintf(tmp, "%s/%s-%d.mf", dp->name, mf->name, mf->files[mf->cur_file].number); mf->files[mf->cur_file].path = xstrdup(tmp); mf->no_files++; @@ -552,7 +582,7 @@ int mf_write(MFile mf, int no, int offset, int num, const void *buf) nblocks * mf->blocksize; } } - towrite = num ? num : mf->blocksize; + towrite = nbytes ? nbytes : mf->blocksize; if (write(mf->files[mf->cur_file].fd, buf, towrite) < towrite) { logf (LOG_FATAL|LOG_ERRNO, "Write failed for file %s part %d",