on d7b2913 help sign in
Idris-dev/llvm/defs.c
182 lines 4.1 kB history raw
1#include <stdlib.h>
2#include <stdio.h>
3#include <gmp.h>
4#include <gc.h>
5#include <string.h>
6#include <inttypes.h>
8extern char** environ;
10void putStr(const char *str) {
11 fputs(str, stdout);
14void putErr(const char *str) {
15 fputs(str, stderr);
18void mpz_init_set_ull(mpz_t n, unsigned long long ull)
20 mpz_init_set_ui(n, (unsigned int)(ull >> 32)); /* n = (unsigned int)(ull >> 32) */
21 mpz_mul_2exp(n, n, 32); /* n <<= 32 */
22 mpz_add_ui(n, n, (unsigned int)ull); /* n += (unsigned int)ull */
25void mpz_init_set_sll(mpz_t n, long long sll)
27 mpz_init_set_si(n, (int)(sll >> 32)); /* n = (int)sll >> 32 */
28 mpz_mul_2exp(n, n, 32 ); /* n <<= 32 */
29 mpz_add_ui(n, n, (unsigned int)sll); /* n += (unsigned int)sll */
32void mpz_set_sll(mpz_t n, long long sll)
34 mpz_set_si(n, (int)(sll >> 32)); /* n = (int)sll >> 32 */
35 mpz_mul_2exp(n, n, 32 ); /* n <<= 32 */
36 mpz_add_ui(n, n, (unsigned int)sll); /* n += (unsigned int)sll */
39unsigned long long mpz_get_ull(mpz_t n)
41 unsigned int lo, hi;
42 mpz_t tmp;
44 mpz_init( tmp );
45 mpz_mod_2exp( tmp, n, 64 ); /* tmp = (lower 64 bits of n) */
47 lo = mpz_get_ui( tmp ); /* lo = tmp & 0xffffffff */
48 mpz_div_2exp( tmp, tmp, 32 ); /* tmp >>= 32 */
49 hi = mpz_get_ui( tmp ); /* hi = tmp & 0xffffffff */
51 mpz_clear( tmp );
53 return (((unsigned long long)hi) << 32) + lo;
56char *__idris_strCons(char c, char *s) {
57 size_t len = strlen(s);
58 char *result = GC_malloc_atomic(len+2);
59 result[0] = c;
60 memcpy(result+1, s, len);
61 result[len+1] = 0;
62 return result;
65#define BUFSIZE 256
66char *__idris_readStr(FILE* h) {
67// Modified from 'safe-fgets.c' in the gdb distribution.
68// (see http://www.gnu.org/software/gdb/current/)
69 char *line_ptr;
70 char* line_buf = (char *) GC_malloc (BUFSIZE);
71 int line_buf_size = BUFSIZE;
73 /* points to last byte */
74 line_ptr = line_buf + line_buf_size - 1;
76 /* so we can see if fgets put a 0 there */
77 *line_ptr = 1;
78 if (fgets (line_buf, line_buf_size, h) == 0)
79 return "";
81 /* we filled the buffer? */
82 while (line_ptr[0] == 0 && line_ptr[-1] != '\n')
83 {
84 /* Make the buffer bigger and read more of the line */
85 line_buf_size += BUFSIZE;
86 line_buf = (char *) GC_realloc (line_buf, line_buf_size);
88 /* points to last byte again */
89 line_ptr = line_buf + line_buf_size - 1;
90 /* so we can see if fgets put a 0 there */
91 *line_ptr = 1;
93 if (fgets (line_buf + line_buf_size - BUFSIZE - 1, BUFSIZE + 1, h) == 0)
94 return "";
95 }
97 return line_buf;
100void* fileOpen(char* name, char* mode) {
101 FILE* f = fopen(name, mode);
102 return (void*)f;
105void fileClose(void* h) {
106 FILE* f = (FILE*)h;
107 fclose(f);
110int fileEOF(void* h) {
111 FILE* f = (FILE*)h;
112 return feof(f);
115int fileError(void* h) {
116 FILE* f = (FILE*)h;
117 return ferror(f);
120void fputStr(void* h, char* str) {
121 FILE* f = (FILE*)h;
122 fputs(str, f);
125int isNull(void* ptr) {
126 return ptr==NULL;
129char* getEnvPair(int i) {
130 return *(environ + i);
133void idris_memset(void* ptr, size_t offset, uint8_t c, size_t size) {
134 memset(((uint8_t*)ptr) + offset, c, size);
137uint8_t idris_peek(void* ptr, size_t offset) {
138 return *(((uint8_t*)ptr) + offset);
141void idris_poke(void* ptr, size_t offset, uint8_t data) {
142 *(((uint8_t*)ptr) + offset) = data;
145void idris_memmove(void* dest, void* src, size_t dest_offset, size_t src_offset, size_t size) {
146 memmove(dest + dest_offset, src + src_offset, size);
149void *__idris_gmpMalloc(size_t size) {
150 return GC_malloc(size);
153void *__idris_gmpRealloc(void *ptr, size_t oldSize, size_t size) {
154 return GC_realloc(ptr, size);
157void __idris_gmpFree(void *ptr, size_t oldSize) {
158 GC_free(ptr);
161char *__idris_strRev(const char *s) {
162 int x = strlen(s);
163 int y = 0;
164 char *t = GC_malloc(x+1);
166 t[x] = '\0';
167 while(x>0) {
168 t[y++] = s[--x];
169 }
170 return t;
173int __idris_argc;
174char **__idris_argv;
176int idris_numArgs() {
177 return __idris_argc;
180const char* idris_getArg(int i) {
181 return __idris_argv[i];