void *util_memory_r (void *, size_t, unsigned int, const char *);
void util_meminfo ();
+bool util_filexists (const char *);
bool util_strupper (const char *);
bool util_strdigit (const char *);
bool util_strncmpexact (const char *, const char *, size_t);
uint32_t util_crc32(uint32_t crc, const char *data, size_t len);
#ifdef NOTRACK
-# define mem_a(x) malloc(x)
-# define mem_d(x) free (x)
-# define mem_r(x, n) free (x, n)
+# define mem_a(x) malloc (x)
+# define mem_d(x) free (x)
+# define mem_r(x, n) realloc(x, n)
#else
# define mem_a(x) util_memory_a((x), __LINE__, __FILE__)
# define mem_d(x) util_memory_d((x), __LINE__, __FILE__)
#define _vec_needsgrow(A,N) ((!(A)) || (_vec_end(A) + (N) >= _vec_beg(A)))
#define _vec_mightgrow(A,N) (_vec_needsgrow((A), (N)) ? _vec_forcegrow((A),(N)) : 0)
#define _vec_forcegrow(A,N) _util_vec_grow((void**)&(A), (N), sizeof(*(A)))
+#define _vec_remove(A,S,I,N) (memmove((char*)(A)+(I)*(S),(char*)(A)+((I)+(N))*(S),(S)*(vec_size(A)-(I)-(N))), _vec_end(A)-=(N))
void _util_vec_grow(void **a, size_t i, size_t s);
/* exposed interface */
#define vec_free(A) ((A) ? (mem_d(_vec_raw(A)), (A) = NULL) : 0)
#define vec_add(A,N) (_vec_mightgrow((A),(N)), _vec_end(A)+=(N), &(A)[_vec_end(A)-(N)])
#define vec_last(A) ((A)[_vec_end(A)-1])
#define vec_append(A,N,S) memcpy(vec_add((A), (N)), (S), N * sizeof(*(S)))
-#define _vec_remove(A,S,I,N) (memmove((char*)(A)+(I)*(S),(char*)(A)+((I)+(N))*(S),(S)*(vec_size(A)-(I)-(N))), _vec_end(A)-=(N))
#define vec_remove(A,I,N) _vec_remove((A), sizeof(*(A)), (I), (N))
#define vec_pop(A) vec_remove((A), _vec_end(A)-1, 1)
/* these are supposed to NOT reallocate */
{ "END" , 0, 3 } /* virtual assembler instruction */
};
/*===================================================================*/
-/*============================= ast.c ===============================*/
+/*============================= ir.c ================================*/
/*===================================================================*/
-#define MEM_VECTOR_PROTO(Towner, Tmem, mem) \
- bool GMQCC_WARN Towner##_##mem##_add(Towner*, Tmem); \
- bool GMQCC_WARN Towner##_##mem##_remove(Towner*, size_t)
-
-#define MEM_VECTOR_PROTO_ALL(Towner, Tmem, mem) \
- MEM_VECTOR_PROTO(Towner, Tmem, mem); \
- bool GMQCC_WARN Towner##_##mem##_find(Towner*, Tmem, size_t*); \
- void Towner##_##mem##_clear(Towner*)
-
-#define MEM_VECTOR_MAKE(Twhat, name) \
- Twhat *name; \
- size_t name##_count; \
- size_t name##_alloc
-
-#define MEM_VEC_FUN_ADD(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_add(Tself *self, Twhat f) \
-{ \
- Twhat *reall; \
- if (self->mem##_count == self->mem##_alloc) { \
- if (!self->mem##_alloc) { \
- self->mem##_alloc = 16; \
- } else { \
- self->mem##_alloc *= 2; \
- } \
- reall = (Twhat*)mem_a(sizeof(Twhat) * self->mem##_alloc); \
- if (!reall) { \
- return false; \
- } \
- memcpy(reall, self->mem, sizeof(Twhat) * self->mem##_count); \
- mem_d(self->mem); \
- self->mem = reall; \
- } \
- self->mem[self->mem##_count++] = f; \
- return true; \
-}
-
-#define MEM_VEC_FUN_REMOVE(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_remove(Tself *self, size_t idx) \
-{ \
- size_t i; \
- Twhat *reall; \
- if (idx >= self->mem##_count) { \
- return true; /* huh... */ \
- } \
- for (i = idx; i < self->mem##_count-1; ++i) { \
- self->mem[i] = self->mem[i+1]; \
- } \
- self->mem##_count--; \
- if (self->mem##_count < self->mem##_count/2) { \
- self->mem##_alloc /= 2; \
- reall = (Twhat*)mem_a(sizeof(Twhat) * self->mem##_count); \
- if (!reall) { \
- return false; \
- } \
- memcpy(reall, self->mem, sizeof(Twhat) * self->mem##_count); \
- mem_d(self->mem); \
- self->mem = reall; \
- } \
- return true; \
-}
-
-#define MEM_VEC_FUN_FIND(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_find(Tself *self, Twhat obj, size_t *idx) \
-{ \
- size_t i; \
- for (i = 0; i < self->mem##_count; ++i) { \
- if (self->mem[i] == obj) { \
- if (idx) { \
- *idx = i; \
- } \
- return true; \
- } \
- } \
- return false; \
-}
-
-#define MEM_VEC_FUN_APPEND(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_append(Tself *s, Twhat *p, size_t c) \
-{ \
- Twhat *reall; \
- size_t oldalloc; \
- if (s->mem##_count+c > s->mem##_alloc) { \
- if (!s->mem##_alloc) { \
- s->mem##_alloc = c < 16 ? 16 : c; \
- s->mem = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc); \
- } else { \
- oldalloc = s->mem##_alloc; \
- s->mem##_alloc *= 2; \
- if (s->mem##_count+c >= s->mem##_alloc) { \
- s->mem##_alloc = s->mem##_count+c; \
- } \
- reall = (Twhat*)mem_a(sizeof(Twhat) * s->mem##_alloc); \
- if (!reall) { \
- s->mem##_alloc = oldalloc; \
- return false; \
- } \
- memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count); \
- mem_d(s->mem); \
- s->mem = reall; \
- } \
- } \
- memcpy(&s->mem[s->mem##_count], p, c*sizeof(*p)); \
- s->mem##_count += c; \
- return true; \
-}
-
-#define MEM_VEC_FUN_RESIZE(Tself, Twhat, mem) \
-bool GMQCC_WARN Tself##_##mem##_resize(Tself *s, size_t c) \
-{ \
- Twhat *reall; \
- if (c > s->mem##_alloc) { \
- reall = (Twhat*)mem_a(sizeof(Twhat) * c); \
- if (!reall) { return false; } \
- memcpy(reall, s->mem, sizeof(Twhat) * s->mem##_count); \
- s->mem##_alloc = c; \
- s->mem##_count = c; \
- mem_d(s->mem); \
- s->mem = reall; \
- return true; \
- } \
- s->mem##_count = c; \
- if (c < (s->mem##_alloc / 2)) { \
- reall = (Twhat*)mem_a(sizeof(Twhat) * c); \
- if (!reall) { return false; } \
- memcpy(reall, s->mem, sizeof(Twhat) * c); \
- mem_d(s->mem); \
- s->mem = reall; \
- s->mem##_alloc = c; \
- } \
- return true; \
-}
-
-#define MEM_VEC_FUN_CLEAR(Tself, mem) \
-void Tself##_##mem##_clear(Tself *self) \
-{ \
- if (!self->mem) \
- return; \
- mem_d((void*) self->mem); \
- self->mem = NULL; \
- self->mem##_count = 0; \
- self->mem##_alloc = 0; \
-}
-
-#define MEM_VECTOR_CLEAR(owner, mem) \
- if ((owner)->mem) \
- mem_d((void*)((owner)->mem)); \
- (owner)->mem = NULL; \
- (owner)->mem##_count = 0; \
- (owner)->mem##_alloc = 0
-
-#define MEM_VECTOR_INIT(owner, mem) \
-{ \
- (owner)->mem = NULL; \
- (owner)->mem##_count = 0; \
- (owner)->mem##_alloc = 0; \
-}
-
-#define MEM_VECTOR_MOVE(from, mem, to, tm) \
-{ \
- (to)->tm = (from)->mem; \
- (to)->tm##_count = (from)->mem##_count; \
- (to)->tm##_alloc = (from)->mem##_alloc; \
- (from)->mem = NULL; \
- (from)->mem##_count = 0; \
- (from)->mem##_alloc = 0; \
-}
-
-#define MEM_VEC_FUNCTIONS(Tself, Twhat, mem) \
-MEM_VEC_FUN_REMOVE(Tself, Twhat, mem) \
-MEM_VEC_FUN_ADD(Tself, Twhat, mem)
-
-#define MEM_VEC_FUNCTIONS_ALL(Tself, Twhat, mem) \
-MEM_VEC_FUNCTIONS(Tself, Twhat, mem) \
-MEM_VEC_FUN_CLEAR(Tself, mem) \
-MEM_VEC_FUN_FIND(Tself, Twhat, mem)
enum store_types {
store_global,
bool parser_compile_string(const char *name, const char *str);
bool parser_finish (const char *output);
void parser_cleanup ();
+/* There's really no need to strlen() preprocessed files */
+bool parser_compile_string_len(const char *name, const char *str, size_t len);
+
+/*===================================================================*/
+/*====================== ftepp.c commandline ========================*/
+/*===================================================================*/
+bool ftepp_init ();
+bool ftepp_preprocess_file (const char *filename);
+bool ftepp_preprocess_string(const char *name, const char *str);
+void ftepp_finish ();
+const char *ftepp_get ();
+void ftepp_flush ();
/*===================================================================*/
/*======================= main.c commandline ========================*/