curses 1.4.6 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/push_gem.yml +6 -4
  3. data/README.md +8 -1
  4. data/curses.gemspec +2 -2
  5. data/ext/curses/curses.c +188 -12
  6. data/ext/curses/extconf.rb +3 -2
  7. data/lib/curses.rb +7 -0
  8. data/sample/attr_demo.rb +4 -2
  9. data/sample/screen.rb +9 -0
  10. data/vendor/PDCurses/.gitignore +47 -0
  11. data/vendor/PDCurses/.travis.yml +49 -0
  12. data/vendor/PDCurses/CMakeLists.txt +68 -0
  13. data/vendor/PDCurses/HISTORY.md +2036 -0
  14. data/vendor/PDCurses/IMPLEMNT.md +327 -0
  15. data/vendor/PDCurses/Makefile +27 -0
  16. data/vendor/PDCurses/README.md +77 -0
  17. data/vendor/PDCurses/acs_defs.h +265 -0
  18. data/vendor/PDCurses/appveyor.yml +218 -0
  19. data/vendor/PDCurses/cmake/README.md +71 -0
  20. data/vendor/PDCurses/cmake/build_dependencies.cmake +178 -0
  21. data/vendor/PDCurses/cmake/build_options.cmake +25 -0
  22. data/vendor/PDCurses/cmake/dll_version.cmake +26 -0
  23. data/vendor/PDCurses/cmake/gen_config_header.cmake +43 -0
  24. data/vendor/PDCurses/cmake/get_version.cmake +17 -0
  25. data/vendor/PDCurses/cmake/make_uninstall.cmake +19 -0
  26. data/vendor/PDCurses/cmake/project_common.cmake +121 -0
  27. data/vendor/PDCurses/cmake/resource.in.cmake +52 -0
  28. data/vendor/PDCurses/cmake/sdl2_ttf/CMakeLists.txt +83 -0
  29. data/vendor/PDCurses/cmake/target_arch.cmake +36 -0
  30. data/vendor/PDCurses/cmake/version.in.cmake +73 -0
  31. data/vendor/PDCurses/cmake/watcom_open_dos16_toolchain.cmake +96 -0
  32. data/vendor/PDCurses/cmake/watcom_open_dos32_toolchain.cmake +106 -0
  33. data/vendor/PDCurses/cmake/watcom_open_os2v2_toolchain.cmake +105 -0
  34. data/vendor/PDCurses/curses.h +1846 -0
  35. data/vendor/PDCurses/curspriv.h +134 -0
  36. data/vendor/PDCurses/demos/README.md +25 -0
  37. data/vendor/PDCurses/demos/firework.c +144 -0
  38. data/vendor/PDCurses/demos/newtest.c +581 -0
  39. data/vendor/PDCurses/demos/ozdemo.c +447 -0
  40. data/vendor/PDCurses/demos/ptest.c +283 -0
  41. data/vendor/PDCurses/demos/rain.c +157 -0
  42. data/vendor/PDCurses/demos/testcurs.c +1607 -0
  43. data/vendor/PDCurses/demos/tui.c +1048 -0
  44. data/vendor/PDCurses/demos/tui.h +65 -0
  45. data/vendor/PDCurses/demos/tuidemo.c +233 -0
  46. data/vendor/PDCurses/demos/version.c +61 -0
  47. data/vendor/PDCurses/demos/worm.c +432 -0
  48. data/vendor/PDCurses/demos/xmas.c +955 -0
  49. data/vendor/PDCurses/dos/CMakeLists.txt +47 -0
  50. data/vendor/PDCurses/dos/Makefile +105 -0
  51. data/vendor/PDCurses/dos/Makefile.bcc +83 -0
  52. data/vendor/PDCurses/dos/Makefile.dmc +257 -0
  53. data/vendor/PDCurses/dos/Makefile.msc +113 -0
  54. data/vendor/PDCurses/dos/Makefile.wcc +107 -0
  55. data/vendor/PDCurses/dos/README.md +51 -0
  56. data/vendor/PDCurses/dos/bccdos.lrf +9 -0
  57. data/vendor/PDCurses/dos/mscdos.lrf +50 -0
  58. data/vendor/PDCurses/dos/pdcclip.c +132 -0
  59. data/vendor/PDCurses/dos/pdcdisp.c +135 -0
  60. data/vendor/PDCurses/dos/pdcdos.h +194 -0
  61. data/vendor/PDCurses/dos/pdcgetsc.c +98 -0
  62. data/vendor/PDCurses/dos/pdckbd.c +513 -0
  63. data/vendor/PDCurses/dos/pdcscrn.c +785 -0
  64. data/vendor/PDCurses/dos/pdcsetsc.c +101 -0
  65. data/vendor/PDCurses/dos/pdcutil.c +212 -0
  66. data/vendor/PDCurses/libobjs.mif +26 -0
  67. data/vendor/PDCurses/makedist.mif +20 -0
  68. data/vendor/PDCurses/man/Makefile +37 -0
  69. data/vendor/PDCurses/man/README.md +21 -0
  70. data/vendor/PDCurses/man/intro.md +361 -0
  71. data/vendor/PDCurses/man/manext.c +119 -0
  72. data/vendor/PDCurses/man/sdl.md +152 -0
  73. data/vendor/PDCurses/man/sdl2.md +58 -0
  74. data/vendor/PDCurses/man/x11.md +407 -0
  75. data/vendor/PDCurses/ncurses/CMakeLists.txt +66 -0
  76. data/vendor/PDCurses/ncurses/README.md +26 -0
  77. data/vendor/PDCurses/ncurses/makefile +29 -0
  78. data/vendor/PDCurses/os2/CMakeLists.txt +41 -0
  79. data/vendor/PDCurses/os2/Makefile +132 -0
  80. data/vendor/PDCurses/os2/Makefile.bcc +90 -0
  81. data/vendor/PDCurses/os2/Makefile.wcc +43 -0
  82. data/vendor/PDCurses/os2/README.md +43 -0
  83. data/vendor/PDCurses/os2/iccos2.lrf +50 -0
  84. data/vendor/PDCurses/os2/iccos2.mak +256 -0
  85. data/vendor/PDCurses/os2/pdcclip.c +188 -0
  86. data/vendor/PDCurses/os2/pdcdisp.c +93 -0
  87. data/vendor/PDCurses/os2/pdcgetsc.c +89 -0
  88. data/vendor/PDCurses/os2/pdckbd.c +521 -0
  89. data/vendor/PDCurses/os2/pdcos2.h +55 -0
  90. data/vendor/PDCurses/os2/pdcscrn.c +449 -0
  91. data/vendor/PDCurses/os2/pdcsetsc.c +112 -0
  92. data/vendor/PDCurses/os2/pdcutil.c +52 -0
  93. data/vendor/PDCurses/panel.h +56 -0
  94. data/vendor/PDCurses/pdcurses/README.md +25 -0
  95. data/vendor/PDCurses/pdcurses/addch.c +693 -0
  96. data/vendor/PDCurses/pdcurses/addchstr.c +245 -0
  97. data/vendor/PDCurses/pdcurses/addstr.c +240 -0
  98. data/vendor/PDCurses/pdcurses/attr.c +359 -0
  99. data/vendor/PDCurses/pdcurses/beep.c +68 -0
  100. data/vendor/PDCurses/pdcurses/bkgd.c +223 -0
  101. data/vendor/PDCurses/pdcurses/border.c +411 -0
  102. data/vendor/PDCurses/pdcurses/clear.c +159 -0
  103. data/vendor/PDCurses/pdcurses/color.c +298 -0
  104. data/vendor/PDCurses/pdcurses/debug.c +109 -0
  105. data/vendor/PDCurses/pdcurses/delch.c +96 -0
  106. data/vendor/PDCurses/pdcurses/deleteln.c +211 -0
  107. data/vendor/PDCurses/pdcurses/deprec.c +27 -0
  108. data/vendor/PDCurses/pdcurses/getch.c +417 -0
  109. data/vendor/PDCurses/pdcurses/getstr.c +474 -0
  110. data/vendor/PDCurses/pdcurses/getyx.c +139 -0
  111. data/vendor/PDCurses/pdcurses/inch.c +127 -0
  112. data/vendor/PDCurses/pdcurses/inchstr.c +214 -0
  113. data/vendor/PDCurses/pdcurses/initscr.c +367 -0
  114. data/vendor/PDCurses/pdcurses/inopts.c +324 -0
  115. data/vendor/PDCurses/pdcurses/insch.c +271 -0
  116. data/vendor/PDCurses/pdcurses/insstr.c +264 -0
  117. data/vendor/PDCurses/pdcurses/instr.c +246 -0
  118. data/vendor/PDCurses/pdcurses/kernel.c +259 -0
  119. data/vendor/PDCurses/pdcurses/keyname.c +157 -0
  120. data/vendor/PDCurses/pdcurses/mouse.c +438 -0
  121. data/vendor/PDCurses/pdcurses/move.c +57 -0
  122. data/vendor/PDCurses/pdcurses/outopts.c +159 -0
  123. data/vendor/PDCurses/pdcurses/overlay.c +214 -0
  124. data/vendor/PDCurses/pdcurses/pad.c +260 -0
  125. data/vendor/PDCurses/pdcurses/panel.c +633 -0
  126. data/vendor/PDCurses/pdcurses/printw.c +126 -0
  127. data/vendor/PDCurses/pdcurses/refresh.c +279 -0
  128. data/vendor/PDCurses/pdcurses/scanw.c +578 -0
  129. data/vendor/PDCurses/pdcurses/scr_dump.c +213 -0
  130. data/vendor/PDCurses/pdcurses/scroll.c +101 -0
  131. data/vendor/PDCurses/pdcurses/slk.c +591 -0
  132. data/vendor/PDCurses/pdcurses/termattr.c +182 -0
  133. data/vendor/PDCurses/pdcurses/terminfo.c +217 -0
  134. data/vendor/PDCurses/pdcurses/touch.c +163 -0
  135. data/vendor/PDCurses/pdcurses/util.c +312 -0
  136. data/vendor/PDCurses/pdcurses/window.c +569 -0
  137. data/vendor/PDCurses/sdl1/Makefile +129 -0
  138. data/vendor/PDCurses/sdl1/Makefile.mng +110 -0
  139. data/vendor/PDCurses/sdl1/README.md +31 -0
  140. data/vendor/PDCurses/sdl1/deffont.h +385 -0
  141. data/vendor/PDCurses/sdl1/deficon.h +23 -0
  142. data/vendor/PDCurses/sdl1/pdcclip.c +131 -0
  143. data/vendor/PDCurses/sdl1/pdcdisp.c +373 -0
  144. data/vendor/PDCurses/sdl1/pdcgetsc.c +30 -0
  145. data/vendor/PDCurses/sdl1/pdckbd.c +405 -0
  146. data/vendor/PDCurses/sdl1/pdcscrn.c +414 -0
  147. data/vendor/PDCurses/sdl1/pdcsdl.h +31 -0
  148. data/vendor/PDCurses/sdl1/pdcsetsc.c +64 -0
  149. data/vendor/PDCurses/sdl1/pdcutil.c +40 -0
  150. data/vendor/PDCurses/sdl1/sdltest.c +79 -0
  151. data/vendor/PDCurses/sdl2/CMakeLists.txt +76 -0
  152. data/vendor/PDCurses/sdl2/Makefile +135 -0
  153. data/vendor/PDCurses/sdl2/Makefile.vc +164 -0
  154. data/vendor/PDCurses/sdl2/README.md +34 -0
  155. data/vendor/PDCurses/sdl2/deffont.h +385 -0
  156. data/vendor/PDCurses/sdl2/deficon.h +23 -0
  157. data/vendor/PDCurses/sdl2/pdcclip.c +93 -0
  158. data/vendor/PDCurses/sdl2/pdcdisp.c +534 -0
  159. data/vendor/PDCurses/sdl2/pdcgetsc.c +30 -0
  160. data/vendor/PDCurses/sdl2/pdckbd.c +480 -0
  161. data/vendor/PDCurses/sdl2/pdcscrn.c +443 -0
  162. data/vendor/PDCurses/sdl2/pdcsdl.h +33 -0
  163. data/vendor/PDCurses/sdl2/pdcsetsc.c +67 -0
  164. data/vendor/PDCurses/sdl2/pdcutil.c +39 -0
  165. data/vendor/PDCurses/sdl2/sdltest.c +81 -0
  166. data/vendor/PDCurses/term.h +48 -0
  167. data/vendor/PDCurses/version.mif +7 -0
  168. data/vendor/PDCurses/vt/CMakeLists.txt +28 -0
  169. data/vendor/PDCurses/vt/Makefile +135 -0
  170. data/vendor/PDCurses/vt/Makefile.bcc +111 -0
  171. data/vendor/PDCurses/vt/Makefile.dmc +258 -0
  172. data/vendor/PDCurses/vt/Makefile.vc +144 -0
  173. data/vendor/PDCurses/vt/Makefile.wcc +107 -0
  174. data/vendor/PDCurses/vt/README.md +64 -0
  175. data/vendor/PDCurses/vt/pdcclip.c +20 -0
  176. data/vendor/PDCurses/vt/pdcdisp.c +284 -0
  177. data/vendor/PDCurses/vt/pdcgetsc.c +27 -0
  178. data/vendor/PDCurses/vt/pdckbd.c +394 -0
  179. data/vendor/PDCurses/vt/pdcscrn.c +434 -0
  180. data/vendor/PDCurses/vt/pdcsetsc.c +45 -0
  181. data/vendor/PDCurses/vt/pdcutil.c +43 -0
  182. data/vendor/PDCurses/vt/pdcvt.h +16 -0
  183. data/vendor/PDCurses/watcom.mif +68 -0
  184. data/vendor/PDCurses/wincon/CMakeLists.txt +27 -0
  185. data/vendor/PDCurses/wincon/Makefile.bcc +88 -0
  186. data/vendor/PDCurses/wincon/Makefile.dmc +256 -0
  187. data/vendor/PDCurses/wincon/Makefile.lcc +273 -0
  188. data/vendor/PDCurses/wincon/Makefile.mng +176 -0
  189. data/vendor/PDCurses/wincon/Makefile.vc +144 -0
  190. data/vendor/PDCurses/wincon/Makefile.wcc +51 -0
  191. data/vendor/PDCurses/wincon/README.md +85 -0
  192. data/vendor/PDCurses/wincon/pdcclip.c +174 -0
  193. data/vendor/PDCurses/wincon/pdcdisp.c +143 -0
  194. data/vendor/PDCurses/wincon/pdcgetsc.c +55 -0
  195. data/vendor/PDCurses/wincon/pdckbd.c +786 -0
  196. data/vendor/PDCurses/wincon/pdcscrn.c +717 -0
  197. data/vendor/PDCurses/wincon/pdcsetsc.c +91 -0
  198. data/vendor/PDCurses/wincon/pdcurses.ico +0 -0
  199. data/vendor/PDCurses/wincon/pdcurses.rc +28 -0
  200. data/vendor/PDCurses/wincon/pdcutil.c +41 -0
  201. data/vendor/PDCurses/wincon/pdcwin.h +31 -0
  202. data/vendor/PDCurses/wingui/CMakeLists.txt +27 -0
  203. data/vendor/PDCurses/wingui/Makefile.bcc +85 -0
  204. data/vendor/PDCurses/wingui/Makefile.dmc +259 -0
  205. data/vendor/PDCurses/wingui/Makefile.lcc +273 -0
  206. data/vendor/PDCurses/wingui/Makefile.mng +171 -0
  207. data/vendor/PDCurses/wingui/Makefile.vc +144 -0
  208. data/vendor/PDCurses/wingui/Makefile.wcc +51 -0
  209. data/vendor/PDCurses/wingui/README.md +93 -0
  210. data/vendor/PDCurses/wingui/pdcclip.c +174 -0
  211. data/vendor/PDCurses/wingui/pdcdisp.c +718 -0
  212. data/vendor/PDCurses/wingui/pdcgetsc.c +30 -0
  213. data/vendor/PDCurses/wingui/pdckbd.c +143 -0
  214. data/vendor/PDCurses/wingui/pdcscrn.c +2797 -0
  215. data/vendor/PDCurses/wingui/pdcsetsc.c +89 -0
  216. data/vendor/PDCurses/wingui/pdcurses.ico +0 -0
  217. data/vendor/PDCurses/wingui/pdcurses.rc +28 -0
  218. data/vendor/PDCurses/wingui/pdcutil.c +61 -0
  219. data/vendor/PDCurses/wingui/pdcwin.h +122 -0
  220. data/vendor/PDCurses/x11/Makefile.in +754 -0
  221. data/vendor/PDCurses/x11/PDCurses.spec +82 -0
  222. data/vendor/PDCurses/x11/README.md +62 -0
  223. data/vendor/PDCurses/x11/ScrollBox.c +319 -0
  224. data/vendor/PDCurses/x11/ScrollBox.h +51 -0
  225. data/vendor/PDCurses/x11/ScrollBoxP.h +70 -0
  226. data/vendor/PDCurses/x11/aclocal.m4 +994 -0
  227. data/vendor/PDCurses/x11/big_icon.xbm +46 -0
  228. data/vendor/PDCurses/x11/compose.h +201 -0
  229. data/vendor/PDCurses/x11/config.guess +1500 -0
  230. data/vendor/PDCurses/x11/config.h.in +100 -0
  231. data/vendor/PDCurses/x11/config.sub +1616 -0
  232. data/vendor/PDCurses/x11/configure +6700 -0
  233. data/vendor/PDCurses/x11/configure.ac +295 -0
  234. data/vendor/PDCurses/x11/debian/changelog +6 -0
  235. data/vendor/PDCurses/x11/debian/compat +1 -0
  236. data/vendor/PDCurses/x11/debian/control +11 -0
  237. data/vendor/PDCurses/x11/debian/copyright +27 -0
  238. data/vendor/PDCurses/x11/debian/rules +98 -0
  239. data/vendor/PDCurses/x11/install-sh +253 -0
  240. data/vendor/PDCurses/x11/little_icon.xbm +14 -0
  241. data/vendor/PDCurses/x11/ncurses_cfg.h +45 -0
  242. data/vendor/PDCurses/x11/pdcclip.c +173 -0
  243. data/vendor/PDCurses/x11/pdcdisp.c +85 -0
  244. data/vendor/PDCurses/x11/pdcgetsc.c +28 -0
  245. data/vendor/PDCurses/x11/pdckbd.c +104 -0
  246. data/vendor/PDCurses/x11/pdcscrn.c +258 -0
  247. data/vendor/PDCurses/x11/pdcsetsc.c +95 -0
  248. data/vendor/PDCurses/x11/pdcutil.c +52 -0
  249. data/vendor/PDCurses/x11/pdcx11.c +316 -0
  250. data/vendor/PDCurses/x11/pdcx11.h +191 -0
  251. data/vendor/PDCurses/x11/sb.c +155 -0
  252. data/vendor/PDCurses/x11/x11.c +3686 -0
  253. data/vendor/PDCurses/x11/xcurses-config.in +81 -0
  254. metadata +249 -8
