DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ F T

⟦9c4c9b34f⟧ TextFile

    Length: 2816 (0xb00)
    Types: TextFile
    Names: »FreeProp.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/offconv/FreeProp.c« 

TextFile


/*
 *
 * Description
 *	Free a property structure and associated memory resources.
 *
 * Output
 *
 * Input
 *	pProp		Pointer to the property structure to be deallocated.
 *
 * Diagnostics
 *	Returns 0 if successful, -1 if unsuccessful (unknown data type).
 *
 * Author
 *	Randi J. Rost
 *	Digital Equipment Corp.
 *	Workstation Systems Engineering
 *	Palo Alto, CA
 *
 * History
 *	17-Nov-86	Created
 *
 */

#include <stdio.h>
#include "off.h"


OFFFreeProperty(pProp)
    OFFProperty	*pProp;

    {
    OFFProperty	*newprop;
    int		i;
    int		nostrings = 1;

    if (strcmp(pProp->PropName, "comment") == 0)
	{
	free(pProp->PropData);
	free(pProp);
	return(0);
	}

    if (strcmp(pProp->PropName, "nl") == 0)
	{
	free(pProp);
	return(0);
	}

    if (strcmp(pProp->PropName, "name") == 0 ||
	strcmp(pProp->PropName, "author") == 0 ||
	strcmp(pProp->PropName, "type") == 0 ||
	strcmp(pProp->PropName, "description") == 0 ||
	strcmp(pProp->PropName, "copyright") == 0)
	{
	free(pProp->PropData);
	free(pProp);
	return(0);
	}

    else
	{
	nostrings;
	for (i = 0; i < strlen(pProp->DataFormat); i++)
	    if (pProp->DataFormat[i] == 's') nostrings = 0;
	switch(newprop->PropType)
	    {
	    case OFF_DEFAULT_DATA:
		if (!nostrings)
		    FreeStrings(pProp->PropData, pProp->DataFormat, 1);
		break;

	    case OFF_GENERIC_DATA:
		if (!nostrings)
		    FreeStrings(pProp->PropData + sizeof(long),
			pProp->DataFormat, pProp->PropCount);
		break;

	    case OFF_INDEXED_POLY_DATA:
		if (nostrings)
		    FreeStrings(pProp->PropData + 3 * sizeof(long),
			pProp->DataFormat, pProp->PropCount);
		break;

	    default:
		return(-1);
		break;
	    } /* switch */

	free(pProp->PropData);
	free(pProp);
	}

    return(0);
    }



static int FreeStrings(dataptr, format)
    char	*dataptr;
    char	*format;

    {
    int		i;
    char	*ptr;

    ptr = dataptr;
    for (i = 0; i < strlen(format); i++)
	{
	switch(format[i])
	    {
	    case 'i':
		 /* Make sure we're aligned on word boundary */
		 ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4;
		 ptr += sizeof(long);
		 break;
	    case 'b':
		 ptr++;
		 break;
	    case 'd':
		 /* Make sure we're aligned on word boundary */
		 ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4;
		 ptr += sizeof(double);
		 break;
	    case 'h':
		 /* Make sure we're aligned on halfword boundary */
		 ptr += (((int) ptr % 2) == 0) ? 0 : 1;
		 ptr += sizeof(short);
		 break;
	    case 'f':
		 /* Make sure we're aligned on word boundary */
		 ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4;
		 ptr += sizeof(float);
		 break;
	    case 's':
		 /* Make sure we're aligned on word boundary */
		 ptr += (((int) ptr % 4) == 0) ? 0 : 4 - (int) ptr % 4;
		 free(*((char **) ptr));
		 ptr += sizeof(char *);
		 break;
	    default:
		 return(-1);
	    }
	}
    }