summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-07-15 10:00:34 +0200
committerAraq <rumpf_a@web.de>2012-07-15 10:00:34 +0200
commit1279bd285507524d32bc7bfe6c2d4c706d1157a9 (patch)
tree9d193e884517740f6e658472e8d26bf10b332844
parent96be38e79419d646190fa16122804edef7b51f8a (diff)
downloadNim-1279bd285507524d32bc7bfe6c2d4c706d1157a9.tar.gz
c2nim and system.nim now agree on a C type mapping
-rwxr-xr-xcompiler/c2nim/cparse.nim21
-rwxr-xr-xcompiler/c2nim/tests/systest.c4
-rw-r--r--examples/lazarus/nimlaz.rc6
-rwxr-xr-xlib/system.nim11
4 files changed, 34 insertions, 8 deletions
diff --git a/compiler/c2nim/cparse.nim b/compiler/c2nim/cparse.nim
index 67ab6cf26..5715e1089 100755
--- a/compiler/c2nim/cparse.nim
+++ b/compiler/c2nim/cparse.nim
@@ -434,14 +434,21 @@ proc typeAtom(p: var TParser): PNode =
     getTok(p, nil)
     result = skipIdent(p)
   elif isIntType(p.tok.s):
-    var x = "c" & p.tok.s
-    getTok(p, nil)
-    while p.tok.xkind == pxSymbol and 
-        (isIntType(p.tok.s) or p.tok.s == "char"):
-      add(x, p.tok.s)
+    var x = ""
+    #getTok(p, nil)
+    var isUnsigned = false
+    while p.tok.xkind == pxSymbol and (isIntType(p.tok.s) or p.tok.s == "char"):
+      if p.tok.s == "unsigned":
+        isUnsigned = true
+      elif p.tok.s == "signed" or p.tok.s == "int":
+        nil
+      else:
+        add(x, p.tok.s)
       getTok(p, nil)
-    result = mangledIdent(x, p)
-  else: 
+    if x.len == 0: x = "int"
+    let xx = if isUnsigned: "cu" & x else: "c" & x
+    result = mangledIdent(xx, p)
+  else:
     result = mangledIdent(p.tok.s, p)
     getTok(p, result)
     
diff --git a/compiler/c2nim/tests/systest.c b/compiler/c2nim/tests/systest.c
index 389fdfdc2..241526e07 100755
--- a/compiler/c2nim/tests/systest.c
+++ b/compiler/c2nim/tests/systest.c
@@ -15,6 +15,8 @@ typedef const char* (*callback2)(int rc, long L, const char* buffer);
 int   aw_callback_set (AW_CALLBACK c, callback_t callback );
 int   aw_instance_callback_set (AW_CALLBACK c, callback_t callback);
 
+unsigned long int wawa;
+
 #define AW_BUILD 85 // AW 5.0
 // Limits
 #define AW_MAX_AVCHANGE_PER_SECOND 10
@@ -34,7 +36,7 @@ int   aw_instance_callback_set (AW_CALLBACK c, callback_t callback);
 #mangle "'XML_'{.*}" "$1"
 #private "'XML_ParserStruct'"
 
-#mangle cunsignedint cint
+#mangle cuint cint
 
 unsigned int uiVar;
 
diff --git a/examples/lazarus/nimlaz.rc b/examples/lazarus/nimlaz.rc
new file mode 100644
index 000000000..d66bb817c
--- /dev/null
+++ b/examples/lazarus/nimlaz.rc
@@ -0,0 +1,6 @@
+#define RT_MANIFEST  24

+#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1

+#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2

+#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3

+

+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "nimlaz.manifest"
diff --git a/lib/system.nim b/lib/system.nim
index 5e223eb10..6cb99b6cf 100755
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -946,6 +946,17 @@ type # these work for most platforms:
     ## This is the same as the type ``long double`` in *C*.
     ## This C type is not supported by Nimrod's code generator
 
+  cuchar* {.importc: "unsigned char", nodecl.} = char
+    ## This is the same as the type ``unsigned char`` in *C*.
+  cushort* {.importc: "unsigned short", nodecl.} = uint16
+    ## This is the same as the type ``unsigned short`` in *C*.
+  cuint* {.importc: "int", nodecl.} = uint32
+    ## This is the same as the type ``unsigned int`` in *C*.
+  culong* {.importc: "unsigned long", nodecl.} = uint
+    ## This is the same as the type ``unsigned long`` in *C*.
+  culonglong* {.importc: "unsigned long long", nodecl.} = uint64
+    ## This is the same as the type ``unsigned long long`` in *C*.
+
   cstringArray* {.importc: "char**", nodecl.} = ptr array [0..50_000, cstring]
     ## This is binary compatible to the type ``char**`` in *C*. The array's
     ## high value is large enough to disable bounds checking in practice.