static char *ReadString (FILE *f, char ch, VStringConst name) { VBoolean escaped = (ch == '"'); size_t len = 0; char *cp; size_t max_len; char *buf; buf = VMalloc (StringAllocIncrement); max_len = StringAllocIncrement; if (! escaped) ungetc (ch, f); cp = buf; while (1) { ch = fgetc (f); /* Check for premature EOF: */ if (ch == EOF) { VWarning ("VReadFile: EOF encountered in %s attribute", name); return NULL; } /* Check for closing " or escape sequence: */ if (escaped) { if (ch == '"') break; if (ch == '\\') switch (ch = fgetc (f)) { case '\n': continue; case 'n': ch = '\n'; } } else if (isspace (ch)) break; /* If the buffer in which we're accumulating the value is full, allocate a larger one: */ if (++len == max_len) { buf = VRealloc (buf, max_len += StringAllocIncrement); cp = buf + len - 1; } /* Store the character in the current buffer: */ *cp++ = ch; } *cp = 0; /* Allocate a node of the correct size, or trim one already allocated so it is the correct size: */ return buf; }
static void LoadHelpFile (void) { FILE *f; size_t len, incr; Topic *topic; char buf[100]; ntopics = 0; topics = topic = VMalloc (sizeof (Topic) * maxTopics); if (! (f = fopen (helpFilename, "r"))) { VWarning ("Unable to open help database %s", helpFilename); ntopics = 1; topic->topic = "(No help topics)"; topic->text = "(No help text)"; topic->len = strlen (topic->text); return; } do { fgets (buf, sizeof (buf), f); } while (! feof (f) && buf[0] != '@'); while (! feof (f) && ntopics < maxTopics) { len = strlen (buf); if (buf[len - 1] == '\n') buf[len - 1] = 0; topic->topic = VNewString (buf + 1); topic->text = NULL; len = 0; while (1) { fgets (buf, sizeof (buf), f); if (feof (f) || buf[0] == '@') break; incr = strlen (buf); topic->text = VRealloc ((XtPointer) topic->text, len + incr + 1); strcpy (topic->text + len, buf); len += incr; } while (len > 0 && isspace (topic->text[len - 1])) len--; topic->text[len] = 0; topic->len = len; ntopics++; topic++; } fclose (f); }
VRepnKind VRegisterType (VStringConst name, VTypeMethods *methods) { VRepnInfoRec *p; /* Move the existing type information into a bigger table: */ if (VRepnInfo == builtin_repn_info) { VRepnInfo = VMalloc ((VNRepnKinds + 1) * sizeof (VRepnInfoRec)); memcpy(VRepnInfo, builtin_repn_info, VNRepnKinds * sizeof (VRepnInfoRec)); } else VRepnInfo = VRealloc (VRepnInfo, (nRepnKinds + 1) * sizeof (VRepnInfoRec)); /* Write the new type's info into the last table entry: */ p = VRepnInfo + nRepnKinds; p->name = VNewString (name); p->size = p->precision = p->min_value = p->max_value = 0.0; p->methods = methods; return nRepnKinds++; }
BOOLEAN enQueue(Queue *pQ, Voxel e) { if (pQ->front > msize) msize = pQ->front; if (pQ->front < QueueSize - 1) { pQ->A[(pQ->front)++] = e; return TRUE; } else if (pQ->rear > 2) { pQ->A[--(pQ->rear)] = e; return TRUE; } else { QueueSize += QueueSize * 0.2; fprintf(stderr," realloc: %d\n",QueueSize); queue.A = (Voxel *) VRealloc(queue.A,sizeof(Voxel) * QueueSize); pQ->A[(pQ->front)++] = e; return TRUE; } }