Fix issue #324: u/l constant integer suffix (#326)


diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py
index 4e1889d..a32d0cc 100644
--- a/pycparser/c_parser.py
+++ b/pycparser/c_parser.py
@@ -1766,8 +1766,28 @@
                         | INT_CONST_HEX
                         | INT_CONST_BIN
         """
+        uCount = 0
+        lCount = 0
+        for x in p[1][-3:]:
+            if x in ('l', 'L'):
+                lCount += 1
+            elif x in ('u', 'U'):
+                uCount += 1
+        t = ''
+        if uCount > 1:
+             raise ValueError('Constant cannot have more than one u/U suffix.')
+        elif lCount > 2:
+             raise ValueError('Constant cannot have more than two l/L suffix.')
+        else:
+            if uCount:
+                t += 'unsigned '
+            if lCount == 1:
+                t += 'long '
+            elif lCount == 2:
+                t += 'long long '
+            t += 'int'
         p[0] = c_ast.Constant(
-            'int', p[1], self._token_coord(p, 1))
+            t, p[1], self._token_coord(p, 1))
 
     def p_constant_2(self, p):
         """ constant    : FLOAT_CONST
diff --git a/tests/test_c_parser.py b/tests/test_c_parser.py
index c09e04d..6cd183d 100755
--- a/tests/test_c_parser.py
+++ b/tests/test_c_parser.py
@@ -1262,6 +1262,22 @@
         self.assertEqual(self.get_decl_init(d55),
             ['Constant', 'float', '0xDE.38p0'])
 
+        d6 = 'int i = 1;'
+        self.assertEqual(self.get_decl_init(d6),
+            ['Constant', 'int', '1'])
+
+        d61 = 'long int li = 1l;'
+        self.assertEqual(self.get_decl_init(d61),
+            ['Constant', 'long int', '1l'])
+
+        d62 = 'unsigned int ui = 1u;'
+        self.assertEqual(self.get_decl_init(d62),
+            ['Constant', 'unsigned int', '1u'])
+
+        d63 = 'unsigned long long int ulli = 1LLU;'
+        self.assertEqual(self.get_decl_init(d63),
+            ['Constant', 'unsigned long long int', '1LLU'])
+
     def test_decl_named_inits(self):
         d1 = 'int a = {.k = 16};'
         self.assertEqual(self.get_decl_init(d1),
@@ -1447,7 +1463,7 @@
         self.assertIsInstance(s1_ast.ext[1].body.block_items[0], Pragma)
         self.assertEqual(s1_ast.ext[1].body.block_items[0].string, 'foo')
         self.assertEqual(s1_ast.ext[1].body.block_items[0].coord.line, 4)
-        
+
         self.assertIsInstance(s1_ast.ext[1].body.block_items[2], Pragma)
         self.assertEqual(s1_ast.ext[1].body.block_items[2].string, 'baz')
         self.assertEqual(s1_ast.ext[1].body.block_items[2].coord.line, 6)