home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / formats / off / code / writegen.c < prev    next >
C/C++ Source or Header  |  1994-06-20  |  5KB  |  211 lines

  1.  
  2. /*
  3.  *
  4.  * Description
  5.  *    Write a generic data file.
  6.  *
  7.  * Output
  8.  *
  9.  * Input
  10.  *    pProp        Pointer to property structure from which to get data
  11.  *    fname        Full path/file name of file to be written
  12.  *    type        File type (OFF_ASCII or OFF_BINARY)
  13.  *
  14.  * Diagnostics
  15.  *    Returns 0 if successful, -1 if unsuccessful for any reason.
  16.  *
  17.  * Author
  18.  *    Randi J. Rost
  19.  *    Digital Equipment Corp.
  20.  *    Workstation Systems Engineering
  21.  *    Palo Alto, CA
  22.  *
  23.  * History
  24.  *    17-Nov-86    Created
  25.  *
  26.  */
  27.  
  28.  
  29. #include <stdio.h>
  30. #include <sys/file.h>
  31. #include "off.h"
  32.  
  33. #define MAX_DATA_ITEMS    30
  34.  
  35. OFFWriteGeneric(pProp, fname, type)
  36.     OFFProperty    *pProp;
  37.     char    *fname;
  38.     int        type;
  39.  
  40.     {
  41.     FILE    *ascfd;
  42.     int        binfd;
  43.     long    npts;
  44.     char    *ptr;
  45.     int        i, j, k;
  46.     char    format[MAX_DATA_ITEMS][10];
  47.     int        padding[MAX_DATA_ITEMS];
  48.     int        size[MAX_DATA_ITEMS];
  49.     int        datasize = 0;
  50.     int        nostrings = 1;
  51.     long    strlength;
  52.     long    code;
  53.     long    zeros = 0;
  54.     int        endpad;
  55.     char    dstring[80];
  56.  
  57.  
  58. /*  Open the file, punt if file open fails  */
  59.     if (type == OFF_ASCII)
  60.     {
  61.     ascfd = fopen(fname, "w");
  62.     if (ascfd == NULL)
  63.         {
  64.         fprintf(stderr, "OFFWriteGeneric: cannot open data file %s\n",
  65.             fname);
  66.         return(-1);
  67.         }
  68.     }
  69.     else
  70.     {
  71.     binfd = open(fname, O_CREAT | O_WRONLY | O_TRUNC, 0666);
  72.     if (binfd < 0)
  73.         {
  74.         fprintf(stderr, "OFFWriteGeneric: cannot open data file %s\n",
  75.             fname);
  76.         return(-1);
  77.         }
  78.     code = OFF_GENERIC_MAGIC;
  79.     write(binfd, &code, sizeof(long));
  80.     }
  81.  
  82.  
  83. /*  Write out the number of data items for the list  */
  84.     ptr = pProp->PropData;
  85.     npts = *((long *) ptr);
  86.     if (type == OFF_ASCII)
  87.     fprintf(ascfd,"%d\n", npts);
  88.     else
  89.     write(binfd, &npts, sizeof(long));
  90.     ptr += sizeof(long);
  91.  
  92. /*  Compute data size  */
  93.     for (i = 0; i < strlen(pProp->DataFormat); i++)
  94.     {
  95.     switch (pProp->DataFormat[i])
  96.         {
  97.         case 'i': size[i] = sizeof(long);
  98.               padding[i] = ((datasize % 4) == 0) ?
  99.                 0 : 4 - datasize % 4;
  100.               strcpy(format[i], "%d\t");
  101.               break;
  102.         case 'f': size[i] = sizeof(float);
  103.               padding[i] = ((datasize % 4) == 0) ?
  104.                 0 : 4 - datasize % 4;
  105.               strcpy(format[i], "%g\t");
  106.               break;
  107.         case 'd': size[i] = sizeof(double);
  108.               padding[i] = ((datasize % 4) == 0) ?
  109.                 0 : 4 - datasize % 4;
  110.               strcpy(format[i], "%*.*g\t");
  111.               break;
  112.         case 'h': size[i] = sizeof(short);
  113.               padding[i] = ((datasize % 2) == 0) ? 0 : 1;
  114.               strcpy(format[i], "%d\t");
  115.               break;
  116.         case 'b': size[i] = sizeof(char);
  117.               padding[i] = 0;
  118.               strcpy(format[i], "%d\t");
  119.               break;
  120.         case 's': size[i] = sizeof(char *);
  121.               padding[i] = ((datasize % 4) == 0) ?
  122.                 0 : 4 - datasize % 4;
  123.               strcpy(format[i], "%s\t");
  124.               nostrings = 0;
  125.               break;
  126.         default:  fprintf(stderr, "OFFWriteGeneric: data format not ");
  127.               fprintf(stderr, "valid for generic data type\n");
  128.               return (-1);
  129.         }
  130.     datasize += padding[i] + size[i];
  131.     }
  132.  
  133.     endpad = ((datasize % 4) == 0) ? 0 : 4 - datasize % 4;
  134.     datasize += endpad;
  135.  
  136.  
  137.     if (type == OFF_ASCII)    /* Write info to the ascii file */
  138.     {
  139.     for(i = 0; i < npts; i++)
  140.         {
  141.         for(j = 0; j < strlen(pProp->DataFormat); j++)
  142.         {
  143.         ptr += padding[j];
  144.         if (pProp->DataFormat[j] == 'f')
  145.             fprintf(ascfd, format[j], *((float *) ptr));
  146.         else if (pProp->DataFormat[j] == 'i')
  147.             fprintf(ascfd, format[j], *((long *) ptr));
  148.         else if (pProp->DataFormat[j] == 'd')
  149.             { /* I wouldn't have to do this if %g format worked right*/
  150.             sprintf(dstring, "%-30.30g", *((double *) ptr));
  151.             k = 0;
  152.             while (dstring[k] != ' ') k++;
  153.             fprintf(ascfd, format[j], k, k, *((double *) ptr));
  154.             }
  155.         else if (pProp->DataFormat[j] == 'h')
  156.             fprintf(ascfd, format[j], *((short *) ptr));
  157.         else if (pProp->DataFormat[j] == 's')
  158.             fprintf(ascfd, format[j], *((char **) ptr));
  159.         else if (pProp->DataFormat[j] == 'b')
  160.             fprintf(ascfd, format[j], *((unsigned char *) ptr));
  161.  
  162.         ptr += size[j];
  163.         }
  164.  
  165.         fprintf(ascfd, "\n");
  166.         ptr += endpad;
  167.         }
  168.     }
  169.  
  170.     else    /* Write info to the binary file */
  171.  
  172.     {
  173.     if (nostrings)
  174.         write(binfd, ptr, datasize * npts); /* Write object vertex array */
  175.     else
  176.         {
  177.         for(i = 0; i < npts; i++)
  178.         {
  179.         for(j = 0; j < strlen(pProp->DataFormat); j++)
  180.             {
  181.             ptr += padding[j];
  182.             if (padding[j] != 0)  write(binfd, &zeros, padding[j]);
  183.             if (format[j][1] != 's')
  184.             write(binfd, ptr, size[j]);
  185.             else
  186.             {
  187.             strlength = strlen(*((char **) ptr)) + 1;
  188.             write(binfd, &strlength, sizeof(long));
  189.             write(binfd, *((char **) ptr), strlength);
  190.             strlength = ((strlength % 4) == 0) ?
  191.                 0 : 4 - strlength % 4;
  192.             write(binfd, &zeros, strlength);
  193.             }
  194.             ptr += size[j];
  195.             }
  196.         if (endpad != 0)  write(binfd, &zeros, endpad);
  197.         ptr += endpad;
  198.         }
  199.         }
  200.     }
  201.  
  202. /*  Close the data file  */
  203.     if (type == OFF_ASCII)
  204.     fclose(ascfd);
  205.     else
  206.     close(binfd);
  207.  
  208.     return(0);
  209.     }
  210.  
  211.