Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

511 lines
10 KiB

  1. /*** zaux.c - helper routines for Z
  2. *
  3. * Modifications
  4. *
  5. * 26-Nov-1991 mz Strip off near/far
  6. *
  7. *************************************************************************/
  8. #define INCL_SUB
  9. #define INCL_DOSERRORS
  10. #define INCL_DOSMISC
  11. #include "mep.h"
  12. #include <stdarg.h>
  13. #include <errno.h>
  14. /*** ParseCmd - Parse "command" line into two pieces
  15. *
  16. * Given a text string, returns a pointer to the first word (non-whitespace)
  17. * in the text, which is null terminated by this routine, and a pointer to
  18. * the second word.
  19. *
  20. * Input:
  21. * pText = Pointer to text string
  22. * ppCmd = Pointer to place to put pointer to first word
  23. * ppArg = Pointer to place to put pointer to second word
  24. *
  25. * Output:
  26. * Returns nothing. Pointers update, and string possible modified to include
  27. * null terminator after first word.
  28. *
  29. *************************************************************************/
  30. void
  31. ParseCmd (
  32. char *pText,
  33. char **ppCmd,
  34. char **ppArg
  35. )
  36. {
  37. REGISTER char *pCmd; /* working pointer */
  38. REGISTER char *pArg; /* working pointer */
  39. pArg = whitescan (pCmd = whiteskip (pText));
  40. if (*pArg) {
  41. *pArg++ = '\0';
  42. pArg = whiteskip (pArg);
  43. }
  44. *ppCmd = pCmd;
  45. *ppArg = pArg;
  46. }
  47. char *
  48. whiteskip (
  49. const char *p
  50. )
  51. {
  52. return strbskip ((char *)p, (char *)rgchWSpace);
  53. }
  54. char *
  55. whitescan (
  56. const char *p
  57. )
  58. {
  59. return strbscan ((char *)p, (char *)rgchWSpace);
  60. }
  61. /*** RemoveTrailSpace - remove trailing white space characters from line
  62. *
  63. * Input:
  64. * p = pointer to line to be stripped.
  65. *
  66. * Output:
  67. * Returns new length of line.
  68. *
  69. *************************************************************************/
  70. int
  71. RemoveTrailSpace (
  72. REGISTER char *p
  73. )
  74. {
  75. REGISTER int len = strlen (p);
  76. while (len && strchr(rgchWSpace,p[len-1])) {
  77. len--;
  78. }
  79. p[len] = 0;
  80. return len;
  81. }
  82. /*** DoubleSlashes - given a character string, double all backslashes
  83. *
  84. * Input:
  85. * pbuf = pointer to character buffer
  86. *
  87. * Output:
  88. * Returns pbuf
  89. *
  90. *************************************************************************/
  91. char *
  92. DoubleSlashes (
  93. char * pbuf
  94. )
  95. {
  96. REGISTER int l;
  97. REGISTER char *p;
  98. p = pbuf;
  99. l = strlen (p);
  100. while (l) {
  101. if (*p == '\\') {
  102. memmove ((char *) (p+1),(char *) p, l+1);
  103. *p++ = '\\';
  104. }
  105. p++;
  106. l--;
  107. }
  108. return pbuf;
  109. }
  110. /*** UnDoubleSlashes - given a character string, un-double all backslashes
  111. *
  112. * Input:
  113. * pbuf = pointer to character buffer
  114. *
  115. * Output:
  116. * Returns pbuf
  117. *
  118. *************************************************************************/
  119. char *
  120. UnDoubleSlashes (
  121. char * pbuf
  122. )
  123. {
  124. REGISTER char *p1;
  125. REGISTER char *p2;
  126. p1 = p2 = pbuf;
  127. while (*p1) {
  128. if ((*p2++ = *p1++) == '\\') {
  129. if (*p1 == '\\') {
  130. p1++;
  131. }
  132. }
  133. }
  134. return pbuf;
  135. }
  136. /*** fIsNum - see if a string is entirely digits
  137. *
  138. * Input:
  139. * p = pointer to string
  140. *
  141. * Output:
  142. * Returns TRUE if valid number.
  143. *
  144. *************************************************************************/
  145. flagType
  146. fIsNum (
  147. char *p
  148. )
  149. {
  150. if (*p == '-') {
  151. p++;
  152. }
  153. return (flagType)(*strbskip (p, "0123456789") == 0);
  154. }
  155. /*** OS2toErrTxt - Get Error Text for OS/2 error
  156. *
  157. * Get the error message text for an OS/2 returned error.
  158. *
  159. * Input:
  160. * erc = OS/2 error number
  161. * buf = location to place the error (BUFSIZE)
  162. *
  163. * Output:
  164. * Returns buf
  165. *
  166. *************************************************************************/
  167. char *
  168. OS2toErrText (
  169. int erc,
  170. char * buf
  171. )
  172. {
  173. sprintf(buf, "Windows error No. %lu", GetLastError());
  174. return buf;
  175. erc;
  176. }
  177. /*** OS2toErrno - Convert OS/2 error code to C runtime error
  178. *
  179. * Purpose:
  180. * Maps errors returned by some OS/2 calls to equivalent C runtime errors,
  181. * such that routines which differ in OS/2 implementation can return equivalent
  182. * errors as their DOS counterparts.
  183. *
  184. * Input:
  185. * code = OS/2 returned error code
  186. *
  187. * Output:
  188. * returns a C runtime error constant
  189. *
  190. * Exceptions:
  191. * none
  192. *
  193. * Notes:
  194. * CONSIDER: It's been suggested that this routine, and error message
  195. * CONSIDER: presentation under OS/2 be changed to use DosGetMessage.
  196. *
  197. *************************************************************************/
  198. int
  199. OS2toErrno (
  200. int code
  201. )
  202. {
  203. buffer L_buf;
  204. printerror (OS2toErrText (code,L_buf));
  205. return code;
  206. }
  207. union argPrintfType {
  208. long *pLong;
  209. int *pInt;
  210. char **pStr;
  211. char **fpStr;
  212. };
  213. /*** ZFormat - replace the C runtime formatting routines.
  214. *
  215. * Purpose:
  216. *
  217. * ZFormat is a near-replacement for the *printf routines in the C runtime.
  218. *
  219. * Input:
  220. * pStr - destination string where formatted result is placed.
  221. * fmt - formatting string. Formats currently understood are:
  222. * %c single character
  223. * %[n][l]d %[n][l]x
  224. * %[m.n]s
  225. * %[m.n]|{dpfe}F - print drive, path, file, extension
  226. * of current file.
  227. * * may be used to copy in values for m and n from arg
  228. * list.
  229. * %%
  230. * arg - is a list of arguments
  231. *
  232. * Output:
  233. *
  234. * Returns 0 on success, MSGERR_* on failure. The MSGERR_* value may
  235. * be passed to disperr, as in:
  236. *
  237. * if (err = ZFormat (pszUser))
  238. * disperr (err, pszUser).
  239. *
  240. * Note that the error message wants to display the offending string.
  241. *
  242. * Currently, the only return value is:
  243. *
  244. * MSGERR_ZFORMAT 8020 Unrecognized %% command in '%s'
  245. *
  246. *************************************************************************/
  247. int
  248. ZFormat (
  249. REGISTER char *pStr,
  250. const REGISTER char *fmt,
  251. va_list vl
  252. )
  253. {
  254. char c;
  255. char * pchar;
  256. int * pint;
  257. *pStr = 0;
  258. while (c = *fmt++) {
  259. if (c != '%') {
  260. *pStr++ = c;
  261. } else {
  262. flagType fFar = FALSE;
  263. flagType fLong = FALSE;
  264. flagType fW = FALSE;
  265. flagType fP = FALSE;
  266. flagType fdF = FALSE;
  267. flagType fpF = FALSE;
  268. flagType ffF = FALSE;
  269. flagType feF = FALSE;
  270. char fill = ' ';
  271. int base = 10;
  272. int w = 0;
  273. int p = 0;
  274. int s = 1;
  275. int l;
  276. c = *fmt;
  277. if (c == '-') {
  278. s = -1;
  279. c = *++fmt;
  280. }
  281. if (isdigit (c) || c == '.' || c == '*') {
  282. /* parse off w.p
  283. */
  284. fW = TRUE;
  285. if (c == '*') {
  286. pint = va_arg (vl, int *);
  287. w = *pint;
  288. fmt++;
  289. } else {
  290. if (c == '0') {
  291. fill = '0';
  292. }
  293. w = s * atoi (fmt);
  294. fmt = strbskip (fmt, "0123456789");
  295. }
  296. if (*fmt == '.') {
  297. fP = TRUE;
  298. if (fmt[1] == '*') {
  299. p = va_arg (vl, int);
  300. fmt += 2;
  301. } else {
  302. p = atoi (fmt+1);
  303. fmt = strbskip (fmt+1, "0123456789");
  304. }
  305. }
  306. }
  307. if (*fmt == 'l') {
  308. fLong = TRUE;
  309. fmt++;
  310. }
  311. if (*fmt == 'F') {
  312. fFar = TRUE;
  313. fmt++;
  314. }
  315. if (*fmt == '|') {
  316. while (*fmt != 'F') {
  317. switch (*++fmt) {
  318. case 'd': fdF = TRUE; break;
  319. case 'p': fpF = TRUE; break;
  320. case 'f': ffF = TRUE; break;
  321. case 'e': feF = TRUE; break;
  322. case 'F': if (fmt[-1] == '|') {
  323. fdF = TRUE;
  324. fpF = TRUE;
  325. ffF = TRUE;
  326. feF = TRUE;
  327. }
  328. break;
  329. default :
  330. // va_end(vl);
  331. return MSGERR_ZFORMAT;
  332. }
  333. }
  334. }
  335. switch (*fmt++) {
  336. case 'c':
  337. p = va_arg (vl, int);
  338. *pStr++ = (char)p;
  339. *pStr = 0;
  340. break;
  341. case 'x':
  342. base = 16;
  343. case 'd':
  344. if (fLong) {
  345. _ltoa ( va_arg (vl, long), pStr, base);
  346. } else {
  347. _ltoa ( (long)va_arg (vl, int), pStr, base);
  348. }
  349. break;
  350. case 's':
  351. pchar = va_arg (vl, char *);
  352. if (fFar) {
  353. if (!fP) {
  354. p = strlen ( pchar );
  355. }
  356. memmove ((char *) pStr, pchar , p);
  357. } else {
  358. if (!fP) {
  359. p = strlen ( pchar );
  360. }
  361. memmove ((char *) pStr, pchar , p);
  362. }
  363. fill = ' ';
  364. pStr[p] = 0;
  365. break;
  366. case 'F':
  367. pStr[0] = 0;
  368. if (fdF) {
  369. drive (pFileHead->pName, pStr);
  370. }
  371. if (fpF) {
  372. path (pFileHead->pName, strend(pStr));
  373. }
  374. if (ffF) {
  375. filename (pFileHead->pName, strend(pStr));
  376. }
  377. if (feF) {
  378. extention (pFileHead->pName, strend(pStr));
  379. }
  380. break;
  381. case '%':
  382. *pStr++ = '%';
  383. *pStr = 0;
  384. break;
  385. default:
  386. // va_end(vl);
  387. return MSGERR_ZFORMAT;
  388. }
  389. /* text is immediately at pStr. Check width to justification
  390. */
  391. l = strlen (pStr);
  392. if (w < 0) {
  393. /* left-justify
  394. */
  395. w = -w;
  396. if (l < w) {
  397. memset ((char *) &pStr[l], fill, w - l);
  398. pStr[w] = 0;
  399. }
  400. } else if (l < w) {
  401. /* right-justify
  402. */
  403. memmove ((char *) &pStr[w-l], (char *) &pStr[0], l);
  404. memset ((char *) &pStr[0], fill, w - l);
  405. pStr[w] = 0;
  406. }
  407. pStr += strlen (pStr);
  408. }
  409. }
  410. *pStr = 0;
  411. // va_end(vl);
  412. return 0;
  413. }
  414. /* FmtAssign - formatted assign
  415. *
  416. * FmtAssign is used to both format and perform an assignment
  417. *
  418. * pFmt character pointer to sprintf-style formatting
  419. * arg set of unformatted arguments
  420. *
  421. * returns result of DoAssign upon formatted result
  422. */
  423. flagType
  424. __cdecl
  425. FmtAssign (
  426. char *pFmt,
  427. ...
  428. )
  429. {
  430. char L_buf[ 512 ];
  431. va_list L_pArgs;
  432. va_start (L_pArgs, pFmt);
  433. ZFormat (L_buf, pFmt, L_pArgs);
  434. va_end (L_pArgs);
  435. return DoAssign (L_buf);
  436. }