http://bugs.winehq.org/show_bug.cgi?id=6000
Summary: scanf format "%i" does not recognise octal nor hexadecimal numbers Product: Wine Version: CVS Platform: Other OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: wine-binary AssignedTo: wine-bugs@winehq.org ReportedBy: popej@friko.onet.pl
For format "%i" scanf does not recognise octal and hexadecimal prefikses. This is example of application code, that will not work correctly under wine:
char data[] = "17 017 0x17"; int a, b, c; sscanf(data, "%i%i%i", &a, &b, &c);
IMHO error is in /wine/dlls/msvcrt/scanf.h . This is current version from CVS:
171 case 'i': /* generic integer */ 172 base = 10; 173 number: { 174 /* read an integer */ 175 ULONGLONG cur = 0; 176 int negative = 0; 177 int seendigit=0; 178 /* skip initial whitespace */ 179 while ((nch!=_EOF_) && _ISSPACE_(nch)) 180 nch = _GETC_(file); 181 /* get sign */ 182 if (nch == '-' || nch == '+') { 183 negative = (nch=='-'); 184 nch = _GETC_(file); 185 if (width>0) width--; 186 } 187 /* look for leading indication of base */ 188 if (width!=0 && nch == '0') { 189 nch = _GETC_(file); 190 if (width>0) width--; 191 seendigit=1; 192 if (width!=0 && (nch=='x' || nch=='X')) { 193 if (base==0) 194 base=16; 195 if (base==16) { 196 nch = _GETC_(file); 197 if (width>0) width--; 198 seendigit=0; 199 } 200 } else if (base==0) 201 base = 8; 202 }
Should be:
171 case 'i': /* generic integer */ 172 base = 0; /* proposed correction - base unknown */ ... 188 if (width!=0 && nch == '0') { ... 202 } /* proposed correction - insert after line 202: */ if (base == 0) /* when there is no prefix */ base = 10; /* set default base */