undar-lang/emit/uxn/lib/undar.c

85 lines
1.3 KiB
C

#include "chibicc-uxn/varvara.h"
char mem[100];
unsigned mem_length;
char *
aalloc(unsigned size)
{
unsigned pos = mem_length;
mem_length += size;
return (char *)&mem[pos];
}
char *
areturn(unsigned checkpoint, char *src, unsigned size)
{
char *dest = (char *)&mem[checkpoint];
if(src == dest) return src;
for (unsigned i = 0; i < size; i++) {
dest[i] = src[i];
}
mem_length = checkpoint + size;
/* zero out the end of the memory copy (for strings mostly) */
mem[mem_length] = 0;
return dest;
}
void
afree()
{
mem_length = 0;
}
char *
amcpy(char *from, unsigned length)
{
char *ptr = aalloc(length);
for (unsigned i = 0; i < length; i++) {
ptr[i] = from[i];
}
return ptr;
}
char* nat_to_str(unsigned n) {
char buffer[5];
unsigned i = 5;
do {
buffer[--i] = '0' + n % 10;
n /= 10;
} while(n > 0);
return amcpy(buffer + i, 5 - i);
}
char* int_to_str(int n) {
char buffer[6];
unsigned i = 6;
_Bool neg = n < 0;
if (neg) n = -n;
do {
buffer[--i] = '0' + n % 10;
n /= 10;
} while(n > 0);
if(neg) buffer[--i] = '-';
return amcpy(buffer + i, 6 - i);
}
unsigned
int_to_nat(int n)
{
return (unsigned)n;
}
int
nat_to_int(unsigned n)
{
return (int)n;
}