/*********************************************************************** * $Id$ * Copyright 2009 Aplix Corporation. All rights reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ***********************************************************************/ #include #include #include #include #include "misc.h" #include "os.h" /* to get va_copy on windows */ extern const char *progname; /*********************************************************************** * memory allocation wrappers */ void * memalloc(size_t size) { void *ptr = malloc(size); if (!ptr) errorexit("out of memory"); /* Zero initialise memory from memalloc. */ memset(ptr, 0, size); return ptr; } void * memrealloc(void *ptr, size_t size) { void *newptr = realloc(ptr, size); if (!newptr) errorexit("out of memory"); return newptr; } void memfree(void *ptr) { *(int *)ptr = 0xfefefefe; free(ptr); } /*********************************************************************** * vmemprintf, memprintf : allocate buffer and sprintf into it */ char * memprintf(const char *format, ...) { va_list ap; char *buf; va_start(ap, format); buf = vmemprintf(format, ap); va_end(ap); return buf; } char * vmemprintf(const char *format, va_list ap) { char *buf; unsigned int max, len; va_list ap2; max = 16; for (;;) { va_copy(ap2, ap); buf = memalloc(max); len = vsnprintf(buf, max, format, ap2); va_end(ap2); if (len < max) break; memfree(buf); max *= 2; } return buf; } /*********************************************************************** * errorexit : print error message then exit */ void vlocerrorexit(const char *filename, unsigned int linenum, const char *format, va_list ap) { if (filename) fprintf(stderr, linenum ? "%s: %i: " : "%s: ", filename, linenum); vfprintf(stderr, format, ap); fputc('\n', stderr); exit(1); } void locerrorexit(const char *filename, unsigned int linenum, const char *format, ...) { va_list ap; va_start(ap, format); vlocerrorexit(filename, linenum, format, ap); va_end(ap); } void errorexit(const char *format, ...) { va_list ap; va_start(ap, format); vlocerrorexit(0, 0, format, ap); va_end(ap); }