home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / DBAPI.ZIP / DBFCREAT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-25  |  2.6 KB  |  120 lines

  1. #include <fcntl.h>
  2. #include <io.h>
  3. #include <stdlib.h>
  4. #include <mem.h>
  5. #include <errno.h>
  6. #include <dos.h>
  7. #include "dbapi.h"
  8.  
  9. static char nullstr[20];
  10.  
  11. static DBFFILE *__create(char *fn,int ver,DBFFIELD *fields)
  12. {
  13. DBFFILE *dbf;
  14. DBFFIELD *s;
  15. FILE *fp;
  16. int fh,nfields=0;
  17. struct date d;
  18.     if (_chmod(fn,0)!=-1) {
  19.         errno=EEXIST;
  20.         return NULL;
  21.     }
  22.     fh=_creat(fn,0);
  23.     if (fh==-1)
  24.         return NULL;
  25.     _close(fh);
  26.     fh=_open(fn,O_BINARY|O_RDWR|O_DENYNONE);
  27.     fp=fdopen(fh,"r+b");
  28.     if (!fp)
  29.         return NULL;
  30.     dbf=malloc(sizeof(DBFFILE));
  31.     if (dbf) {
  32.         setmem(dbf,sizeof(DBFFILE),0);
  33.         getdate(&d);
  34.         s=fields;
  35.         while (s) {
  36.             nfields++;
  37.             dbf->reclen+=s->f.len;
  38.             s=s->next;
  39.         }
  40.         dbf->reclen++;
  41.         if (ver==2)
  42.             dbf->hdrlen=32*sizeof(DBF2FIELD)+sizeof(DBF2HEADER)+1;
  43.         else
  44.             dbf->hdrlen=nfields*sizeof(DBF3FIELD)+sizeof(DBF3HEADER)+1;
  45.         dbf->fp=fp;
  46.         dbf->ver=(byte)ver;
  47.         dbf->fields=fields;
  48.         dbf->update.year=d.da_year%100;
  49.         dbf->update.month=d.da_mon;
  50.         dbf->update.day=d.da_day;
  51.         fwrite(&dbf->ver,1,1,fp);
  52.         if (ver==2) {
  53.             fwrite(&dbf->nrecords,2,1,fp);
  54.         }
  55.         fwrite(&dbf->update,3,1,fp);
  56.         if (ver!=2) {
  57.             fwrite(&dbf->nrecords,4,1,fp);
  58.             fwrite(&dbf->hdrlen,2,1,fp);
  59.         }
  60.         fwrite(&dbf->reclen,2,1,fp);
  61.         if (ver!=2) {
  62.             fwrite(nullstr,20,1,fp);
  63.         }
  64.         s=fields;
  65.         while (s) {
  66.             fwrite(&s->f.name,11,1,fp);
  67.             fwrite(&s->f.type,1,1,fp);
  68.             if (ver!=2)
  69.                 fwrite("\0",1,4,fp);
  70.             fwrite(&s->f.len,1,1,fp);
  71.             if (ver==2)
  72.                 fwrite(nullstr,2,1,fp);
  73.             fwrite(&s->f.deccount,1,1,fp);
  74.             if (ver!=2)
  75.                 fwrite(nullstr,14,1,fp);
  76.             s=s->next;
  77.         }
  78.         if (!fwrite("\r",1,1,fp)) {
  79.             dbfclose(dbf);
  80.             unlink(fn);
  81.             return NULL;
  82.         }
  83.         return dbf;
  84.     }
  85.     return NULL;
  86. }
  87.  
  88. /*man****************************************************************
  89. NAME
  90.     dbfcreate
  91.  
  92. SYNOPSIS
  93.     #include "dbapi.h"
  94.  
  95.     DBFFILE *dbfcreate(char *fn,int ver,DBFFIELD *fields)
  96.  
  97. DESCRIPTION
  98.     dbfcreate creates a new dbase file. fn is a file name for
  99.     database and ver is version number (2 or 3 are supported
  100.     at the moment). fields is a list of field definitions
  101.     built with dbaddfld.
  102.  
  103. DIAGNOSTICS
  104.     dbfcreate will return opened dbase file pointer to newly
  105.     created file if successful or NULL when create fails or
  106.     the file already exists. In case of failure the field list 
  107.     is disposed and becomes invalid.
  108.  
  109. SEE ALSO
  110.     dbaddfld
  111. ********************************************************************/
  112. DBFFILE *dbfcreate(char *fn,int ver,DBFFIELD *fields)
  113. {
  114. DBFFILE *dbf;
  115.     dbf=__create(fn,ver,fields);
  116.     if (!dbf)
  117.         dbkillflds(fields);
  118.     return dbf;
  119. }
  120.