+ return setuint(v);
+ }
+}
+
+static inline int handlehex()
+{
+ char l = (yytext[0]=='-')+2;
+
+ if(yyleng-l>8) {
+ char*s = nrbuf();
+ syntaxerror("integer overflow %s", s);
+ }
+
+ int t;
+ unsigned int v = 0;
+ for(t=l;t<yyleng;t++) {
+ v<<=4;
+ char c = yytext[t];
+ if(c>='0' && c<='9')
+ v|=(c&15);
+ else if(c>='a' && c<='f' ||
+ c>='A' && c<='F')
+ v|=(c&0x0f)+9;
+ }
+ if(l && v>1073741824) {
+ char*s = nrbuf();
+ warning("signed integer overflow: %s", s);
+ return setfloat(v);
+ }
+ if(!l && v>2147483647) {
+ char*s = nrbuf();
+ warning("unsigned integer overflow: %s", s);
+ return setfloat(v);
+ }
+
+ if(l==3) {
+ return setint(-(int)v);
+ } else {
+ return setuint(v);