/* resizeDynamicArray: resize array, if needed */ void resizeDynamicArray( Array *array ) { int i, oldSize, newSize; oldSize = array->upper[0]; /* out of room? */ if (array->lower[0] >= oldSize-1) { /* double space */ newSize = oldSize * 2; array->data.cell = (ArrayCell *)eRealloc( (void *)(array->data.cell), newSize * sizeof(ArrayCell) ); /* initialize new area */ for ( i = oldSize; i < newSize; i++ ) { array->data.cell[i].key = NULL; array->data.cell[i].data.datatype = DATA_UNDEFINED; } /* set size */ array->upper[0] = newSize; } }
/* buildKey: build key from stack data */ char *buildKey( Array *array, Symbol *s ) { int args, i, keylen; char *index, *buffer; /* FIX: should eventually just realloc when size is exceeded */ /* create a buffer */ buffer = (char *)eMalloc( 256 ); buffer[0] = '\0'; /* check arg count */ args = (int)popNumber(); /* there must be at least one index */ if (args == 0) { ePrintf( Runtime, "Array %s[]x expects at least 1 index, not 0" ); } /* build the key backwards, for speed */ keylen = 0; for ( i = 1; i <= args; i++ ) { /* get index */ index = popString(); /* make sure it fits in the buffer */ keylen += strlen( index ); if (keylen >= 256) { ePrintf( Runtime, "Array key exceeds 256 characters" ); } /* append to key */ strcat( buffer, index ); /* ivanixcu: debug need free allocated memory of index! printf("ivanixdebug: freeing (index) (%d)\n", *index ); */ if (*index != '\0' ){ eFree( index ); } if (i < args) { /* add delimiter */ keylen += 1; if (keylen >= 256) { ePrintf( Runtime, "Array key exceeds 256 characters" ); } /* replace with ASCII 34 eventually */ strcat( buffer, "," ); } } /* resize the buffer */ return (char *)eRealloc( buffer, keylen+1 ); }
extern NestingLevel * nestingLevelsPush(NestingLevels *nls, int corkIndex) { NestingLevel *nl = NULL; if (nls->n >= nls->allocated) { nls->allocated++; nls->levels = eRealloc(nls->levels, nls->allocated * NL_SIZE (nls)); } nl = NL_NTH(nls, nls->n); nls->n++; nl->corkIndex = corkIndex; return nl; }