@@ -0,0 +1,578 @@
1
+ /* Public Domain Curses */
2
+
3
+ #include <curspriv.h>
4
+
5
+ /*man-start**************************************************************
6
+
7
+ scanw
8
+ -----
9
+
10
+ ### Synopsis
11
+
12
+ int scanw(const char *fmt, ...);
13
+ int wscanw(WINDOW *win, const char *fmt, ...);
14
+ int mvscanw(int y, int x, const char *fmt, ...);
15
+ int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...);
16
+ int vwscanw(WINDOW *win, const char *fmt, va_list varglist);
17
+ int vw_scanw(WINDOW *win, const char *fmt, va_list varglist);
18
+
19
+ ### Description
20
+
21
+ These routines correspond to the standard C library's scanf()
22
+ family. Each gets a string from the window via wgetnstr(), and
23
+ uses the resulting line as input for the scan.
24
+
25
+ ### Return Value
26
+
27
+ On successful completion, these functions return the number of
28
+ items successfully matched. Otherwise they return ERR.
29
+
30
+ ### Portability
31
+ X/Open BSD SYS V
32
+ scanw Y Y Y
33
+ wscanw Y Y Y
34
+ mvscanw Y Y Y
35
+ mvwscanw Y Y Y
36
+ vwscanw Y - 4.0
37
+ vw_scanw Y
38
+
39
+ **man-end****************************************************************/
40
+
41
+ #include <string.h>
42
+
43
+ #ifndef HAVE_VSSCANF
44
+ # include <stdlib.h>
45
+ # include <ctype.h>
46
+ # include <limits.h>
47
+
48
+ static int _pdc_vsscanf(const char *, const char *, va_list);
49
+
50
+ # define vsscanf _pdc_vsscanf
51
+ #endif
52
+
53
+ int vwscanw(WINDOW *win, const char *fmt, va_list varglist)
54
+ {
55
+ char scanbuf[256];
56
+
57
+ PDC_LOG(("vwscanw() - called\n"));
58
+
59
+ if (wgetnstr(win, scanbuf, 255) == ERR)
60
+ return ERR;
61
+
62
+ return vsscanf(scanbuf, fmt, varglist);
63
+ }
64
+
65
+ int scanw(const char *fmt, ...)
66
+ {
67
+ va_list args;
68
+ int retval;
69
+
70
+ PDC_LOG(("scanw() - called\n"));
71
+
72
+ va_start(args, fmt);
73
+ retval = vwscanw(stdscr, fmt, args);
74
+ va_end(args);
75
+
76
+ return retval;
77
+ }
78
+
79
+ int wscanw(WINDOW *win, const char *fmt, ...)
80
+ {
81
+ va_list args;
82
+ int retval;
83
+
84
+ PDC_LOG(("wscanw() - called\n"));
85
+
86
+ va_start(args, fmt);
87
+ retval = vwscanw(win, fmt, args);
88
+ va_end(args);
89
+
90
+ return retval;
91
+ }
92
+
93
+ int mvscanw(int y, int x, const char *fmt, ...)
94
+ {
95
+ va_list args;
96
+ int retval;
97
+
98
+ PDC_LOG(("mvscanw() - called\n"));
99
+
100
+ if (move(y, x) == ERR)
101
+ return ERR;
102
+
103
+ va_start(args, fmt);
104
+ retval = vwscanw(stdscr, fmt, args);
105
+ va_end(args);
106
+
107
+ return retval;
108
+ }
109
+
110
+ int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...)
111
+ {
112
+ va_list args;
113
+ int retval;
114
+
115
+ PDC_LOG(("mvscanw() - called\n"));
116
+
117
+ if (wmove(win, y, x) == ERR)
118
+ return ERR;
119
+
120
+ va_start(args, fmt);
121
+ retval = vwscanw(win, fmt, args);
122
+ va_end(args);
123
+
124
+ return retval;
125
+ }
126
+
127
+ int vw_scanw(WINDOW *win, const char *fmt, va_list varglist)
128
+ {
129
+ PDC_LOG(("vw_scanw() - called\n"));
130
+
131
+ return vwscanw(win, fmt, varglist);
132
+ }
133
+
134
+ #ifndef HAVE_VSSCANF
135
+
136
+ /* _pdc_vsscanf() - Internal routine to parse and format an input
137
+ buffer. It scans a series of input fields; each field is formatted
138
+ according to a supplied format string and the formatted input is
139
+ stored in the variable number of addresses passed. Returns the number
140
+ of input fields or EOF on error.
141
+
142
+ Don't compile this unless required. Some compilers (at least Borland
143
+ C++ 3.0) have to link with math libraries due to the use of floats.
144
+
145
+ Based on vsscanf.c and input.c from emx 0.8f library source,
146
+ Copyright (c) 1990-1992 by Eberhard Mattes, who has kindly agreed to
147
+ its inclusion in PDCurses. */
148
+
149
+ #define WHITE(x) ((x) == ' ' || (x) == '\t' || (x) == '\n')
150
+
151
+ #define NEXT(x) \
152
+ do { \
153
+ x = *buf++; \
154
+ if (!x) \
155
+ return (count ? count : EOF); \
156
+ ++chars; \
157
+ } while (0)
158
+
159
+ #define UNGETC() \
160
+ do { \
161
+ --buf; --chars; \
162
+ } while (0)
163
+
164
+ static int _pdc_vsscanf(const char *buf, const char *fmt, va_list arg_ptr)
165
+ {
166
+ int count, chars, c, width, radix, d, i;
167
+ int *int_ptr;
168
+ long *long_ptr;
169
+ short *short_ptr;
170
+ char *char_ptr;
171
+ unsigned char f;
172
+ char neg, assign, ok, size;
173
+ long n;
174
+ char map[256], end;
175
+ double dx, dd, *dbl_ptr;
176
+ float *flt_ptr;
177
+ int exp;
178
+ char eneg;
179
+
180
+ count = 0;
181
+ chars = 0;
182
+ c = 0;
183
+ while ((f = *fmt) != 0)
184
+ {
185
+ if (WHITE(f))
186
+ {
187
+ do
188
+ {
189
+ ++fmt;
190
+ f = *fmt;
191
+ }
192
+ while (WHITE(f));
193
+ do
194
+ {
195
+ c = *buf++;
196
+ if (!c)
197
+ {
198
+ if (!f || count)
199
+ return count;
200
+ else
201
+ return EOF;
202
+ } else
203
+ ++chars;
204
+ }
205
+ while (WHITE(c));
206
+ UNGETC();
207
+ } else if (f != '%')
208
+ {
209
+ NEXT(c);
210
+ if (c != f)
211
+ return count;
212
+ ++fmt;
213
+ } else
214
+ {
215
+ assign = TRUE;
216
+ width = INT_MAX;
217
+ char_ptr = NULL;
218
+ ++fmt;
219
+ if (*fmt == '*')
220
+ {
221
+ assign = FALSE;
222
+ ++fmt;
223
+ }
224
+ if (isdigit(*fmt))
225
+ {
226
+ width = 0;
227
+ while (isdigit(*fmt))
228
+ width = width * 10 + (*fmt++ - '0');
229
+ if (!width)
230
+ width = INT_MAX;
231
+ }
232
+ size = 0;
233
+ if (*fmt == 'h' || *fmt == 'l')
234
+ size = *fmt++;
235
+ f = *fmt;
236
+ switch (f)
237
+ {
238
+ case 'c':
239
+ if (width == INT_MAX)
240
+ width = 1;
241
+ if (assign)
242
+ char_ptr = va_arg(arg_ptr, char *);
243
+ while (width > 0)
244
+ {
245
+ --width;
246
+ NEXT(c);
247
+ if (assign)
248
+ {
249
+ *char_ptr++ = (char) c;
250
+ ++count;
251
+ }
252
+ }
253
+ break;
254
+ case '[':
255
+ memset(map, 0, 256);
256
+ end = 0;
257
+ ++fmt;
258
+ if (*fmt == '^')
259
+ {
260
+ ++fmt;
261
+ end = 1;
262
+ }
263
+ i = 0;
264
+ for (;;)
265
+ {
266
+ f = (unsigned char) *fmt;
267
+ switch (f)
268
+ {
269
+ case 0:
270
+ /* avoid skipping past 0 */
271
+ --fmt;
272
+ NEXT(c);
273
+ goto string;
274
+ case ']':
275
+ if (i > 0)
276
+ {
277
+ NEXT(c);
278
+ goto string;
279
+ }
280
+ /* no break */
281
+ default:
282
+ if (fmt[1] == '-' && fmt[2]
283
+ && f < (unsigned char)fmt[2])
284
+ {
285
+ memset(map + f, 1, (unsigned char)fmt[2] - f);
286
+ fmt += 2;
287
+ }
288
+ else
289
+ map[f] = 1;
290
+ break;
291
+ }
292
+ ++fmt;
293
+ ++i;
294
+ }
295
+ case 's':
296
+ memset(map, 0, 256);
297
+ map[' '] = 1;
298
+ map['\n'] = 1;
299
+ map['\r'] = 1;
300
+ map['\t'] = 1;
301
+ end = 1;
302
+ do
303
+ {
304
+ NEXT(c);
305
+ }
306
+ while (WHITE(c));
307
+ string:
308
+ if (assign)
309
+ char_ptr = va_arg(arg_ptr, char *);
310
+ while (width > 0 && map[(unsigned char) c] != end)
311
+ {
312
+ --width;
313
+ if (assign)
314
+ *char_ptr++ = (char) c;
315
+ c = *buf++;
316
+ if (!c)
317
+ break;
318
+ else
319
+ ++chars;
320
+ }
321
+ if (assign)
322
+ {
323
+ *char_ptr = 0;
324
+ ++count;
325
+ }
326
+ if (!c)
327
+ return count;
328
+ else
329
+ UNGETC();
330
+ break;
331
+ case 'f':
332
+ case 'e':
333
+ case 'E':
334
+ case 'g':
335
+ case 'G':
336
+ neg = ok = FALSE;
337
+ dx = 0.0;
338
+ do
339
+ {
340
+ NEXT(c);
341
+ }
342
+ while (WHITE(c));
343
+ if (c == '+')
344
+ {
345
+ NEXT(c);
346
+ --width;
347
+ } else if (c == '-')
348
+ {
349
+ neg = TRUE;
350
+ NEXT(c);
351
+ --width;
352
+ }
353
+ while (width > 0 && isdigit(c))
354
+ {
355
+ --width;
356
+ dx = dx * 10.0 + (double) (c - '0');
357
+ ok = TRUE;
358
+ c = *buf++;
359
+ if (!c)
360
+ break;
361
+ else
362
+ ++chars;
363
+ }
364
+ if (width > 0 && c == '.')
365
+ {
366
+ --width;
367
+ dd = 10.0;
368
+ NEXT(c);
369
+ while (width > 0 && isdigit(c))
370
+ {
371
+ --width;
372
+ dx += (double) (c - '0') / dd;
373
+ dd *= 10.0;
374
+ ok = TRUE;
375
+ c = *buf++;
376
+ if (!c)
377
+ break;
378
+ else
379
+ ++chars;
380
+ }
381
+ }
382
+ if (!ok)
383
+ return count;
384
+ if (width > 0 && (c == 'e' || c == 'E'))
385
+ {
386
+ eneg = FALSE;
387
+ exp = 0;
388
+ NEXT(c);
389
+ --width;
390
+ if (width > 0 && c == '+')
391
+ {
392
+ NEXT(c);
393
+ --width;
394
+ } else if (width > 0 && c == '-')
395
+ {
396
+ eneg = TRUE;
397
+ NEXT(c);
398
+ --width;
399
+ }
400
+ if (!(width > 0 && isdigit(c)))
401
+ {
402
+ UNGETC();
403
+ return count;
404
+ }
405
+ while (width > 0 && isdigit(c))
406
+ {
407
+ --width;
408
+ exp = exp * 10 + (c - '0');
409
+ c = *buf++;
410
+ if (!c)
411
+ break;
412
+ else
413
+ ++chars;
414
+ }
415
+ if (eneg)
416
+ exp = -exp;
417
+ while (exp > 0)
418
+ {
419
+ dx *= 10.0;
420
+ --exp;
421
+ }
422
+ while (exp < 0)
423
+ {
424
+ dx /= 10.0;
425
+ ++exp;
426
+ }
427
+ }
428
+ if (assign)
429
+ {
430
+ if (neg)
431
+ dx = -dx;
432
+ if (size == 'l')
433
+ {
434
+ dbl_ptr = va_arg(arg_ptr, double *);
435
+ *dbl_ptr = dx;
436
+ }
437
+ else
438
+ {
439
+ flt_ptr = va_arg(arg_ptr, float *);
440
+ *flt_ptr = (float)dx;
441
+ }
442
+ ++count;
443
+ }
444
+ if (!c)
445
+ return count;
446
+ else
447
+ UNGETC();
448
+ break;
449
+ case 'i':
450
+ neg = FALSE;
451
+ radix = 10;
452
+ do
453
+ {
454
+ NEXT(c);
455
+ }
456
+ while (WHITE(c));
457
+ if (!(width > 0 && c == '0'))
458
+ goto scan_complete_number;
459
+ NEXT(c);
460
+ --width;
461
+ if (width > 0 && (c == 'x' || c == 'X'))
462
+ {
463
+ NEXT(c);
464
+ radix = 16;
465
+ --width;
466
+ }
467
+ else if (width > 0 && (c >= '0' && c <= '7'))
468
+ radix = 8;
469
+ goto scan_unsigned_number;
470
+ case 'd':
471
+ case 'u':
472
+ case 'o':
473
+ case 'x':
474
+ case 'X':
475
+ do
476
+ {
477
+ NEXT(c);
478
+ }
479
+ while (WHITE(c));
480
+ switch (f)
481
+ {
482
+ case 'o':
483
+ radix = 8;
484
+ break;
485
+ case 'x':
486
+ case 'X':
487
+ radix = 16;
488
+ break;
489
+ default:
490
+ radix = 10;
491
+ break;
492
+ }
493
+ scan_complete_number:
494
+ neg = FALSE;
495
+ if (width > 0 && c == '+')
496
+ {
497
+ NEXT(c);
498
+ --width;
499
+ }
500
+ else if (width > 0 && c == '-' && radix == 10)
501
+ {
502
+ neg = TRUE;
503
+ NEXT(c);
504
+ --width;
505
+ }
506
+ scan_unsigned_number:
507
+ n = 0;
508
+ ok = FALSE;
509
+ while (width > 0)
510
+ {
511
+ --width;
512
+ if (isdigit(c))
513
+ d = c - '0';
514
+ else if (isupper(c))
515
+ d = c - 'A' + 10;
516
+ else if (islower(c))
517
+ d = c - 'a' + 10;
518
+ else
519
+ break;
520
+ if (d < 0 || d >= radix)
521
+ break;
522
+ ok = TRUE;
523
+ n = n * radix + d;
524
+ c = *buf++;
525
+ if (!c)
526
+ break;
527
+ else
528
+ ++chars;
529
+ }
530
+ if (!ok)
531
+ return count;
532
+ if (assign)
533
+ {
534
+ if (neg)
535
+ n = -n;
536
+ switch (size)
537
+ {
538
+ case 'h':
539
+ short_ptr = va_arg(arg_ptr, short *);
540
+ *short_ptr = (short) n;
541
+ break;
542
+ case 'l':
543
+ long_ptr = va_arg(arg_ptr, long *);
544
+ *long_ptr = (long) n;
545
+ break;
546
+ default:
547
+ int_ptr = va_arg(arg_ptr, int *);
548
+ *int_ptr = (int) n;
549
+ }
550
+ ++count;
551
+ }
552
+ if (!c)
553
+ return count;
554
+ else
555
+ UNGETC();
556
+ break;
557
+ case 'n':
558
+ if (assign)
559
+ {
560
+ int_ptr = va_arg(arg_ptr, int *);
561
+ *int_ptr = chars;
562
+ ++count;
563
+ }
564
+ break;
565
+ default:
566
+ if (!f) /* % at end of string */
567
+ return count;
568
+ NEXT(c);
569
+ if (c != f)
570
+ return count;
571
+ break;
572
+ }
573
+ ++fmt;
574
+ }
575
+ }
576
+ return count;
577
+ }
578
+ #endif /* HAVE_VSSCANF */