code_junkie

Does anyone know of a C compiler that fails to compile this?

Nov 12th, 2011
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.06 KB | None | 0 0
  1. static int parseMonth(const char *input) {
  2. int rv=-1;
  3. int inputInt=0;
  4. int i=0;
  5.  
  6. for(i=0; i<4 && input[i]; i++) {
  7. inputInt = (inputInt << 8) | input[i];
  8. }
  9.  
  10. switch(inputInt) {
  11. case 'Jan/': rv=0; break;
  12. case 'Feb/': rv=1; break;
  13. case 'Mar/': rv=2; break;
  14. case 'Apr/': rv=3; break;
  15. case 'May/': rv=4; break;
  16. case 'Jun/': rv=5; break;
  17. case 'Jul/': rv=6; break;
  18. case 'Aug/': rv=7; break;
  19. case 'Sep/': rv=8; break;
  20. case 'Oct/': rv=9; break;
  21. case 'Nov/': rv=10; break;
  22. case 'Dec/': rv=11; break;
  23. }
  24.  
  25. return rv;
  26. }
  27.  
  28. #include <stdio.h>
  29.  
  30. static int parseMonth(const char *input) {
  31. int rv=-1;
  32. int inputInt=0;
  33. int i=0;
  34.  
  35. for(i=0; i<4 && input[i]; i++) {
  36. inputInt = (inputInt << 8) | input[i];
  37. }
  38.  
  39. switch(inputInt) {
  40. case 'Jan/': rv=0; break;
  41. case 'Feb/': rv=1; break;
  42. case 'Mar/': rv=2; break;
  43. case 'Apr/': rv=3; break;
  44. case 'May/': rv=4; break;
  45. case 'Jun/': rv=5; break;
  46. case 'Jul/': rv=6; break;
  47. case 'Aug/': rv=7; break;
  48. case 'Sep/': rv=8; break;
  49. case 'Oct/': rv=9; break;
  50. case 'Nov/': rv=10; break;
  51. case 'Dec/': rv=11; break;
  52. }
  53.  
  54. return rv;
  55. }
  56.  
  57. static const struct
  58. {
  59. char *data;
  60. int result;
  61. } test_case[] =
  62. {
  63. { "Jan/", 0 },
  64. { "Feb/", 1 },
  65. { "Mar/", 2 },
  66. { "Apr/", 3 },
  67. { "May/", 4 },
  68. { "Jun/", 5 },
  69. { "Jul/", 6 },
  70. { "Aug/", 7 },
  71. { "Sep/", 8 },
  72. { "Oct/", 9 },
  73. { "Nov/", 10 },
  74. { "Dec/", 11 },
  75. { "aJ/n", -1 },
  76. };
  77.  
  78. #define DIM(x) (sizeof(x)/sizeof(*(x)))
  79.  
  80. int main(void)
  81. {
  82. size_t i;
  83. int result;
  84.  
  85. for (i = 0; i < DIM(test_case); i++)
  86. {
  87. result = parseMonth(test_case[i].data);
  88. if (result != test_case[i].result)
  89. printf("!! FAIL !! %s (got %d, wanted %d)n",
  90. test_case[i].data, result, test_case[i].result);
  91. }
  92. return(0);
  93. }
  94.  
  95. $ gcc -O xx.c -o xx
  96. xx.c:14:14: warning: multi-character character constant
  97. xx.c:15:14: warning: multi-character character constant
  98. xx.c:16:14: warning: multi-character character constant
  99. xx.c:17:14: warning: multi-character character constant
  100. xx.c:18:14: warning: multi-character character constant
  101. xx.c:19:14: warning: multi-character character constant
  102. xx.c:20:14: warning: multi-character character constant
  103. xx.c:21:14: warning: multi-character character constant
  104. xx.c:22:14: warning: multi-character character constant
  105. xx.c:23:14: warning: multi-character character constant
  106. xx.c:24:14: warning: multi-character character constant
  107. xx.c:25:14: warning: multi-character character constant
  108. $ ./xx
  109. $ cc -o xx xx.c
  110. $ ./xx
  111. !! FAIL !! Jan/ (got -1, wanted 0)
  112. !! FAIL !! Feb/ (got -1, wanted 1)
  113. !! FAIL !! Mar/ (got -1, wanted 2)
  114. !! FAIL !! Apr/ (got -1, wanted 3)
  115. !! FAIL !! May/ (got -1, wanted 4)
  116. !! FAIL !! Jun/ (got -1, wanted 5)
  117. !! FAIL !! Jul/ (got -1, wanted 6)
  118. !! FAIL !! Aug/ (got -1, wanted 7)
  119. !! FAIL !! Sep/ (got -1, wanted 8)
  120. !! FAIL !! Oct/ (got -1, wanted 9)
  121. !! FAIL !! Nov/ (got -1, wanted 10)
  122. !! FAIL !! Dec/ (got -1, wanted 11)
  123. $
  124.  
  125. #include <stdio.h>
  126.  
  127. /* MONTH_CODE("Jan/") does not reduce to an integer constant */
  128. #define MONTH_CODE(x) ((((((x[0]<<8)|x[1])<<8)|x[2])<<8)|x[3])
  129.  
  130. #define MONTH_JAN (((((('J'<<8)|'a')<<8)|'n')<<8)|'/')
  131. #define MONTH_FEB (((((('F'<<8)|'e')<<8)|'b')<<8)|'/')
  132. #define MONTH_MAR (((((('M'<<8)|'a')<<8)|'r')<<8)|'/')
  133. #define MONTH_APR (((((('A'<<8)|'p')<<8)|'r')<<8)|'/')
  134. #define MONTH_MAY (((((('M'<<8)|'a')<<8)|'y')<<8)|'/')
  135. #define MONTH_JUN (((((('J'<<8)|'u')<<8)|'n')<<8)|'/')
  136. #define MONTH_JUL (((((('J'<<8)|'u')<<8)|'l')<<8)|'/')
  137. #define MONTH_AUG (((((('A'<<8)|'u')<<8)|'g')<<8)|'/')
  138. #define MONTH_SEP (((((('S'<<8)|'e')<<8)|'p')<<8)|'/')
  139. #define MONTH_OCT (((((('O'<<8)|'c')<<8)|'t')<<8)|'/')
  140. #define MONTH_NOV (((((('N'<<8)|'o')<<8)|'v')<<8)|'/')
  141. #define MONTH_DEC (((((('D'<<8)|'e')<<8)|'c')<<8)|'/')
  142.  
  143. static int parseMonth(const char *input) {
  144. int rv=-1;
  145. int inputInt=0;
  146. int i=0;
  147.  
  148. for(i=0; i<4 && input[i]; i++) {
  149. inputInt = (inputInt << 8) | input[i];
  150. }
  151.  
  152. switch(inputInt) {
  153. case MONTH_JAN: rv=0; break;
  154. case MONTH_FEB: rv=1; break;
  155. case MONTH_MAR: rv=2; break;
  156. case MONTH_APR: rv=3; break;
  157. case MONTH_MAY: rv=4; break;
  158. case MONTH_JUN: rv=5; break;
  159. case MONTH_JUL: rv=6; break;
  160. case MONTH_AUG: rv=7; break;
  161. case MONTH_SEP: rv=8; break;
  162. case MONTH_OCT: rv=9; break;
  163. case MONTH_NOV: rv=10; break;
  164. case MONTH_DEC: rv=11; break;
  165. }
  166.  
  167. return rv;
  168. }
  169.  
  170. static const struct
  171. {
  172. char *data;
  173. int result;
  174. } test_case[] =
  175. {
  176. { "Jan/", 0 },
  177. { "Feb/", 1 },
  178. { "Mar/", 2 },
  179. { "Apr/", 3 },
  180. { "May/", 4 },
  181. { "Jun/", 5 },
  182. { "Jul/", 6 },
  183. { "Aug/", 7 },
  184. { "Sep/", 8 },
  185. { "Oct/", 9 },
  186. { "Nov/", 10 },
  187. { "Dec/", 11 },
  188. { "aJ/n", -1 },
  189. { "/naJ", -1 },
  190. };
  191.  
  192. #define DIM(x) (sizeof(x)/sizeof(*(x)))
  193.  
  194. int main(void)
  195. {
  196. size_t i;
  197. int result;
  198.  
  199. for (i = 0; i < DIM(test_case); i++)
  200. {
  201. result = parseMonth(test_case[i].data);
  202. if (result != test_case[i].result)
  203. printf("!! FAIL !! %s (got %d, wanted %d)n",
  204. test_case[i].data, result, test_case[i].result);
  205. }
  206. return(0);
  207. }
  208.  
  209. if ( !input[0] || !input[1] || !input[2] || input[3] != '/' )
  210. return -1;
  211.  
  212. switch ( input[0] )
  213. {
  214. case 'F': return 1; // Feb
  215. case 'S': return 8; // Sep
  216. case 'O': return 9; // Oct
  217. case 'N': return 10; // Nov
  218. case 'D': return 11; // Dec;
  219. case 'A': return input[1] == 'p' ? 3 : 7; // Apr, Aug
  220. case 'M': return input[2] == 'r' ? 2 : 4; // Mar, May
  221. default: return input[1] == 'a' ? 0 : (input[2] == 'n' ? 5 : 6); // Jan, Jun, Jul
  222. }
  223.  
  224. uint32_t MONTH_JAN = 'J' << 24 + 'a' << 16 + 'n' << 8 + '/';
  225. uint32_t MONTH_FEB = 'F' << 24 + 'e' << 16 + 'b' << 8 + '/';
  226.  
  227. ...
  228.  
  229. static uint32_t parseMonth(const char *input) {
  230. uint32_t rv=-1;
  231. uint32_t inputInt=0;
  232. int i=0;
  233.  
  234. for(i=0; i<4 && input[i]; i++) {
  235. inputInt = (inputInt << 8) | (input[i] & 0x7f); // clear top bit
  236. }
  237.  
  238. switch(inputInt) {
  239. case MONTH_JAN: rv=0; break;
  240. case MONTH_FEB: rv=1; break;
  241.  
  242. ...
  243. }
  244.  
  245. return rv;
  246. }
  247.  
  248. char *months = "Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec/";
  249. char *p = strnstr(months, input, 4);
  250. return p ? (p - months) / 4 : -1;
  251.  
  252. Warning: Excess characters in multibyte character literal ignored.
  253.  
  254. Duplicate case label '77'.
  255.  
  256. Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
  257. Copyright 1988-2008 Comeau Computing. All rights reserved.
  258. MODE:strict errors C99
  259.  
  260. "ComeauTest.c", line 11: warning: multicharacter character literal (potential
  261. portability problem)
  262. case 'Jan/': rv=0; break;
  263. ^
  264.  
  265. "ComeauTest.c", line 12: warning: multicharacter character literal (potential
  266. portability problem)
  267. case 'Feb/': rv=1; break;
  268. ^
  269.  
  270. "ComeauTest.c", line 13: warning: multicharacter character literal (potential
  271. portability problem)
  272. case 'Mar/': rv=2; break;
  273. ^
  274.  
  275. "ComeauTest.c", line 14: warning: multicharacter character literal (potential
  276. portability problem)
  277. case 'Apr/': rv=3; break;
  278. ^
  279.  
  280. "ComeauTest.c", line 15: warning: multicharacter character literal (potential
  281. portability problem)
  282. case 'May/': rv=4; break;
  283. ^
  284.  
  285. "ComeauTest.c", line 16: warning: multicharacter character literal (potential
  286. portability problem)
  287. case 'Jun/': rv=5; break;
  288. ^
  289.  
  290. "ComeauTest.c", line 17: warning: multicharacter character literal (potential
  291. portability problem)
  292. case 'Jul/': rv=6; break;
  293. ^
  294.  
  295. "ComeauTest.c", line 18: warning: multicharacter character literal (potential
  296. portability problem)
  297. case 'Aug/': rv=7; break;
  298. ^
  299.  
  300. "ComeauTest.c", line 19: warning: multicharacter character literal (potential
  301. portability problem)
  302. case 'Sep/': rv=8; break;
  303. ^
  304.  
  305. "ComeauTest.c", line 20: warning: multicharacter character literal (potential
  306. portability problem)
  307. case 'Oct/': rv=9; break;
  308. ^
  309.  
  310. "ComeauTest.c", line 21: warning: multicharacter character literal (potential
  311. portability problem)
  312. case 'Nov/': rv=10; break;
  313. ^
  314.  
  315. "ComeauTest.c", line 22: warning: multicharacter character literal (potential
  316. portability problem)
  317. case 'Dec/': rv=11; break;
  318. ^
  319.  
  320. "ComeauTest.c", line 1: warning: function "parseMonth" was declared but never
  321. referenced
  322. static int parseMonth(const char *input) {
  323. ^
  324.  
  325. /* union -- demonstrate union for characters */
  326.  
  327. #include <stdio.h>
  328.  
  329. union c4_i {
  330. char c4[5];
  331. int i ;
  332. } ;
  333.  
  334. union c4_i ex;
  335.  
  336. int main (){
  337. ex.c4[0] = 'a';
  338. ex.c4[1] = 'b';
  339. ex.c4[2] = 'c';
  340. ex.c4[3] = 'd';
  341. ex.c4[4] = '';
  342. printf("%s 0x%08xn", ex.c4, ex.i );
  343. return 0;
  344. }
  345.  
  346. bash $ ./union
  347. abcd 0x64636261
  348. bash $
Add Comment
Please, Sign In to add comment