|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T W ┃
Length: 6265 (0x1879) Types: TextFile Names: »WriteObj.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/offconv/WriteObj.c«
/* * * Description * Write an OFF object data file. * * Output * * Input * Obj Pointer to object to be written * FileName Name of header file for object * Directory Name of directory in which to write file(s) * FileType File type (OFF_ASCII or OFF_BINARY) * * Diagnostics * Returns 0 if successful, -1 if unsuccessful for any reason. * * Author * Randi J. Rost * Digital Equipment Corp. * Workstation Systems Engineering * Palo Alto, CA * * History * 17-Nov-86 Created * */ #include <stdio.h> #include "off.h" OFFWriteObj(Obj, FileName, Directory, FileType) OFFObjDesc *Obj; /* Object data structure to write */ char *FileName; /* Name of file to be written */ char *Directory; /* Directory in which to write */ int FileType; /* Type of file (bin/ascii) to write */ { FILE *ObjFile; char Name[OFF_BIGSTR]; OFFProperty *pProp; int status; char Dir[OFF_BIGSTR]; /* Open the file for writing */ strcpy(Dir, Directory); writeglob(Dir); strcat(Dir, "/"); strcpy(Name, Dir); strcat(Name, FileName); ObjFile = fopen(Name,"w"); /* If that doesn't work, punt */ if (ObjFile == NULL) { fprintf(stderr, "OFFWriteObj: cannot open %s\n", Name); return(-1); } /* Initialize fields in object structure */ pProp = Obj->FirstProp; /* Write lines to the header file */ while(pProp != NULL) { status = WriteProperty(ObjFile, pProp, Dir, FileType); if (status != 0) { fprintf(stderr, "OFFWriteObj: problem writing property %s\n", pProp->PropName); return(-1); } pProp = pProp->NextProp; } fclose(ObjFile); return(0); } static int WriteProperty(ObjFile, pProp, Directory, FileType) FILE *ObjFile; OFFProperty *pProp; char *Directory; int FileType; { long *iptr; short *hptr; float *fptr; double *dptr; char *ptr; int i, j; int ntabs; char filename[OFF_BIGSTR]; if (strcmp(pProp->PropName, "comment") == 0) { fprintf(ObjFile, "%s\n", pProp->PropData); return(0); } if (strcmp(pProp->PropName, "nl") == 0) { fprintf(ObjFile, "\n"); return(0); } if (strcmp(pProp->PropName, "name") == 0 || strcmp(pProp->PropName, "author") == 0 || strcmp(pProp->PropName, "type") == 0) { fprintf(ObjFile, "%s\t\t%s\n", pProp->PropName, pProp->PropData); return(0); } if (strcmp(pProp->PropName, "description") == 0 || strcmp(pProp->PropName, "copyright") == 0) { fprintf(ObjFile, "%s\t%s\n", pProp->PropName, pProp->PropData); return(0); } else { fprintf(ObjFile, "%s", pProp->PropName); ntabs = (strlen(pProp->PropName) < 8) ? 2 : 1; for (i = 0; i < ntabs; i++) fprintf(ObjFile, "\t"); switch (pProp->PropType) { case OFF_DEFAULT_DATA: fprintf(ObjFile, "default\t\t"); break; case OFF_INDEXED_POLY_DATA: fprintf(ObjFile, "indexed_poly\t"); break; case OFF_GENERIC_DATA: fprintf(ObjFile, "generic\t\t"); break; default: fprintf(ObjFile, "unknown\t\t"); break; } fprintf(ObjFile, "%s", pProp->DataFormat); ntabs = (strlen(pProp->DataFormat) < 8) ? 2 : 1; for (i = 0; i < ntabs; i++) fprintf(ObjFile, "\t"); switch(pProp->PropType) { case OFF_DEFAULT_DATA: ptr = pProp->PropData; for (i = 0; i < strlen(pProp->DataFormat); i++) { switch (pProp->DataFormat[i]) { case 'i': /* Make sure we're aligned on word boundary */ ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4; iptr = (long *) ptr; fprintf(ObjFile, "%d ", *iptr); ptr += sizeof(long); break; case 'b': fprintf(ObjFile, "%ud ", (unsigned char) *ptr); ptr++; break; case 'd': /* Make sure we're aligned on word boundary */ ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4; dptr = (double *) ptr; fprintf(ObjFile, "%g ", *dptr); ptr += sizeof(double); break; case 'h': /* Make sure we're aligned on halfword boundary */ ptr += (((int) ptr % 2) == 0) ? 0 : 1; hptr = (short *) ptr; fprintf(ObjFile, "%d ", *hptr); ptr += sizeof(short); break; case 'f': /* Make sure we're aligned on word boundary */ ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4; fptr = (float *) ptr; fprintf(ObjFile, "%g ", *fptr); ptr += sizeof(float); break; case 's': j = 0; fprintf(ObjFile, "%s ", *((char **) ptr)); ptr += strlen(ptr) + 1; break; default: return(-1); } /* switch */ } /* for */ fprintf(ObjFile, "\n"); break; case OFF_GENERIC_DATA: fprintf(ObjFile, "%s\n", pProp->PropFileName); strcpy(filename, Directory); strcat(filename, pProp->PropFileName); if ((i = OFFWriteGeneric(pProp, filename, FileType)) != 0) return(-1); break; case OFF_INDEXED_POLY_DATA: fprintf(ObjFile, "%s\n", pProp->PropFileName); strcpy(filename, Directory); strcat(filename, pProp->PropFileName); if (i = OFFWriteIndexedPoly(pProp, filename, FileType) != 0) return(-1); break; default: return(-1); break; } /* switch */ } return(0); } #include <pwd.h> #include <ctype.h> static writeglob(string) char *string; { struct passwd *p, *getpwname(); char str1[160], str2[160]; char *pstr; char *index(), *getenv(); /* If first character is '~', expand it */ if (string[0] == '~') { strcpy(str1, string); /* ~/... means use home directory */ if (string[1] == '/') { strcpy(string, getenv("HOME")); strcat(string, &(str1[1])); } /* ~whatever/... means use whatever's home directory */ else { pstr = index(str1, '/'); strncpy(str2, &(string[1]), pstr - str1 - 1); str2[pstr - str1 - 1] = 0; p = getpwnam(str2); strcpy(string, p->pw_dir); strcat(string, pstr); } } /* if directory is '/' (root) return null so concatenation works right */ else if (strcmp(string, "/") == 0) strcpy(string, ""); /* if directory is null, return "." so concatenation works right */ else if (strlen(string) == 0) strcpy(string, "."); }