|
|
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 - metrics - 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, ".");
}