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

  1.  
  2. /*
  3.  *
  4.  * Description
  5.  *    Write an indexed_poly 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. OFFWriteIndexedPoly(pProp, fname, type)
  36.     OFFProperty    *pProp;
  37.     char    *fname;
  38.     int        type;
  39.  
  40.     {
  41.     FILE    *ascfd;
  42.     int        binfd;
  43.     long    npts, npolys, nconnects;
  44.     char    *ptr, *ptr2;
  45.     int        i, j, k;
  46.     long    *lptr;
  47.     char    format[MAX_DATA_ITEMS][10];
  48.     int        padding[MAX_DATA_ITEMS];
  49.     int        size[MAX_DATA_ITEMS];
  50.     int        datasize = 0;
  51.     int        nostrings = 1;
  52.     long    strlength;
  53.     long    code;
  54.     long    zeros = 0;
  55.     int        endpad;
  56.     char    dstring[80];
  57.     long    wsize;
  58.  
  59.  
  60. /*  Open the file, punt if file open fails  */
  61.     if (type == OFF_ASCII)
  62.     {
  63.     ascfd = fopen(fname, "w");
  64.     if (ascfd == NULL)
  65.         {
  66.         fprintf(stderr, "OFFWriteIndexedPoly: cannot open data file %s\n",
  67.             fname);
  68.         return(-1);
  69.         }
  70.     }
  71.     else
  72.     {
  73.     binfd = open(fname, O_CREAT | O_WRONLY | O_TRUNC, 0666);
  74.     if (binfd < 0)
  75.         {
  76.         fprintf(stderr, "OFFWriteIndexedPoly: cannot open data file %s\n",
  77.             fname);
  78.         return(-1);
  79.         }
  80.     code = OFF_INDEXED_POLY_MAGIC;
  81.     write(binfd, &code, sizeof(long));
  82.     }
  83.  
  84.  
  85. /*  Write out the number of data items for the list  */
  86.     ptr = pProp->PropData;
  87.     lptr = (long *) ptr;
  88.     npts = *lptr++;
  89.     npolys = *lptr++;
  90.     nconnects = *lptr++;
  91.     ptr = (char *) lptr;
  92.     if (type == OFF_ASCII)
  93.     fprintf(ascfd,"%d\t%d\t%d\n", npts, npolys, nconnects);
  94.     else
  95.     {
  96.     write(binfd, &npts, sizeof(long));
  97.     write(binfd, &npolys, sizeof(long));
  98.     write(binfd, &nconnects, sizeof(long));
  99.     }
  100.  
  101. /*  Compute data size  */
  102.     for (i = 0; i < strlen(pProp->DataFormat); i++)
  103.     {
  104.     switch (pProp->DataFormat[i])
  105.         {
  106.         case 'i': size[i] = sizeof(long);
  107.               padding[i] = ((datasize % 4) == 0) ?
  108.                 0 : 4 - datasize % 4;
  109.               strcpy(format[i], "%d\t");
  110.               break;
  111.         case 'f': size[i] = sizeof(float);
  112.               padding[i] = ((datasize % 4) == 0) ?
  113.                 0 : 4 - datasize % 4;
  114.               strcpy(format[i], "%g\t");
  115.               break;
  116.         case 'd': size[i] = sizeof(double);
  117.               padding[i] = ((datasize % 4) == 0) ?
  118.                 0 : 4 - datasize % 4;
  119.               strcpy(format[i], "%*.*g\t");
  120.               break;
  121.         case 'h': size[i] = sizeof(short);
  122.               padding[i] = ((datasize % 2) == 0) ? 0 : 1;
  123.               strcpy(format[i], "%d\t");
  124.               break;
  125.         case 'b': size[i] = sizeof(char);
  126.               padding[i] = 0;
  127.               strcpy(format[i], "%d\t");
  128.               break;
  129.         case 's': size[i] = sizeof(char *);
  130.               padding[i] = ((datasize % 4) == 0) ?
  131.                 0 : 4 - datasize % 4;
  132.               strcpy(format[i], "%s\t");
  133.               nostrings = 0;
  134.               break;
  135.         default:  fprintf(stderr, "OFFWriteIndexedPoly: data format not ");
  136.               fprintf(stderr, "valid for indexed_poly data type\n");
  137.               return (-1);
  138.         }
  139.     datasize += padding[i] + size[i];
  140.     }
  141.  
  142.     endpad = ((datasize % 4) == 0) ? 0 : 4 - datasize % 4;
  143.     datasize += endpad;
  144.  
  145.  
  146.     if (type == OFF_ASCII)    /* Write info to the ascii file */
  147.     {
  148.     for(i = 0; i < npts; i++)
  149.         {
  150.         for(j = 0; j < strlen(pProp->DataFormat); j++)
  151.         {
  152.         ptr += padding[j];
  153.         if (pProp->DataFormat[j] == 'f')
  154.             fprintf(ascfd, format[j], *((float *) ptr));
  155.         else if (pProp->DataFormat[j] == 'i')
  156.             fprintf(ascfd, format[j], *((long *) ptr));
  157.         else if (pProp->DataFormat[j] == 'd')
  158.             { /* I wouldn't have to do this if %g format worked right*/
  159.             sprintf(dstring, "%-30.30g", *((double *) ptr));
  160.             k = 0;
  161.             while (dstring[k] != ' ') k++;
  162.             fprintf(ascfd, format[j], k, k, *((double *) ptr));
  163.             }
  164.         else if (pProp->DataFormat[j] == 'h')
  165.             fprintf(ascfd, format[j], *((short *) ptr));
  166.         else if (pProp->DataFormat[j] == 's')
  167.             fprintf(ascfd, format[j], *((char **) ptr));
  168.         else if (pProp->DataFormat[j] == 'b')
  169.             fprintf(ascfd, format[j], *((unsigned char *) ptr));
  170.  
  171.         ptr += size[j];
  172.         }
  173.  
  174.         fprintf(ascfd, "\n");
  175.         ptr += endpad;
  176.         }
  177.     ptr2 = ptr + sizeof(short) * npolys;
  178.     for (i = 0; i < npolys; i++)
  179.         {
  180.         fprintf(ascfd, "%hd\t", *((short *) ptr));
  181.         for (j = 0; j < *((short *) ptr); j++)
  182.         {
  183.         fprintf(ascfd, "%hd    ", *((short *) ptr2));
  184.         ptr2 += sizeof(short);
  185.         }
  186.         fprintf(ascfd, "\n");
  187.         ptr += sizeof(short);
  188.         }
  189.     }
  190.  
  191.     else    /* Write info to the binary file */
  192.  
  193.     {
  194.     wsize = datasize * npts + sizeof(short) * (npolys + nconnects);
  195.     if (nostrings)
  196.         write(binfd, ptr, wsize); /* Write object vertex array */
  197.     else
  198.         {
  199.         for(i = 0; i < npts; i++)
  200.         {
  201.         for(j = 0; j < strlen(pProp->DataFormat); j++)
  202.             {
  203.             ptr += padding[j];
  204.             if (padding[j] != 0)  write(binfd, &zeros, padding[j]);
  205.             if (format[j][1] != 's')
  206.             write(binfd, ptr, size[j]);
  207.             else
  208.             {
  209.             strlength = strlen(*((char **) ptr)) + 1;
  210.             write(binfd, &strlength, sizeof(long));
  211.             write(binfd, *((char **) ptr), strlength);
  212.             strlength = ((strlength % 4) == 0) ?
  213.                 0 : 4 - strlength % 4;
  214.             write(binfd, &zeros, strlength);
  215.             }
  216.             ptr += size[j];
  217.             }
  218.         if (endpad != 0)  write(binfd, &zeros, endpad);
  219.         ptr += endpad;
  220.         }
  221.         write(binfd, ptr, sizeof(short) * (npolys + nconnects));
  222.         }
  223.     }
  224.  
  225. /*  Close the data file  */
  226.     if (type == OFF_ASCII)
  227.     fclose(ascfd);
  228.     else
  229.     close(binfd);
  230.  
  231.     return(0);
  232.     }
  233.  
  234.