home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / cbase.zip / CBASE10B.ZIP / CBASE.ZIP / CBEXPORT.C < prev    next >
Text File  |  1989-11-08  |  4KB  |  163 lines

  1. /*    Copyright (c) 1989 Citadel    */
  2. /*       All Rights Reserved        */
  3.  
  4. /* #ident    "cbexport.c    1.2 - 89/11/08" */
  5.  
  6. #include <errno.h>
  7. /*#include <stddef.h>*/
  8. #include <stdio.h>
  9. /*#include <stdlib.h>*/
  10. #include "cbase_.h"
  11.  
  12. /*man---------------------------------------------------------------------------
  13. NAME
  14.      cbexport - export cbase data
  15.  
  16. SYNOPSIS
  17.      #include <cbase.h>
  18.  
  19.      int cbexport(cbp, filename)
  20.      cbase_t *cbp;
  21.      const char *filename;
  22.  
  23. DESCRIPTION
  24.      The cbexport function exports all records in cbase cbp to a
  25.      printable file.  filename points to a character string that
  26.      contains the name of the file to receive the data.  If the file
  27.      does not exist, it is created.  If the file exists, it is
  28.      truncated to zero length before the data is exported.
  29.  
  30.      The exported file format is as follows:
  31.  
  32.           o Each record is terminated by a newline ('\\n').
  33.           o The fields in a record are delimited by vertical
  34.             bars ('|').
  35.           o Each field contains only printable characters.
  36.           o If a field contains the field delimiter
  37.             character, that character is replaced with \\F.
  38.           o The individual elements of array data types are
  39.             exported as individual fields.
  40.  
  41.      cbexport will fail if one or more of the following is true:
  42.  
  43.      [EINVAL]       cbp is not a valid cbase pointer.
  44.      [EINVAL]       filename is the NULL pointer.
  45.      [CBELOCK]      cbp is not read locked.
  46.      [CBENOPEN]     cbp is not open.
  47.      [CBEPRFILE]    Error writing to printable file.
  48.  
  49. DIAGNOSTICS
  50.      Upon successful completion, a value of 0 is returned.  Otherwise,
  51.      a value of -1 is returned, and errno set to indicate the error.
  52.  
  53. ------------------------------------------------------------------------------*/
  54. int cbexport(cbp, filename)
  55. cbase_t *cbp;
  56. CONST char *filename;
  57. {
  58.     int    rs    = 0;
  59.     int    terrno    = 0;
  60.     FILE *    fp    = NULL;
  61.     void *    buf    = NULL;
  62.     int    field    = 0;
  63.     size_t    fldos = 0;
  64.     size_t    fldlen    = 0;
  65.     int    fldtype    = 0;
  66.  
  67.     /* validate arguments */
  68.     if (!cb_valid(cbp) || (filename == NULL)) {
  69.         errno = EINVAL;
  70.         return -1;
  71.     }
  72.  
  73.     /* truncate or create file for writing */
  74.     fp = fopen(filename, "w");
  75.     if (fp == NULL) {
  76.         return -1;
  77.     }
  78.  
  79.     /* check if cbp is empty */
  80.     if (cbreccnt(cbp) == 0) {
  81.         if (fclose(fp) == EOF) {
  82.             CBEPRINT;
  83.             return -1;
  84.         }
  85.         errno = 0;
  86.         return 0;
  87.     }
  88.  
  89.     /* position record cursor to first record */
  90.     if (cbrecfirst(cbp) == -1) {
  91.         CBEPRINT;
  92.         terrno = errno;
  93.         fclose(fp);
  94.         errno = terrno;
  95.         return -1;
  96.     }
  97.  
  98.     /* export all records to printable file */
  99.     buf = calloc((size_t)1, cbrecsize(cbp));
  100.     if (buf == NULL) {
  101.         CBEPRINT;
  102.         fclose(fp);
  103.         errno = ENOMEM;
  104.         return -1;
  105.     }
  106.     while (cbrcursor(cbp) != NULL) {
  107.         if (cbgetr(cbp, buf) == -1) {    /* read current record */
  108.             CBEPRINT;
  109.             terrno = errno;
  110.             free(buf);
  111.             fclose(fp);
  112.             errno = terrno;
  113.             return -1;
  114.         }
  115.         /* output each field of current record */
  116.         for (field = 0; field < cbp->fldc; field++) {
  117.             fldos = cbp->fldv[field].offset;
  118.             fldlen = cbp->fldv[field].len;
  119.             fldtype = cbp->fldv[field].type;
  120.             /* write field to printable file */
  121.             if ((*cbexpv[fldtype])(fp, (char *)buf + fldos, fldlen) == -1) {
  122.                 CBEPRINT;
  123.                 free(buf);
  124.                 fclose(fp);
  125.                 errno = CBEPRFILE;
  126.                 return -1;
  127.             }
  128.             if (field < cbp->fldc - 1) {
  129.                 rs = fputc(EXPFLDDLM, fp);
  130.             } else {
  131.                 rs = fputc(EXPRECDLM, fp);
  132.             }
  133.             if (rs == EOF) {
  134.                 CBEPRINT;
  135.                 terrno = errno;
  136.                 free(buf);
  137.                 fclose(fp);
  138.                 errno = terrno;
  139.                 return -1;
  140.             }
  141.         }
  142.         if (cbrecnext(cbp) == -1) {
  143.             CBEPRINT;
  144.             terrno = errno;
  145.             free(buf);
  146.             fclose(fp);
  147.             errno = terrno;
  148.             return -1;
  149.         }
  150.     }
  151.     free(buf);
  152.     buf = NULL;
  153.  
  154.     /* close file */
  155.     if (fclose(fp) == EOF) {
  156.         CBEPRINT;
  157.         return -1;
  158.     }
  159.  
  160.     errno = 0;
  161.     return 0;
  162. }
  163.