on master help sign in
StrRev primitive too
commitdd51bf730749340084384082bdcbbcd17efa05e6 authorBenjamin Saunders <besaunde@sfu.ca> dateThu 25 Jul 2013, 02:43 (13 years ago) parenta4325c0
2 files changed+17
llvm/defs.c+12 src/IRTS/CodegenLLVM.hs+5
llvm/defs.c+12
@@ -146,3 +146,15 @@ void *__idris_gmpRealloc(void *ptr, size_t oldSize, size_t size) {
146146void __idris_gmpFree(void *ptr, size_t oldSize) {
147147 GC_free(ptr);
148148}
149+
150+char *__idris_strRev(const char *s) {
151+ int x = strlen(s);
152+ int y = 0;
153+ char *t = GC_malloc(x+1);
154+
155+ t[x] = '\0';
156+ while(x>0) {
157+ t[y++] = s[--x];
158+ }
159+ return t;
160+}
src/IRTS/CodegenLLVM.hs+5
@@ -188,6 +188,7 @@ initDefs tgt =
188188 , exfun "__idris_gmpMalloc" ptrI8 [intPtr] False
189189 , exfun "__idris_gmpRealloc" ptrI8 [ptrI8, intPtr, intPtr] False
190190 , exfun "__idris_gmpFree" VoidType [ptrI8, intPtr] False
191+ , exfun "__idris_strRev" ptrI8 [ptrI8] False
191192 , exfun "strtoll" (IntegerType 64) [ptrI8, PointerType ptrI8 (AddrSpace 0), IntegerType 32] False
192193 , exVar (stdinName tgt) ptrI8
193194 , exVar (stdoutName tgt) ptrI8
@@ -1027,6 +1028,10 @@ cgOp LStrLen [s] = do
10271028 | x < 32 -> inst $ ZExt len (IntegerType 32) []
10281029 box (FArith (ATInt (ITFixed IT32))) len'
10291030
1031+cgOp LStrRev [s] = do
1032+ ns <- unbox FString s
1033+ box FString =<< inst (simpleCall "__idris_strRev" [ns])
1034+
10301035cgOp LReadStr [p] = do
10311036 np <- unbox FPtr p
10321037 s <- inst $ simpleCall "__idris_readStr" [np]