PageRenderTime 47ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/Docs/src/bin/halibut/error.c

https://bitbucket.org/dgolub/nsis64
C | 225 lines | 211 code | 7 blank | 7 comment | 4 complexity | 5d2a6f3164112c35b4e70975ddedf20a MD5 | raw file
Possible License(s): CPL-1.0
  1. /*
  2. * error.c: Halibut error handling
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <stdarg.h>
  7. #include <string.h>
  8. #include "halibut.h"
  9. /*
  10. * Error flags
  11. */
  12. #define PREFIX 0x0001 /* give `halibut:' prefix */
  13. #define FILEPOS 0x0002 /* give file position prefix */
  14. static void do_error(int code, va_list ap)
  15. {
  16. char error[1024];
  17. char auxbuf[256];
  18. char *sp, *sp2;
  19. wchar_t *wsp;
  20. filepos fpos, fpos2;
  21. int flags=0;
  22. switch (code)
  23. {
  24. case err_nomemory: /* no arguments */
  25. sprintf(error, "out of memory");
  26. flags = PREFIX;
  27. break;
  28. case err_optnoarg:
  29. sp = va_arg(ap, char *);
  30. sprintf(error, "option `-%.200s' requires an argument", sp);
  31. flags = PREFIX;
  32. break;
  33. case err_nosuchopt:
  34. sp = va_arg(ap, char *);
  35. sprintf(error, "unrecognised option `-%.200s'", sp);
  36. flags = PREFIX;
  37. break;
  38. case err_noinput: /* no arguments */
  39. sprintf(error, "no input files");
  40. flags = PREFIX;
  41. break;
  42. case err_cantopen:
  43. sp = va_arg(ap, char *);
  44. sprintf(error, "unable to open input file `%.200s'", sp);
  45. flags = PREFIX;
  46. break;
  47. case err_nodata: /* no arguments */
  48. sprintf(error, "no data in input files");
  49. flags = PREFIX;
  50. break;
  51. case err_brokencodepara:
  52. fpos = *va_arg(ap, filepos *);
  53. sprintf(error, "every line of a code paragraph should begin `\\c'");
  54. flags = FILEPOS;
  55. break;
  56. case err_kwunclosed:
  57. fpos = *va_arg(ap, filepos *);
  58. sprintf(error, "expected `}' after paragraph keyword");
  59. flags = FILEPOS;
  60. break;
  61. case err_kwexpected:
  62. fpos = *va_arg(ap, filepos *);
  63. sprintf(error, "expected a paragraph keyword");
  64. flags = FILEPOS;
  65. break;
  66. case err_kwillegal:
  67. fpos = *va_arg(ap, filepos *);
  68. sprintf(error, "expected no paragraph keyword");
  69. flags = FILEPOS;
  70. break;
  71. case err_kwtoomany:
  72. fpos = *va_arg(ap, filepos *);
  73. sprintf(error, "expected only one paragraph keyword");
  74. flags = FILEPOS;
  75. break;
  76. case err_bodyillegal:
  77. fpos = *va_arg(ap, filepos *);
  78. sprintf(error, "expected no text after paragraph keyword");
  79. flags = FILEPOS;
  80. break;
  81. case err_badparatype:
  82. wsp = va_arg(ap, wchar_t *);
  83. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  84. fpos = *va_arg(ap, filepos *);
  85. sprintf(error, "command `%.200s' unrecognised at start of"
  86. " paragraph", sp);
  87. flags = FILEPOS;
  88. break;
  89. case err_badmidcmd:
  90. wsp = va_arg(ap, wchar_t *);
  91. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  92. fpos = *va_arg(ap, filepos *);
  93. sprintf(error, "command `%.200s' unexpected in mid-paragraph", sp);
  94. flags = FILEPOS;
  95. break;
  96. case err_unexbrace:
  97. fpos = *va_arg(ap, filepos *);
  98. sprintf(error, "brace character unexpected in mid-paragraph");
  99. flags = FILEPOS;
  100. break;
  101. case err_explbr:
  102. fpos = *va_arg(ap, filepos *);
  103. sprintf(error, "expected `{' after command");
  104. flags = FILEPOS;
  105. break;
  106. case err_commenteof:
  107. fpos = *va_arg(ap, filepos *);
  108. sprintf(error, "end of file unexpected inside `\\#{...}' comment");
  109. flags = FILEPOS;
  110. break;
  111. case err_kwexprbr:
  112. fpos = *va_arg(ap, filepos *);
  113. sprintf(error, "expected `}' after cross-reference");
  114. flags = FILEPOS;
  115. break;
  116. case err_missingrbrace:
  117. fpos = *va_arg(ap, filepos *);
  118. sprintf(error, "unclosed braces at end of paragraph");
  119. flags = FILEPOS;
  120. break;
  121. case err_nestedstyles:
  122. fpos = *va_arg(ap, filepos *);
  123. sprintf(error, "unable to nest text styles");
  124. flags = FILEPOS;
  125. break;
  126. case err_nestedindex:
  127. fpos = *va_arg(ap, filepos *);
  128. sprintf(error, "unable to nest index markings");
  129. flags = FILEPOS;
  130. break;
  131. case err_nosuchkw:
  132. fpos = *va_arg(ap, filepos *);
  133. wsp = va_arg(ap, wchar_t *);
  134. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  135. sprintf(error, "unable to resolve cross-reference to `%.200s'", sp);
  136. flags = FILEPOS;
  137. break;
  138. case err_multiBR:
  139. fpos = *va_arg(ap, filepos *);
  140. wsp = va_arg(ap, wchar_t *);
  141. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  142. sprintf(error, "multiple `\\BR' entries given for `%.200s'", sp);
  143. flags = FILEPOS;
  144. break;
  145. case err_nosuchidxtag:
  146. wsp = va_arg(ap, wchar_t *);
  147. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  148. sprintf(error, "`\\IM' on unknown index tag `%.200s'", sp);
  149. flags = 0;
  150. /* FIXME: need to get a filepos to here somehow */
  151. break;
  152. case err_cantopenw:
  153. sp = va_arg(ap, char *);
  154. sprintf(error, "unable to open output file `%.200s'", sp);
  155. flags = PREFIX;
  156. break;
  157. case err_macroexists:
  158. fpos = *va_arg(ap, filepos *);
  159. wsp = va_arg(ap, wchar_t *);
  160. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  161. sprintf(error, "macro `%.200s' already defined", sp);
  162. flags = FILEPOS;
  163. break;
  164. case err_sectjump:
  165. fpos = *va_arg(ap, filepos *);
  166. sprintf(error, "expected higher heading levels before this one");
  167. flags = FILEPOS;
  168. break;
  169. case err_winhelp_ctxclash:
  170. fpos = *va_arg(ap, filepos *);
  171. sp = va_arg(ap, char *);
  172. sp2 = va_arg(ap, char *);
  173. sprintf(error, "Windows Help context id `%.200s' clashes with "
  174. "previously defined `%.200s'", sp, sp2);
  175. flags = FILEPOS;
  176. break;
  177. case err_multikw:
  178. fpos = *va_arg(ap, filepos *);
  179. fpos2 = *va_arg(ap, filepos *);
  180. wsp = va_arg(ap, wchar_t *);
  181. sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
  182. sprintf(error, "paragraph keyword `%.200s' already defined at ", sp);
  183. sprintf(error + strlen(error), "%s:%d", fpos2.filename, fpos2.line);
  184. flags = FILEPOS;
  185. break;
  186. case err_whatever:
  187. sp = va_arg(ap, char *);
  188. vsprintf(error, sp, ap);
  189. flags = PREFIX;
  190. break;
  191. }
  192. if (flags & PREFIX)
  193. fputs("halibut: ", stderr);
  194. if (flags & FILEPOS)
  195. {
  196. fprintf(stderr, "%s:%d:", fpos.filename, fpos.line);
  197. if (fpos.col > 0)
  198. fprintf(stderr, "%d:", fpos.col);
  199. fputc(' ', stderr);
  200. }
  201. fputs(error, stderr);
  202. fputc('\n', stderr);
  203. }
  204. void fatal(int code, ...)
  205. {
  206. va_list ap;
  207. va_start(ap, code);
  208. do_error(code, ap);
  209. va_end(ap);
  210. exit(EXIT_FAILURE);
  211. }
  212. void error(int code, ...)
  213. {
  214. va_list ap;
  215. va_start(ap, code);
  216. do_error(code, ap);
  217. va_end(ap);
  218. }