home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume43 / dbf / part01 / dbfcreat.c < prev    next >
C/C++ Source or Header  |  1994-06-27  |  4KB  |  190 lines

  1. /*
  2.  * Copyright (c) 1993 Brad Eacker,
  3.  *              (Music, Intuition, Software, and Computers)
  4.  * All Rights Reserved
  5.  */
  6.  
  7. #define    USAGE    "usage: dbfcreat [-v] <file> <target xbase>\n"
  8.  
  9. /*
  10.  * display the database in question to the stdout
  11.  */
  12. #include <stdio.h>
  13. #include <fcntl.h>
  14.  
  15. #include "dbf.h"
  16.  
  17. #define    OPEN_RDWR    (O_RDWR | O_CREAT | O_TRUNC)
  18. #define    OPEN_RDONLY    (O_RDONLY)
  19.  
  20. struct db_field creat_f[] = {
  21.     {"FIELD_NAME", 'C', 10, 0, NULL},
  22.     {"FIELD_TYPE", 'C',  1, 0, NULL},
  23.     {"FIELD_LEN",  'N',  3, 0, NULL},
  24.     {"FIELD_DEC",  'N',  4, 0, NULL},
  25. };
  26.  
  27. main(argc, argv)
  28. int    argc;
  29. char    **argv;
  30. {
  31.     dbhead_t     *dbh, *tdbh;
  32.     dbfield_t    *dbf, *cur_f, *tdbf, *tcur_f;
  33.     char    *fnp;
  34.     u_char    *cp, *tcp;
  35.     int    nfields;
  36.     int    tfd, tnfields;
  37.     int    rec_cnt, i, rlen;
  38.     extern int optind;
  39.     extern char *optarg;
  40.     int    verbose = 0;
  41.     int    fail = 0;
  42.  
  43.     while ((i = getopt(argc, argv, "v")) != EOF) {
  44.         switch (i) {
  45.             case 'v':
  46.             verbose++;
  47.             break;
  48.             default:
  49.             printf(USAGE);
  50.             exit(1);
  51.         }
  52.     }
  53.     argc -= optind;  argv = &argv[optind];
  54.     if (argc < 2) {
  55.         printf(USAGE);
  56.         exit(1);
  57.     }
  58.     if ((dbh = dbf_open(*argv, O_RDONLY)) == NULL) {
  59.         fprintf(stderr, "unable to open database file %s\n", *argv);
  60.         exit(1);
  61.     }
  62.     argv++;
  63.  
  64.     cp = (u_char *)malloc(256);
  65.     strcpy(cp, *argv);
  66.     if (strchr(cp, ".dbf") == NULL)
  67.         strcat(cp, ".dbf");
  68.     if ((tfd = open(cp, OPEN_RDWR, 0644)) < 0) {
  69.         perror("open");
  70.         exit(1);
  71.     }
  72.     free(cp);
  73.  
  74.     if (verbose) {
  75.         printf("# total field records %d\n", dbh->db_records);
  76.     }
  77.     dbf = dbh->db_fields;
  78.     if ((nfields = dbh->db_nfields) != 4) {
  79.         fprintf(stderr, "number of fields must be 4");
  80.         exit(1);
  81.     }
  82.     tcur_f = creat_f;
  83.     for (cur_f = dbf; cur_f < &dbf[nfields] ; cur_f++, tcur_f++) {
  84.         if (strcmp(cur_f->db_fname, tcur_f->db_fname) != 0) {
  85.             fprintf(stderr, "field name mismatch, '%s' != '%s'\n",
  86.                 cur_f->db_fname, tcur_f->db_fname);
  87.             fail = 1;
  88.         }
  89.         if (cur_f->db_type != tcur_f->db_type) {
  90.             fprintf(stderr, "field type mismatch, '%c' != '%c'\n",
  91.                 cur_f->db_type, tcur_f->db_type);
  92.             fail = 1;
  93.         }
  94.     }
  95.     if (fail) {
  96.         exit(1);
  97.     }
  98.  
  99.     tdbh = (dbhead_t *)malloc(sizeof(dbhead_t));
  100.     tdbf = (dbfield_t *)malloc(sizeof(dbfield_t) * dbh->db_records);
  101.     if (tdbh == NULL || tdbf == NULL) {
  102.         fprintf(stderr, "unable to get memory for header info\n");
  103.         exit(1);
  104.     }
  105.     tdbh->db_fields = tdbf;
  106.     tdbh->db_fd = tfd;
  107.     tdbh->db_dbt = DBH_TYPE_NORMAL;
  108.     strcpy(tdbh->db_date, "19930818");
  109.     tdbh->db_records = 0;
  110.  
  111.     /* step thru the records */
  112.     tcp = (u_char *)malloc(256);
  113.     tcur_f = tdbf; nfields = 0;
  114.     rlen = 1;
  115.     for (rec_cnt = 1; rec_cnt <= dbh->db_records; rec_cnt++) {
  116.         if ((cp = get_dbf_record(dbh, rec_cnt)) == NULL) {
  117.             printf("tried to read bad record %d\n", rec_cnt);
  118.             break;
  119.         }
  120.         if (*cp == DELETED_RECORD) {
  121.             free(cp);
  122.             continue;
  123.         }
  124.         cur_f = dbf;
  125.         copy_crimp(tcur_f->db_fname, &cp[cur_f->db_foffset],
  126.                     cur_f->db_flen);
  127.         cur_f++;
  128.         tcur_f->db_type = cp[cur_f->db_foffset];
  129.         cur_f++;
  130.         strncpy(tcp, &cp[cur_f->db_foffset], cur_f->db_flen);
  131.         tcp[cur_f->db_flen] = 0;
  132.         tcur_f->db_flen = strtol(tcp, (char *)NULL, 0);
  133.         rlen += tcur_f->db_flen;
  134.         cur_f++;
  135.         strncpy(tcp, &cp[cur_f->db_foffset], cur_f->db_flen);
  136.         tcp[cur_f->db_flen] = 0;
  137.         tcur_f->db_fdc = strtol(tcp, (char *)NULL, 0);
  138.  
  139.         switch (tcur_f->db_type) {
  140.             case 'L':
  141.             if (tcur_f->db_flen != 1) {
  142.                 fprintf(stderr, "Logical field len != 1\n");
  143.                 fail = 1;
  144.             }
  145.             break;
  146.             case 'M':
  147.             if (tcur_f->db_flen != 9) {
  148.                 fprintf(stderr, "Memo Field len != 9\n");
  149.                 fail = 1;
  150.             }
  151.             tdbh->db_dbt = DBH_TYPE_MEMO;
  152.             break;
  153.             case 'C':
  154.             case 'D':
  155.             case 'N':
  156.             break;
  157.             default:
  158.             fprintf(stderr, "unknown field type - %c",
  159.                      cur_f->db_type);
  160.             fail = 1;
  161.         }
  162.         free(cp);
  163.         tcur_f->db_format = get_dbf_f_fmt(tcur_f);
  164.         tcur_f++; nfields++;
  165.     }
  166.     free(tcp);
  167.  
  168.     if (fail) {
  169.         exit(1);
  170.     }
  171.  
  172.     tdbh->db_nfields = nfields;
  173.     tdbh->db_hlen = sizeof(struct dbf_dhead) + 2 +
  174.                 nfields * sizeof(struct dbf_dfield);
  175.     tdbh->db_rlen = rlen;
  176.  
  177.     if (verbose) {
  178.         printf("# total fields %d\n", tdbh->db_nfields);
  179.  
  180.         /* put out the field headings */
  181.                 for (cur_f = tdbf; cur_f < &tdbf[nfields] ; cur_f++) {
  182.                         printf("# %s, %c, %d, %d\n", cur_f->db_fname,
  183.                                 cur_f->db_type, cur_f->db_flen, cur_f->db_fdc);
  184.                 }
  185.     }
  186.  
  187.     put_dbf_info(tdbh);
  188.     exit(0);
  189. }
  190.