85 lines
1.3 KiB
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;
|
|
}
|