gen: prefer good registers to those holding the operands
[neatcc.git] / mem.c
blob74a77d8b6ef261d2fa8aa27c52d047d98a4e35c6
1 #include <stdarg.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "ncc.h"
7 #define MEMSZ 512
9 static void mem_extend(struct mem *mem)
11 char *s = mem->s;
12 mem->sz = mem->sz ? mem->sz + mem->sz : MEMSZ;
13 mem->s = malloc(mem->sz);
14 if (mem->n)
15 memcpy(mem->s, s, mem->n);
16 free(s);
19 void mem_init(struct mem *mem)
21 memset(mem, 0, sizeof(*mem));
24 void mem_done(struct mem *mem)
26 free(mem->s);
27 memset(mem, 0, sizeof(*mem));
30 void mem_cut(struct mem *mem, long pos)
32 mem->n = pos < mem->n ? pos : mem->n;
35 void mem_cpy(struct mem *mem, long off, void *buf, long len)
37 while (mem->n + off + len + 1 >= mem->sz)
38 mem_extend(mem);
39 memcpy(mem->s + off, buf, len);
42 void mem_put(struct mem *mem, void *buf, long len)
44 mem_cpy(mem, mem->n, buf, len);
45 mem->n += len;
48 void mem_putc(struct mem *mem, int c)
50 if (mem->n + 2 >= mem->sz)
51 mem_extend(mem);
52 mem->s[mem->n++] = c;
55 void mem_putz(struct mem *mem, long sz)
57 while (mem->n + sz + 1 >= mem->sz)
58 mem_extend(mem);
59 memset(mem->s + mem->n, 0, sz);
60 mem->n += sz;
63 /* return a pointer to mem's buffer; valid as long as mem is not modified */
64 void *mem_buf(struct mem *mem)
66 if (!mem->s)
67 return "";
68 mem->s[mem->n] = '\0';
69 return mem->s;
72 long mem_len(struct mem *mem)
74 return mem->n;
77 void *mem_get(struct mem *mem)
79 void *ret;
80 if (!mem->s)
81 mem_extend(mem);
82 ret = mem->s;
83 mem_init(mem);
84 return ret;