LIB.TXT
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:979k
源码类别:

操作系统开发

开发平台:

C/C++

  1. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. src/lib/ansi/ext_fmt.h    
  3. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. 00000 struct mantissa {
  5. 00001         unsigned long h_32;
  6. 00002         unsigned long l_32;
  7. 00003 };
  8. 00004
  9. 00005 struct EXTEND {
  10. 00006         short   sign;
  11. 00007         short   exp;
  12. 00008         struct mantissa mantissa;
  13. 00009 #define m1 mantissa.h_32
  14. 00010 #define m2 mantissa.l_32
  15. 00011 };
  16. 00012         
  17. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  18. src/lib/ansi/loc_time.h    
  19. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  20. 00100 /*
  21. 00101  * loc_time.h - some local definitions
  22. 00102  */
  23. 00103 /* $Header: loc_time.h,v 1.1 91/04/22 13:19:51 ceriel Exp $ */
  24. 00104
  25. 00105 #define YEAR0           1900                    /* the first year */
  26. 00106 #define EPOCH_YR        1970            /* EPOCH = Jan 1 1970 00:00:00 */
  27. 00107 #define SECS_DAY        (24L * 60L * 60L)
  28. 00108 #define LEAPYEAR(year)  (!((year) % 4) && (((year) % 100) || !((year) % 400)))
  29. 00109 #define YEARSIZE(year)  (LEAPYEAR(year) ? 366 : 365)
  30. 00110 #define FIRSTSUNDAY(timp)       (((timp)->tm_yday - (timp)->tm_wday + 420) % 7)
  31. 00111 #define FIRSTDAYOF(timp)        (((timp)->tm_wday - (timp)->tm_yday + 420) % 7)
  32. 00112 #define TIME_MAX        ULONG_MAX
  33. 00113 #define ABB_LEN         3
  34. 00114
  35. 00115 extern const int _ytab[2][12];
  36. 00116 extern const char *_days[];
  37. 00117 extern const char *_months[];
  38. 00118
  39. 00119 void _tzset(void);
  40. 00120 unsigned _dstget(struct tm *timep);
  41. 00121
  42. 00122 extern long _timezone;
  43. 00123 extern long _dst_off;
  44. 00124 extern int _daylight;
  45. 00125 extern char *_tzname[2];
  46. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  47. src/lib/ansi/abort.c    
  48. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  49. 00200 /*
  50. 00201  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  51. 00202  * See the copyright notice in the ACK home directory, in the file "Copyright".
  52. 00203  */
  53. 00204 /* $Header: abort.c,v 1.3 90/11/22 13:59:37 eck Exp $ */
  54. 00205
  55. 00206 #if     defined(_POSIX_SOURCE)
  56. 00207 #include        <sys/types.h>
  57. 00208 #endif
  58. 00209 #include        <signal.h>
  59. 00210 #include        <stdlib.h>
  60. 00211
  61. 00212 extern void (*_clean)(void);
  62. 00213
  63. 00214 void
  64. 00215 abort(void)
  65. 00216 {
  66. 00217         if (_clean) _clean();           /* flush all output files */
  67. 00218         raise(SIGABRT);
  68. 00219 }
  69. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  70. src/lib/ansi/abs.c    
  71. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  72. 00300 /*
  73. 00301  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  74. 00302  * See the copyright notice in the ACK home directory, in the file "Copyright".
  75. 00303  */
  76. 00304 /* $Header: abs.c,v 1.1 89/05/16 13:06:59 eck Exp $ */
  77. 00305
  78. 00306 #include        <stdlib.h>
  79. 00307
  80. 00308 int
  81. 00309 abs(register int i)
  82. 00310 {
  83. 00311         return i >= 0 ? i : -i;
  84. 00312 }
  85. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  86. src/lib/ansi/asctime.c    
  87. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  88. 00400 /*
  89. 00401  * asctime - print a date
  90. 00402  */
  91. 00403 /* $Header: asctime.c,v 1.3 91/04/22 13:20:15 ceriel Exp $ */
  92. 00404
  93. 00405 #include        <string.h>
  94. 00406 #include        <time.h>
  95. 00407 #include        "loc_time.h"
  96. 00408
  97. 00409 #define DATE_STR        "??? ??? ?? ??:??:?? ????n"
  98. 00410
  99. 00411 static char *
  100. 00412 two_digits(register char *pb, int i, int nospace)
  101. 00413 {
  102. 00414         *pb = (i / 10) % 10 + '0';
  103. 00415         if (!nospace && *pb == '0') *pb = ' ';
  104. 00416         pb++;
  105. 00417         *pb++ = (i % 10) + '0';
  106. 00418         return ++pb;
  107. 00419 }
  108. 00421 static char *
  109. 00422 four_digits(register char *pb, int i)
  110. 00423 {
  111. 00424         i %= 10000;
  112. 00425         *pb++ = (i / 1000) + '0';
  113. 00426         i %= 1000;
  114. 00427         *pb++ = (i / 100) + '0';
  115. 00428         i %= 100;
  116. 00429         *pb++ = (i / 10) + '0';
  117. 00430         *pb++ = (i % 10) + '0';
  118. 00431         return ++pb;
  119. 00432 }
  120. 00434 char *asctime(const struct tm *timeptr)
  121. 00435 {
  122. 00436         static char buf[26];
  123. 00437         register char *pb = buf;
  124. 00438         register const char *ps;
  125. 00439         register int n;
  126. 00440
  127. 00441         strcpy(pb, DATE_STR);
  128. 00442         ps = _days[timeptr->tm_wday];
  129. 00443         n = ABB_LEN;
  130. 00444         while(--n >= 0) *pb++ = *ps++;
  131. 00445         pb++;
  132. 00446         ps = _months[timeptr->tm_mon];
  133. 00447         n = ABB_LEN;
  134. 00448         while(--n >= 0) *pb++ = *ps++;
  135. 00449         pb++;
  136. 00450         pb = two_digits(
  137. 00451                     two_digits(
  138. 00452                             two_digits(two_digits(pb, timeptr->tm_mday, 0)
  139. 00453                                         , timeptr->tm_hour, 1)
  140. 00454                             , timeptr->tm_min, 1)
  141. 00455                     , timeptr->tm_sec, 1);
  142. 00456
  143. 00457         four_digits(pb, timeptr->tm_year + 1900);
  144. 00458         return buf;
  145. 00459 }
  146. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  147. src/lib/ansi/assert.c    
  148. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  149. 00500 /*
  150. 00501  * assert.c - diagnostics
  151. 00502  */
  152. 00503 /* $Header: assert.c,v 1.3 90/04/03 15:01:58 eck Exp $ */
  153. 00504
  154. 00505 #include        <assert.h>
  155. 00506 #include        <stdio.h>
  156. 00507 #include        <stdlib.h>
  157. 00508
  158. 00509 void __bad_assertion(const char *mess) {
  159. 00510
  160. 00511         fputs(mess, stderr);
  161. 00512         abort();
  162. 00513 }
  163. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  164. src/lib/ansi/atexit.c    
  165. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  166. 00600 /* $Header: atexit.c,v 1.1 89/12/18 15:11:09 eck Exp $ */
  167. 00601
  168. 00602 #include        <stdlib.h>
  169. 00603
  170. 00604 #define NEXITS  32
  171. 00605
  172. 00606 extern void (*__functab[NEXITS])(void);
  173. 00607 extern int __funccnt;
  174. 00608
  175. 00609 int
  176. 00610 atexit(void (*func)(void))
  177. 00611 {
  178. 00612         if (__funccnt >= NEXITS)
  179. 00613                 return 1;
  180. 00614         __functab[__funccnt++] = func;
  181. 00615         return 0;
  182. 00616 }
  183. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  184. src/lib/ansi/atof.c    
  185. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  186. 00700 /*
  187. 00701  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  188. 00702  * See the copyright notice in the ACK home directory, in the file "Copyright".
  189. 00703  */
  190. 00704 /* $Header: atof.c,v 1.2 89/12/18 15:11:50 eck Exp $ */
  191. 00705
  192. 00706 #include        <stdlib.h>
  193. 00707 #include        <errno.h>
  194. 00708
  195. 00709 double
  196. 00710 atof(const char *nptr)
  197. 00711 {
  198. 00712         double d;
  199. 00713         int e = errno;
  200. 00714
  201. 00715         d = strtod(nptr, (char **) NULL);
  202. 00716         errno = e;
  203. 00717         return d;
  204. 00718 }
  205. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  206. src/lib/ansi/atoi.c    
  207. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  208. 00800 /*
  209. 00801  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  210. 00802  * See the copyright notice in the ACK home directory, in the file "Copyright".
  211. 00803  */
  212. 00804 /* $Header: atoi.c,v 1.4 90/05/22 12:22:25 ceriel Exp $ */
  213. 00805
  214. 00806 #include        <ctype.h>
  215. 00807 #include        <stdlib.h>
  216. 00808
  217. 00809 /* We do not use strtol here for backwards compatibility in behaviour on
  218. 00810    overflow.
  219. 00811 */
  220. 00812 int
  221. 00813 atoi(register const char *nptr)
  222. 00814 {
  223. 00815         int total = 0;
  224. 00816         int minus = 0;
  225. 00817
  226. 00818         while (isspace(*nptr)) nptr++;
  227. 00819         if (*nptr == '+') nptr++;
  228. 00820         else if (*nptr == '-') {
  229. 00821                 minus = 1;
  230. 00822                 nptr++;
  231. 00823         }
  232. 00824         while (isdigit(*nptr)) {
  233. 00825                 total *= 10;
  234. 00826                 total += (*nptr++ - '0');
  235. 00827         }
  236. 00828         return minus ? -total : total;
  237. 00829 }
  238. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  239. src/lib/ansi/atol.c    
  240. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  241. 00900 /*
  242. 00901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  243. 00902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  244. 00903  */
  245. 00904 /* $Header: atol.c,v 1.3 90/05/22 10:48:12 ceriel Exp $ */
  246. 00905
  247. 00906 #include        <ctype.h>
  248. 00907 #include        <stdlib.h>
  249. 00908
  250. 00909 /* We do not use strtol here for backwards compatibility in behaviour on
  251. 00910    overflow.
  252. 00911 */
  253. 00912 long
  254. 00913 atol(register const char *nptr)
  255. 00914 {
  256. 00915         long total = 0;
  257. 00916         int minus = 0;
  258. 00917
  259. 00918         while (isspace(*nptr)) nptr++;
  260. 00919         if (*nptr == '+') nptr++;
  261. 00920         else if (*nptr == '-') {
  262. 00921                 minus = 1;
  263. 00922                 nptr++;
  264. 00923         }
  265. 00924         while (isdigit(*nptr)) {
  266. 00925                 total *= 10;
  267. 00926                 total += (*nptr++ - '0');
  268. 00927         }
  269. 00928         return minus ? -total : total;
  270. 00929 }
  271. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  272. src/lib/ansi/bsearch.c    
  273. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  274. 01000 /*
  275. 01001  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  276. 01002  * See the copyright notice in the ACK home directory, in the file "Copyright".
  277. 01003  */
  278. 01004 /* $Header: bsearch.c,v 1.2 89/12/18 15:12:21 eck Exp $ */
  279. 01005
  280. 01006 #include        <stdlib.h>
  281. 01007
  282. 01008 void *
  283. 01009 bsearch(register const void *key, register const void *base,
  284. 01010         register size_t nmemb, register size_t size,
  285. 01011         int (*compar)(const void *, const void *))
  286. 01012 {
  287. 01013         register const void *mid_point;
  288. 01014         register int  cmp;
  289. 01015
  290. 01016         while (nmemb > 0) {
  291. 01017                 mid_point = (char *)base + size * (nmemb >> 1);
  292. 01018                 if ((cmp = (*compar)(key, mid_point)) == 0)
  293. 01019                         return (void *)mid_point;
  294. 01020                 if (cmp >= 0) {
  295. 01021                         base  = (char *)mid_point + size;
  296. 01022                         nmemb = (nmemb - 1) >> 1;
  297. 01023                 } else
  298. 01024                         nmemb >>= 1;
  299. 01025         }
  300. 01026         return (void *)NULL;
  301. 01027 }
  302. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  303. src/lib/ansi/calloc.c    
  304. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  305. 01100 /* $Header$ */
  306. 01101 #include        <stdlib.h>
  307. 01102
  308. 01103 #define ALIGN(x)        (((x) + (sizeof(size_t) - 1)) & ~(sizeof(size_t) - 1))
  309. 01104
  310. 01105 void *
  311. 01106 calloc(size_t nelem, size_t elsize)
  312. 01107 {
  313. 01108         register char *p;
  314. 01109         register size_t *q;
  315. 01110         size_t size = ALIGN(nelem * elsize);
  316. 01111
  317. 01112         p = malloc(size);
  318. 01113         if (p == NULL) return NULL;
  319. 01114         q = (size_t *) (p + size);
  320. 01115         while ((char *) q > p) *--q = 0;
  321. 01116         return p;
  322. 01117 }
  323. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  324. src/lib/ansi/chartab.c    
  325. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  326. 01200 #include        <ctype.h>
  327. 01201
  328. 01202 char __ctype[] = {
  329. 01203 0,
  330. 01204 _C,
  331. 01205 _C,
  332. 01206 _C,
  333. 01207 _C,
  334. 01208 _C,
  335. 01209 _C,
  336. 01210 _C,
  337. 01211 _C,
  338. 01212 _C,
  339. 01213 _C|_S,
  340. 01214 _C|_S,
  341. 01215 _C|_S,
  342. 01216 _C|_S,
  343. 01217 _C|_S,
  344. 01218 _C,
  345. 01219 _C,
  346. 01220 _C,
  347. 01221 _C,
  348. 01222 _C,
  349. 01223 _C,
  350. 01224 _C,
  351. 01225 _C,
  352. 01226 _C,
  353. 01227 _C,
  354. 01228 _C,
  355. 01229 _C,
  356. 01230 _C,
  357. 01231 _C,
  358. 01232 _C,
  359. 01233 _C,
  360. 01234 _C,
  361. 01235 _C,
  362. 01236 _S,
  363. 01237 _P,
  364. 01238 _P,
  365. 01239 _P,
  366. 01240 _P,
  367. 01241 _P,
  368. 01242 _P,
  369. 01243 _P,
  370. 01244 _P,
  371. 01245 _P,
  372. 01246 _P,
  373. 01247 _P,
  374. 01248 _P,
  375. 01249 _P,
  376. 01250 _P,
  377. 01251 _P,
  378. 01252 _N,
  379. 01253 _N,
  380. 01254 _N,
  381. 01255 _N,
  382. 01256 _N,
  383. 01257 _N,
  384. 01258 _N,
  385. 01259 _N,
  386. 01260 _N,
  387. 01261 _N,
  388. 01262 _P,
  389. 01263 _P,
  390. 01264 _P,
  391. 01265 _P,
  392. 01266 _P,
  393. 01267 _P,
  394. 01268 _P,
  395. 01269 _U|_X,
  396. 01270 _U|_X,
  397. 01271 _U|_X,
  398. 01272 _U|_X,
  399. 01273 _U|_X,
  400. 01274 _U|_X,
  401. 01275 _U,
  402. 01276 _U,
  403. 01277 _U,
  404. 01278 _U,
  405. 01279 _U,
  406. 01280 _U,
  407. 01281 _U,
  408. 01282 _U,
  409. 01283 _U,
  410. 01284 _U,
  411. 01285 _U,
  412. 01286 _U,
  413. 01287 _U,
  414. 01288 _U,
  415. 01289 _U,
  416. 01290 _U,
  417. 01291 _U,
  418. 01292 _U,
  419. 01293 _U,
  420. 01294 _U,
  421. 01295 _P,
  422. 01296 _P,
  423. 01297 _P,
  424. 01298 _P,
  425. 01299 _P,
  426. 01300 _P,
  427. 01301 _L|_X,
  428. 01302 _L|_X,
  429. 01303 _L|_X,
  430. 01304 _L|_X,
  431. 01305 _L|_X,
  432. 01306 _L|_X,
  433. 01307 _L,
  434. 01308 _L,
  435. 01309 _L,
  436. 01310 _L,
  437. 01311 _L,
  438. 01312 _L,
  439. 01313 _L,
  440. 01314 _L,
  441. 01315 _L,
  442. 01316 _L,
  443. 01317 _L,
  444. 01318 _L,
  445. 01319 _L,
  446. 01320 _L,
  447. 01321 _L,
  448. 01322 _L,
  449. 01323 _L,
  450. 01324 _L,
  451. 01325 _L,
  452. 01326 _L,
  453. 01327 _P,
  454. 01328 _P,
  455. 01329 _P,
  456. 01330 _P,
  457. 01331 _C,
  458. 01332 0,
  459. 01333 0,
  460. 01334 0,
  461. 01335 0,
  462. 01336 0,
  463. 01337 0,
  464. 01338 0,
  465. 01339 0,
  466. 01340 0,
  467. 01341 0,
  468. 01342 0,
  469. 01343 0,
  470. 01344 0,
  471. 01345 0,
  472. 01346 0,
  473. 01347 0,
  474. 01348 0,
  475. 01349 0,
  476. 01350 0,
  477. 01351 0,
  478. 01352 0,
  479. 01353 0,
  480. 01354 0,
  481. 01355 0,
  482. 01356 0,
  483. 01357 0,
  484. 01358 0,
  485. 01359 0,
  486. 01360 0,
  487. 01361 0,
  488. 01362 0,
  489. 01363 0,
  490. 01364 0,
  491. 01365 0,
  492. 01366 0,
  493. 01367 0,
  494. 01368 0,
  495. 01369 0,
  496. 01370 0,
  497. 01371 0,
  498. 01372 0,
  499. 01373 0,
  500. 01374 0,
  501. 01375 0,
  502. 01376 0,
  503. 01377 0,
  504. 01378 0,
  505. 01379 0,
  506. 01380 0,
  507. 01381 0,
  508. 01382 0,
  509. 01383 0,
  510. 01384 0,
  511. 01385 0,
  512. 01386 0,
  513. 01387 0,
  514. 01388 0,
  515. 01389 0,
  516. 01390 0,
  517. 01391 0,
  518. 01392 0,
  519. 01393 0,
  520. 01394 0,
  521. 01395 0,
  522. 01396 0,
  523. 01397 0,
  524. 01398 0,
  525. 01399 0,
  526. 01400 0,
  527. 01401 0,
  528. 01402 0,
  529. 01403 0,
  530. 01404 0,
  531. 01405 0,
  532. 01406 0,
  533. 01407 0,
  534. 01408 0,
  535. 01409 0,
  536. 01410 0,
  537. 01411 0,
  538. 01412 0,
  539. 01413 0,
  540. 01414 0,
  541. 01415 0,
  542. 01416 0,
  543. 01417 0,
  544. 01418 0,
  545. 01419 0,
  546. 01420 0,
  547. 01421 0,
  548. 01422 0,
  549. 01423 0,
  550. 01424 0,
  551. 01425 0,
  552. 01426 0,
  553. 01427 0,
  554. 01428 0,
  555. 01429 0,
  556. 01430 0,
  557. 01431 0,
  558. 01432 0,
  559. 01433 0,
  560. 01434 0,
  561. 01435 0,
  562. 01436 0,
  563. 01437 0,
  564. 01438 0,
  565. 01439 0,
  566. 01440 0,
  567. 01441 0,
  568. 01442 0,
  569. 01443 0,
  570. 01444 0,
  571. 01445 0,
  572. 01446 0,
  573. 01447 0,
  574. 01448 0,
  575. 01449 0,
  576. 01450 0,
  577. 01451 0,
  578. 01452 0,
  579. 01453 0,
  580. 01454 0,
  581. 01455 0,
  582. 01456 0,
  583. 01457 0,
  584. 01458 0,
  585. 01459 0,
  586. 01460 };
  587. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  588. src/lib/ansi/clock.c    
  589. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  590. 01500 /*
  591. 01501  * clock - determine the processor time used
  592. 01502  */
  593. 01503 /* $Header: clock.c,v 1.3 90/01/22 13:08:11 eck Exp $ */
  594. 01504
  595. 01505 #include        <time.h>
  596. 01506
  597. 01507 #if     defined(__BSD4_2)
  598. 01508
  599. 01509 struct timeval {
  600. 01510         long    tv_sec;                 /* seconds */
  601. 01511         long    tv_usec;                /* and microseconds */
  602. 01512 };
  603. 01513
  604. 01514 #define RUSAGE_SELF     0
  605. 01515 #define RUSAGE_CHILDREN -1
  606. 01516
  607. 01517 struct rusage {
  608. 01518         struct timeval ru_utime;        /* user time used */
  609. 01519         struct timeval ru_stime;        /* system time used */
  610. 01520         long    ru_maxrss;
  611. 01521         long    ru_ixrss;               /* integral shared memory size */
  612. 01522         long    ru_idrss;               /* integral unshared data size */
  613. 01523         long    ru_isrss;               /* integral unshared stack size */
  614. 01524         long    ru_minflt;              /* page reclaims */
  615. 01525         long    ru_majflt;              /* page faults */
  616. 01526         long    ru_nswap;               /* swaps */
  617. 01527         long    ru_inblock;             /* block input operations */
  618. 01528         long    ru_oublock;             /* block output operations */
  619. 01529         long    ru_msgsnd;              /* messages sent */
  620. 01530         long    ru_msgrcv;              /* messages received */
  621. 01531         long    ru_nsignals;            /* signals received */
  622. 01532         long    ru_nvcsw;               /* voluntary context switches */
  623. 01533         long    ru_nivcsw;              /* involuntary context switches */
  624. 01534 };
  625. 01535
  626. 01536 void _getrusage(int who, struct rusage *rusage);
  627. 01537
  628. 01538 #elif   defined(_POSIX_SOURCE) || defined(__USG)
  629. 01539
  630. 01540 struct tms {
  631. 01541         time_t  tms_utime;              /* user time */
  632. 01542         time_t  tms_stime;              /* system time */
  633. 01543         time_t  tms_cutime;             /* user time, children */
  634. 01544         time_t  tms_cstime;             /* system time, children */
  635. 01545 };
  636. 01546
  637. 01547 clock_t _times(struct tms *buffer);
  638. 01548
  639. 01549 #else                                   /* Version 7 UNIX */
  640. 01550
  641. 01551 struct tbuffer {
  642. 01552         long proc_user_time;
  643. 01553         long proc_system_time;
  644. 01554         long child_user_time;
  645. 01555         long child_system_time;
  646. 01556 };
  647. 01557
  648. 01558 clock_t _times(struct tbuffer *buffer);
  649. 01559
  650. 01560 #endif
  651. 01561
  652. 01562 clock_t
  653. 01563 clock(void)
  654. 01564 {
  655. 01565 #if     defined(__BSD4_2)
  656. 01566         struct rusage rusage;
  657. 01567
  658. 01568         _getrusage(RUSAGE_SELF, &rusage);
  659. 01569
  660. 01570         return (((unsigned long)rusage.ru_utime.tv_sec * CLOCKS_PER_SEC)
  661. 01571                 + rusage.ru_utime.tv_usec);
  662. 01572 #elif   defined(_POSIX_SOURCE) || defined(__USG)
  663. 01573         struct tms tms;
  664. 01574
  665. 01575         _times(&tms);
  666. 01576         /* Assume that time_t can be converted to clock_t for Sys5 */
  667. 01577         return tms.tms_utime;
  668. 01578 #else
  669. 01579         struct tbuffer tbuffer;
  670. 01580
  671. 01581         _times(&tbuffer);
  672. 01582         return tbuffer.proc_user_time;
  673. 01583 #endif
  674. 01584 }
  675. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  676. src/lib/ansi/ctime.c    
  677. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  678. 01600 /*
  679. 01601  * ctime - convers the calendar time to a string
  680. 01602  */
  681. 01603 /* $Header: ctime.c,v 1.1 89/06/12 15:21:16 eck Exp $ */
  682. 01604
  683. 01605 #include        <time.h>
  684. 01606
  685. 01607 char *
  686. 01608 ctime(const time_t *timer)
  687. 01609 {
  688. 01610         return asctime(localtime(timer));
  689. 01611 }
  690. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  691. src/lib/ansi/difftime.c    
  692. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  693. 01700 /*
  694. 01701  * difftime - compute the difference between two calendar times
  695. 01702  */
  696. 01703 /* $Header: difftime.c,v 1.4 90/09/11 10:18:44 eck Exp $ */
  697. 01704
  698. 01705 #include        <time.h>
  699. 01706
  700. 01707 double
  701. 01708 difftime(time_t time1, time_t time0)
  702. 01709 {
  703. 01710         /* be careful: time_t may be unsigned */
  704. 01711         if ((time_t)-1 > 0 && time0 > time1) {
  705. 01712                 return - (double) (time0 - time1);
  706. 01713         } else {
  707. 01714                 return (double)(time1 - time0);
  708. 01715         }
  709. 01716 }
  710. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  711. src/lib/ansi/div.c    
  712. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  713. 01800 /*
  714. 01801  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  715. 01802  * See the copyright notice in the ACK home directory, in the file "Copyright".
  716. 01803  */
  717. 01804 /* $Header: div.c,v 1.3 90/03/05 13:47:53 eck Exp $ */
  718. 01805
  719. 01806 #include        <stdlib.h>
  720. 01807
  721. 01808 static int tmp = -1;
  722. 01809
  723. 01810 div_t
  724. 01811 div(register int numer, register int denom)
  725. 01812 {
  726. 01813         div_t r;
  727. 01814
  728. 01815         /* The assignment of tmp should not be optimized !! */
  729. 01816         if (tmp == -1) {
  730. 01817                 tmp = (tmp / 2 == 0);
  731. 01818         }
  732. 01819         if (numer == 0) {
  733. 01820                 r.quot = numer / denom;         /* might trap if denom == 0 */
  734. 01821                 r.rem = numer % denom;
  735. 01822         } else if ( !tmp && ((numer < 0) != (denom < 0))) {
  736. 01823                 r.quot = (numer / denom) + 1;
  737. 01824                 r.rem = numer - (numer / denom + 1) * denom;
  738. 01825         } else {
  739. 01826                 r.quot = numer / denom;
  740. 01827                 r.rem = numer % denom;
  741. 01828         }
  742. 01829         return r;
  743. 01830 }
  744. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  745. src/lib/ansi/errlist.c    
  746. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  747. 01900 /*
  748. 01901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  749. 01902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  750. 01903  */
  751. 01904 /* $Header: errlist.c,v 1.1 89/05/10 16:22:20 eck Exp $ */
  752. 01905
  753. 01906 #include        <errno.h>
  754. 01907
  755. 01908 static const char unknown[] = "Unknown error";
  756. 01909
  757. 01910 const char *_sys_errlist[] = {
  758. 01911         "Error 0",                      /* EGENERIC */
  759. 01912         "Not owner",                    /* EPERM */
  760. 01913         "No such file or directory",    /* ENOENT */
  761. 01914         "No such process",              /* ESRCH */
  762. 01915         "Interrupted system call",      /* EINTR */
  763. 01916         "I/O error",                    /* EIO */
  764. 01917         "No such device or address",    /* ENXIO */
  765. 01918         "Arg list too long",            /* E2BIG */
  766. 01919         "Exec format error",            /* ENOEXEC */
  767. 01920         "Bad file number",              /* EBADF */
  768. 01921         "No children",                  /* ECHILD */
  769. 01922         "No more processes",            /* EAGAIN */
  770. 01923         "Not enough core",              /* ENOMEM */
  771. 01924         "Permission denied",            /* EACCES */
  772. 01925         "Bad address",                  /* EFAULT */
  773. 01926         "Block device required",        /* ENOTBLK */
  774. 01927         "Resource busy",                /* EBUSY */
  775. 01928         "File exists",                  /* EEXIST */
  776. 01929         "Cross-device link",            /* EXDEV */
  777. 01930         "No such device",               /* ENODEV */
  778. 01931         "Not a directory",              /* ENOTDIR */
  779. 01932         "Is a directory",               /* EISDIR */
  780. 01933         "Invalid argument",             /* EINVAL */
  781. 01934         "File table overflow",          /* ENFILE */
  782. 01935         "Too many open files",          /* EMFILE */
  783. 01936         "Not a typewriter",             /* ENOTTY */
  784. 01937         "Text file busy",               /* ETXTBSY */
  785. 01938         "File too large",               /* EFBIG */
  786. 01939         "No space left on device",      /* ENOSPC */
  787. 01940         "Illegal seek",                 /* ESPIPE */
  788. 01941         "Read-only file system",        /* EROFS */
  789. 01942         "Too many links",               /* EMLINK */
  790. 01943         "Broken pipe",                  /* EPIPE */
  791. 01944         "Math argument",                /* EDOM */
  792. 01945         "Result too large",             /* ERANGE */
  793. 01946         "Resource deadlock avoided",    /* EDEADLK */
  794. 01947         "File name too long",           /* ENAMETOOLONG */
  795. 01948         "No locks available",           /* ENOLCK */
  796. 01949         "Function not implemented",     /* ENOSYS */
  797. 01950         "Directory not empty",          /* ENOTEMPTY */
  798. 01951         unknown,                        /* 40 */
  799. 01952         unknown,                        /* 41 */
  800. 01953         unknown,                        /* 42 */
  801. 01954         unknown,                        /* 43 */
  802. 01955         unknown,                        /* 44 */
  803. 01956         unknown,                        /* 45 */
  804. 01957         unknown,                        /* 46 */
  805. 01958         unknown,                        /* 47 */
  806. 01959         unknown,                        /* 48 */
  807. 01960         unknown,                        /* 49 */
  808. 01961         "Invalid packet size",          /* EPACKSIZE */
  809. 01962         "Not enough buffers left",      /* EOUTOFBUFS */
  810. 01963         "Illegal ioctl for device",     /* EBADIOCTL */
  811. 01964         "Bad mode for ioctl",           /* EBADMODE */
  812. 01965         "Would block",                  /* EWOULDBLOCK */
  813. 01966         "Bad destination address",      /* EBADDEST */
  814. 01967         "Destination not reachable",    /* EDSTNOTRCH */
  815. 01968         "Already connected",            /* EISCONN */
  816. 01969         "Address in use",               /* EADDRINUSE */
  817. 01970         "Connection refused",           /* ECONNREFUSED */
  818. 01971         "Connection reset",             /* ECONNRESET */
  819. 01972         "Connection timed out",         /* ETIMEDOUT */
  820. 01973         "Urgent data present",          /* EURG */
  821. 01974         "No urgent data present",       /* ENOURG */
  822. 01975         "No connection",                /* ENOTCONN */
  823. 01976         "Already shutdown",             /* ESHUTDOWN */
  824. 01977         "No such connection",           /* ENOCONN */
  825. 01978 };
  826. 01979
  827. 01980 const int _sys_nerr = sizeof(_sys_errlist) / sizeof(_sys_errlist[0]);
  828. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  829. src/lib/ansi/exit.c    
  830. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  831. 02000 /*
  832. 02001  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  833. 02002  * See the copyright notice in the ACK home directory, in the file "Copyright".
  834. 02003  */
  835. 02004 /* $Header: exit.c,v 1.3 90/01/22 13:00:04 eck Exp $ */
  836. 02005
  837. 02006 #include        <stdio.h>
  838. 02007 #include        <stdlib.h>
  839. 02008
  840. 02009 #define NEXITS  32
  841. 02010
  842. 02011 void (*__functab[NEXITS])(void);
  843. 02012 int __funccnt = 0;
  844. 02013
  845. 02014 extern void _exit(int);
  846. 02015
  847. 02016 /* only flush output buffers when necessary */
  848. 02017 int (*_clean)(void) = NULL;
  849. 02018
  850. 02019 static void
  851. 02020 _calls(void)
  852. 02021 {
  853. 02022         register int i = __funccnt;
  854. 02023         
  855. 02024         /* "Called in reversed order of their registration" */
  856. 02025         while (--i >= 0)
  857. 02026                 (*__functab[i])();
  858. 02027 }
  859. 02029 void
  860. 02030 exit(int status)
  861. 02031 {
  862. 02032         _calls();
  863. 02033         if (_clean) _clean();
  864. 02034         _exit(status) ;
  865. 02035 }
  866. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  867. src/lib/ansi/ext_comp.c    
  868. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  869. 02100 /*
  870. 02101   (c) copyright 1989 by the Vrije Universiteit, Amsterdam, The Netherlands.
  871. 02102   See the copyright notice in the ACK home directory, in the file "Copyright".
  872. 02103 */
  873. 02104
  874. 02105 /* $Id: ext_comp.c,v 1.10 1994/06/24 11:53:36 ceriel Exp $ */
  875. 02106
  876. 02107 /* extended precision arithmetic for the strtod() and cvt() routines */
  877. 02108
  878. 02109 /* This may require some more work when long doubles get bigger than 8
  879. 02110    bytes. In this case, these routines may become obsolete. ???
  880. 02111 */
  881. 02112
  882. 02113 #include        "ext_fmt.h"
  883. 02114 #include        <float.h>
  884. 02115 #include        <errno.h>
  885. 02116 #include        <ctype.h>
  886. 02117
  887. 02118 static int b64_add(struct mantissa *e1, struct mantissa *e2);
  888. 02119 static b64_sft(struct mantissa *e1, int n);
  889. 02120
  890. 02121 static
  891. 02122 mul_ext(struct EXTEND *e1, struct EXTEND *e2, struct EXTEND *e3)
  892. 02123 {
  893. 02124         /*      Multiply the extended numbers e1 and e2, and put the
  894. 02125                 result in e3.
  895. 02126         */
  896. 02127         register int    i,j;            /* loop control */
  897. 02128         unsigned short  mp[4];
  898. 02129         unsigned short  mc[4];
  899. 02130         unsigned short  result[8];      /* result */
  900. 02131
  901. 02132         register unsigned short *pres;
  902. 02133
  903. 02134         /* first save the sign (XOR)                    */
  904. 02135         e3->sign = e1->sign ^ e2->sign;
  905. 02136
  906. 02137         /* compute new exponent */
  907. 02138         e3->exp = e1->exp + e2->exp + 1;
  908. 02139
  909. 02140         /* check for overflow/underflow ??? */
  910. 02141
  911. 02142         /* 128 bit multiply of mantissas        */
  912. 02143
  913. 02144         /* assign unknown long formats          */
  914. 02145         /* to known unsigned word formats       */
  915. 02146         mp[0] = e1->m1 >> 16;
  916. 02147         mp[1] = (unsigned short) e1->m1;
  917. 02148         mp[2] = e1->m2 >> 16;
  918. 02149         mp[3] = (unsigned short) e1->m2;
  919. 02150         mc[0] = e2->m1 >> 16;
  920. 02151         mc[1] = (unsigned short) e2->m1;
  921. 02152         mc[2] = e2->m2 >> 16;
  922. 02153         mc[3] = (unsigned short) e2->m2;
  923. 02154         for (i = 8; i--;) {
  924. 02155                 result[i] = 0;
  925. 02156         }
  926. 02157         /*
  927. 02158          *      fill registers with their components
  928. 02159          */
  929. 02160         for(i=4, pres = &result[4];i--;pres--) if (mp[i]) {
  930. 02161                 unsigned short k = 0;
  931. 02162                 unsigned long mpi = mp[i];
  932. 02163                 for(j=4;j--;) {
  933. 02164                         unsigned long tmp = (unsigned long)pres[j] + k;
  934. 02165                         if (mc[j]) tmp += mpi * mc[j];
  935. 02166                         pres[j] = tmp;
  936. 02167                         k = tmp >> 16;
  937. 02168                 }
  938. 02169                 pres[-1] = k;
  939. 02170         }
  940. 02171
  941. 02172         if (! (result[0] & 0x8000)) {
  942. 02173                 e3->exp--;
  943. 02174                 for (i = 0; i <= 3; i++) {
  944. 02175                         result[i] <<= 1;
  945. 02176                         if (result[i+1]&0x8000) result[i] |= 1;
  946. 02177                 }
  947. 02178                 result[4] <<= 1;
  948. 02179         }       
  949. 02180         /*
  950. 02181          *      combine the registers to a total
  951. 02182          */
  952. 02183         e3->m1 = ((unsigned long)(result[0]) << 16) + result[1];
  953. 02184         e3->m2 = ((unsigned long)(result[2]) << 16) + result[3];
  954. 02185         if (result[4] & 0x8000) {
  955. 02186                 if (++e3->m2 == 0) {
  956. 02187                         if (++e3->m1 == 0) {
  957. 02188                                 e3->m1 = 0x80000000;
  958. 02189                                 e3->exp++;
  959. 02190                         }
  960. 02191                 }
  961. 02192         }
  962. 02193 }
  963. 02195 static
  964. 02196 add_ext(struct EXTEND *e1, struct EXTEND *e2, struct EXTEND *e3)
  965. 02197 {
  966. 02198         /*      Add two extended numbers e1 and e2, and put the result
  967. 02199                 in e3
  968. 02200         */
  969. 02201         struct EXTEND ce2;
  970. 02202         int diff;
  971. 02203
  972. 02204         if ((e2->m1 | e2->m2) == 0L) {
  973. 02205                 *e3 = *e1;
  974. 02206                 return;
  975. 02207         }
  976. 02208         if ((e1->m1 | e1->m2) == 0L) {
  977. 02209                 *e3 = *e2;
  978. 02210                 return;
  979. 02211         }
  980. 02212         ce2 = *e2;
  981. 02213         *e3 = *e1;
  982. 02214         e1 = &ce2;
  983. 02215
  984. 02216         /* adjust mantissas to equal power */
  985. 02217         diff = e3->exp - e1->exp;
  986. 02218         if (diff < 0) {
  987. 02219                 diff = -diff;
  988. 02220                 e3->exp += diff;
  989. 02221                 b64_sft(&(e3->mantissa), diff);
  990. 02222         }
  991. 02223         else if (diff > 0) {
  992. 02224                 e1->exp += diff;
  993. 02225                 b64_sft(&(e1->mantissa), diff);
  994. 02226         }
  995. 02227         if (e1->sign != e3->sign) {
  996. 02228                 /* e3 + e1 = e3 - (-e1) */
  997. 02229                 if (e1->m1 > e3->m1 ||
  998. 02230                     (e1->m1 == e3->m1 && e1->m2 > e3->m2)) {
  999. 02231                         /*      abs(e1) > abs(e3) */
  1000. 02232                         if (e3->m2 > e1->m2) {
  1001. 02233                                 e1->m1 -= 1;    /* carry in */
  1002. 02234                         }
  1003. 02235                         e1->m1 -= e3->m1;
  1004. 02236                         e1->m2 -= e3->m2;
  1005. 02237                         *e3 = *e1;
  1006. 02238                 }
  1007. 02239                 else {
  1008. 02240                         if (e1->m2 > e3->m2)
  1009. 02241                                 e3->m1 -= 1;    /* carry in */
  1010. 02242                         e3->m1 -= e1->m1;
  1011. 02243                         e3->m2 -= e1->m2;
  1012. 02244                 }
  1013. 02245         }
  1014. 02246         else {
  1015. 02247                 if (b64_add(&e3->mantissa,&e1->mantissa)) {/* addition carry */
  1016. 02248                         b64_sft(&e3->mantissa,1);/* shift mantissa one bit RIGHT */
  1017. 02249                         e3->m1 |= 0x80000000L;  /* set max bit  */
  1018. 02250                         e3->exp++;              /* increase the exponent */
  1019. 02251                 }
  1020. 02252         }
  1021. 02253         if ((e3->m2 | e3->m1) != 0L) {
  1022. 02254                 /* normalize */
  1023. 02255                 if (e3->m1 == 0L) {
  1024. 02256                         e3->m1 = e3->m2; e3->m2 = 0L; e3->exp -= 32;
  1025. 02257                 }
  1026. 02258                 if (!(e3->m1 & 0x80000000)) {
  1027. 02259                         unsigned long l = 0x40000000;
  1028. 02260                         int cnt = -1;
  1029. 02261
  1030. 02262                         while (! (l & e3->m1)) {
  1031. 02263                                 l >>= 1; cnt--;
  1032. 02264                         }
  1033. 02265                         e3->exp += cnt;
  1034. 02266                         b64_sft(&(e3->mantissa), cnt);
  1035. 02267                 }
  1036. 02268         }
  1037. 02269 }
  1038. 02271 static int
  1039. 02272 cmp_ext(struct EXTEND *e1, struct EXTEND *e2)
  1040. 02273 {
  1041. 02274         struct EXTEND tmp; 
  1042. 02275          
  1043. 02276         e2->sign = ! e2->sign; 
  1044. 02277         add_ext(e1, e2, &tmp);  
  1045. 02278         e2->sign = ! e2->sign;
  1046. 02279         if (tmp.m1 == 0 && tmp.m2 == 0) return 0; 
  1047. 02280         if (tmp.sign) return -1;
  1048. 02281         return 1;
  1049. 02282 }
  1050. 02284 static
  1051. 02285 b64_sft(struct mantissa *e1, int n)
  1052. 02286 {
  1053. 02287         if (n > 0) {
  1054. 02288                 if (n > 63) {
  1055. 02289                         e1->l_32 = 0;
  1056. 02290                         e1->h_32 = 0;
  1057. 02291                         return;
  1058. 02292                 }
  1059. 02293                 if (n >= 32) {
  1060. 02294                         e1->l_32 = e1->h_32;
  1061. 02295                         e1->h_32 = 0;
  1062. 02296                         n -= 32;
  1063. 02297                 }
  1064. 02298                 if (n > 0) {
  1065. 02299                         e1->l_32 >>= n;
  1066. 02300                         if (e1->h_32 != 0) {
  1067. 02301                                 e1->l_32 |= (e1->h_32 << (32 - n));
  1068. 02302                                 e1->h_32 >>= n;
  1069. 02303                         }
  1070. 02304                 }
  1071. 02305                 return;
  1072. 02306         }
  1073. 02307         n = -n;
  1074. 02308         if (n > 0) {
  1075. 02309                 if (n > 63) {
  1076. 02310                         e1->l_32 = 0;
  1077. 02311                         e1->h_32 = 0;
  1078. 02312                         return;
  1079. 02313                 }
  1080. 02314                 if (n >= 32) {
  1081. 02315                         e1->h_32 = e1->l_32;
  1082. 02316                         e1->l_32 = 0;
  1083. 02317                         n -= 32;
  1084. 02318                 }
  1085. 02319                 if (n > 0) {
  1086. 02320                         e1->h_32 <<= n;
  1087. 02321                         if (e1->l_32 != 0) {
  1088. 02322                                 e1->h_32 |= (e1->l_32 >> (32 - n));
  1089. 02323                                 e1->l_32 <<= n;
  1090. 02324                         }
  1091. 02325                 }
  1092. 02326         }
  1093. 02327 }
  1094. 02329 static int
  1095. 02330 b64_add(struct mantissa *e1, struct mantissa *e2)
  1096. 02331                 /*
  1097. 02332                  * pointers to 64 bit 'registers'
  1098. 02333                  */
  1099. 02334 {
  1100. 02335         register int    overflow;
  1101. 02336         int             carry;
  1102. 02337
  1103. 02338                         /* add higher pair of 32 bits */
  1104. 02339         overflow = ((unsigned long) 0xFFFFFFFF - e1->h_32 < e2->h_32);
  1105. 02340         e1->h_32 += e2->h_32;
  1106. 02341
  1107. 02342                         /* add lower pair of 32 bits */
  1108. 02343         carry = ((unsigned long) 0xFFFFFFFF - e1->l_32 < e2->l_32);
  1109. 02344         e1->l_32 += e2->l_32;
  1110. 02345         if ((carry) && (++e1->h_32 == 0))
  1111. 02346                 return(1);              /* had a 64 bit overflow */
  1112. 02347         else
  1113. 02348                 return(overflow);       /* return status from higher add */
  1114. 02349 }
  1115. 02351 /* The following tables can be computed with the following bc(1)
  1116. 02352    program:
  1117. 02353
  1118. 02354 obase=16
  1119. 02355 scale=0
  1120. 02356 define t(x){
  1121. 02357         auto a, b, c
  1122. 02358         a=2;b=1;c=2^32;n=1
  1123. 02359         while(a<x) {
  1124. 02360                 b=a;n+=n;a*=a
  1125. 02361         }
  1126. 02362         n/=2
  1127. 02363         a=b
  1128. 02364         while(b<x) {
  1129. 02365                 a=b;b*=c;n+=32
  1130. 02366         }
  1131. 02367         n-=32
  1132. 02368         b=a
  1133. 02369         while(a<x) {
  1134. 02370                 b=a;a+=a;n+=1
  1135. 02371         }
  1136. 02372         n-=1
  1137. 02373         x*=16^16
  1138. 02374         b=x%a
  1139. 02375         x/=a
  1140. 02376         if(a<=(2*b)) x+=1
  1141. 02377         obase=10
  1142. 02378         n
  1143. 02379         obase=16
  1144. 02380         return(x)
  1145. 02381 }
  1146. 02382 for (i=1;i<28;i++) {
  1147. 02383         t(10^i)
  1148. 02384 }
  1149. 02385 0
  1150. 02386 for (i=1;i<20;i++) {
  1151. 02387         t(10^(28*i))
  1152. 02388 }
  1153. 02389 0
  1154. 02390 define r(x){
  1155. 02391         auto a, b, c
  1156. 02392         a=2;b=1;c=2^32;n=1
  1157. 02393         while(a<x) {
  1158. 02394                 b=a;n+=n;a*=a
  1159. 02395         }
  1160. 02396         n/=2
  1161. 02397         a=b
  1162. 02398         while(b<x) {
  1163. 02399                 a=b;b*=c;n+=32
  1164. 02400         }
  1165. 02401         n-=32
  1166. 02402         b=a
  1167. 02403         while(a<x) {
  1168. 02404                 b=a;a+=a;n+=1
  1169. 02405         }
  1170. 02406         a=b
  1171. 02407         a*=16^16
  1172. 02408         b=a%x
  1173. 02409         a/=x
  1174. 02410         if(x<=(2*b)) a+=1
  1175. 02411         obase=10
  1176. 02412         -n
  1177. 02413         obase=16
  1178. 02414         return(a)
  1179. 02415 }
  1180. 02416 for (i=1;i<28;i++) {
  1181. 02417         r(10^i)
  1182. 02418 }
  1183. 02419 0
  1184. 02420 for (i=1;i<20;i++) {
  1185. 02421         r(10^(28*i))
  1186. 02422 }
  1187. 02423 0
  1188. 02424
  1189. 02425 */
  1190. 02426 static struct EXTEND ten_powers[] = {   /* representation of 10 ** i */
  1191. 02427         { 0,    0,      0x80000000,     0 },
  1192. 02428         { 0,    3,      0xA0000000,     0 },
  1193. 02429         { 0,    6,      0xC8000000,     0 },
  1194. 02430         { 0,    9,      0xFA000000,     0 },
  1195. 02431         { 0,    13,     0x9C400000,     0 },
  1196. 02432         { 0,    16,     0xC3500000,     0 },
  1197. 02433         { 0,    19,     0xF4240000,     0 },
  1198. 02434         { 0,    23,     0x98968000,     0 },
  1199. 02435         { 0,    26,     0xBEBC2000,     0 },
  1200. 02436         { 0,    29,     0xEE6B2800,     0 },
  1201. 02437         { 0,    33,     0x9502F900,     0 },
  1202. 02438         { 0,    36,     0xBA43B740,     0 },
  1203. 02439         { 0,    39,     0xE8D4A510,     0 },
  1204. 02440         { 0,    43,     0x9184E72A,     0 },
  1205. 02441         { 0,    46,     0xB5E620F4,     0x80000000 },
  1206. 02442         { 0,    49,     0xE35FA931,     0xA0000000 },
  1207. 02443         { 0,    53,     0x8E1BC9BF,     0x04000000 },
  1208. 02444         { 0,    56,     0xB1A2BC2E,     0xC5000000 },
  1209. 02445         { 0,    59,     0xDE0B6B3A,     0x76400000 },
  1210. 02446         { 0,    63,     0x8AC72304,     0x89E80000 },
  1211. 02447         { 0,    66,     0xAD78EBC5,     0xAC620000 },
  1212. 02448         { 0,    69,     0xD8D726B7,     0x177A8000 },
  1213. 02449         { 0,    73,     0x87867832,     0x6EAC9000 },
  1214. 02450         { 0,    76,     0xA968163F,     0x0A57B400 },
  1215. 02451         { 0,    79,     0xD3C21BCE,     0xCCEDA100 },
  1216. 02452         { 0,    83,     0x84595161,     0x401484A0 },
  1217. 02453         { 0,    86,     0xA56FA5B9,     0x9019A5C8 },
  1218. 02454         { 0,    89,     0xCECB8F27,     0xF4200F3A }
  1219. 02455 };
  1220. 02456 static struct EXTEND big_ten_powers[] = {  /* representation of 10 ** (28*i) */
  1221. 02457         { 0,    0,      0x80000000,     0 },
  1222. 02458         { 0,    93,     0x813F3978,     0xF8940984 },
  1223. 02459         { 0,    186,    0x82818F12,     0x81ED44A0 },
  1224. 02460         { 0,    279,    0x83C7088E,     0x1AAB65DB },
  1225. 02461         { 0,    372,    0x850FADC0,     0x9923329E },
  1226. 02462         { 0,    465,    0x865B8692,     0x5B9BC5C2 },
  1227. 02463         { 0,    558,    0x87AA9AFF,     0x79042287 },
  1228. 02464         { 0,    651,    0x88FCF317,     0xF22241E2 },
  1229. 02465         { 0,    744,    0x8A5296FF,     0xE33CC930 },
  1230. 02466         { 0,    837,    0x8BAB8EEF,     0xB6409C1A },
  1231. 02467         { 0,    930,    0x8D07E334,     0x55637EB3 },
  1232. 02468         { 0,    1023,   0x8E679C2F,     0x5E44FF8F },
  1233. 02469         { 0,    1116,   0x8FCAC257,     0x558EE4E6 },
  1234. 02470         { 0,    1209,   0x91315E37,     0xDB165AA9 },
  1235. 02471         { 0,    1302,   0x929B7871,     0xDE7F22B9 },
  1236. 02472         { 0,    1395,   0x940919BB,     0xD4620B6D },
  1237. 02473         { 0,    1488,   0x957A4AE1,     0xEBF7F3D4 },
  1238. 02474         { 0,    1581,   0x96EF14C6,     0x454AA840 },
  1239. 02475         { 0,    1674,   0x98678061,     0x27ECE4F5 },
  1240. 02476         { 0,    1767,   0x99E396C1,     0x3A3ACFF2 }
  1241. 02477 };
  1242. 02478
  1243. 02479 static struct EXTEND r_ten_powers[] = { /* representation of 10 ** -i */
  1244. 02480         { 0,    0,      0x80000000,     0 },
  1245. 02481         { 0,    -4,     0xCCCCCCCC,     0xCCCCCCCD },
  1246. 02482         { 0,    -7,     0xA3D70A3D,     0x70A3D70A },
  1247. 02483         { 0,    -10,    0x83126E97,     0x8D4FDF3B },
  1248. 02484         { 0,    -14,    0xD1B71758,     0xE219652C },
  1249. 02485         { 0,    -17,    0xA7C5AC47,     0x1B478423 },
  1250. 02486         { 0,    -20,    0x8637BD05,     0xAF6C69B6 },
  1251. 02487         { 0,    -24,    0xD6BF94D5,     0xE57A42BC },
  1252. 02488         { 0,    -27,    0xABCC7711,     0x8461CEFD },
  1253. 02489         { 0,    -30,    0x89705F41,     0x36B4A597 },
  1254. 02490         { 0,    -34,    0xDBE6FECE,     0xBDEDD5BF },
  1255. 02491         { 0,    -37,    0xAFEBFF0B,     0xCB24AAFF },
  1256. 02492         { 0,    -40,    0x8CBCCC09,     0x6F5088CC },
  1257. 02493         { 0,    -44,    0xE12E1342,     0x4BB40E13 },
  1258. 02494         { 0,    -47,    0xB424DC35,     0x095CD80F },
  1259. 02495         { 0,    -50,    0x901D7CF7,     0x3AB0ACD9 },
  1260. 02496         { 0,    -54,    0xE69594BE,     0xC44DE15B },
  1261. 02497         { 0,    -57,    0xB877AA32,     0x36A4B449 },
  1262. 02498         { 0,    -60,    0x9392EE8E,     0x921D5D07 },
  1263. 02499         { 0,    -64,    0xEC1E4A7D,     0xB69561A5 },
  1264. 02500         { 0,    -67,    0xBCE50864,     0x92111AEB },
  1265. 02501         { 0,    -70,    0x971DA050,     0x74DA7BEF },
  1266. 02502         { 0,    -74,    0xF1C90080,     0xBAF72CB1 },
  1267. 02503         { 0,    -77,    0xC16D9A00,     0x95928A27 },
  1268. 02504         { 0,    -80,    0x9ABE14CD,     0x44753B53 },
  1269. 02505         { 0,    -84,    0xF79687AE,     0xD3EEC551 },
  1270. 02506         { 0,    -87,    0xC6120625,     0x76589DDB },
  1271. 02507         { 0,    -90,    0x9E74D1B7,     0x91E07E48 }
  1272. 02508 };
  1273. 02509
  1274. 02510 static struct EXTEND r_big_ten_powers[] = { /* representation of 10 ** -(28*i) */
  1275. 02511         { 0,    0,      0x80000000,     0 },
  1276. 02512         { 0,    -94,    0xFD87B5F2,     0x8300CA0E },
  1277. 02513         { 0,    -187,   0xFB158592,     0xBE068D2F },
  1278. 02514         { 0,    -280,   0xF8A95FCF,     0x88747D94 },
  1279. 02515         { 0,    -373,   0xF64335BC,     0xF065D37D },
  1280. 02516         { 0,    -466,   0xF3E2F893,     0xDEC3F126 },
  1281. 02517         { 0,    -559,   0xF18899B1,     0xBC3F8CA2 },
  1282. 02518         { 0,    -652,   0xEF340A98,     0x172AACE5 },
  1283. 02519         { 0,    -745,   0xECE53CEC,     0x4A314EBE },
  1284. 02520         { 0,    -838,   0xEA9C2277,     0x23EE8BCB },
  1285. 02521         { 0,    -931,   0xE858AD24,     0x8F5C22CA },
  1286. 02522         { 0,    -1024,  0xE61ACF03,     0x3D1A45DF },
  1287. 02523         { 0,    -1117,  0xE3E27A44,     0x4D8D98B8 },
  1288. 02524         { 0,    -1210,  0xE1AFA13A,     0xFBD14D6E },
  1289. 02525         { 0,    -1303,  0xDF82365C,     0x497B5454 },
  1290. 02526         { 0,    -1396,  0xDD5A2C3E,     0xAB3097CC },
  1291. 02527         { 0,    -1489,  0xDB377599,     0xB6074245 },
  1292. 02528         { 0,    -1582,  0xD91A0545,     0xCDB51186 },
  1293. 02529         { 0,    -1675,  0xD701CE3B,     0xD387BF48 },
  1294. 02530         { 0,    -1768,  0xD4EEC394,     0xD6258BF8 }
  1295. 02531 };
  1296. 02532
  1297. 02533 #define TP      (int)(sizeof(ten_powers)/sizeof(ten_powers[0]))
  1298. 02534 #define BTP     (int)(sizeof(big_ten_powers)/sizeof(big_ten_powers[0]))
  1299. 02535 #define MAX_EXP (TP * BTP - 1)
  1300. 02536
  1301. 02537 static
  1302. 02538 add_exponent(struct EXTEND *e, int exp)
  1303. 02539 {
  1304. 02540         int neg = exp < 0;
  1305. 02541         int divsz, modsz;
  1306. 02542         struct EXTEND x;
  1307. 02543
  1308. 02544         if (neg) exp = -exp;
  1309. 02545         divsz = exp / TP;
  1310. 02546         modsz = exp % TP;
  1311. 02547         if (neg) {
  1312. 02548                 mul_ext(e, &r_ten_powers[modsz], &x);
  1313. 02549                 mul_ext(&x, &r_big_ten_powers[divsz], e);
  1314. 02550         }
  1315. 02551         else {
  1316. 02552                 mul_ext(e, &ten_powers[modsz], &x);
  1317. 02553                 mul_ext(&x, &big_ten_powers[divsz], e);
  1318. 02554         }
  1319. 02555 }
  1320. 02557 _str_ext_cvt(const char *s, char **ss, struct EXTEND *e)
  1321. 02558 {
  1322. 02559         /*      Like strtod, but for extended precision */
  1323. 02560         register int    c;
  1324. 02561         int             dotseen = 0;
  1325. 02562         int             digitseen = 0;
  1326. 02563         int             exp = 0;
  1327. 02564
  1328. 02565         if (ss) *ss = (char *)s;
  1329. 02566         while (isspace(*s)) s++;
  1330. 02567
  1331. 02568         e->sign = 0;
  1332. 02569         e->exp = 0;
  1333. 02570         e->m1 = e->m2 = 0;
  1334. 02571
  1335. 02572         c = *s;
  1336. 02573         switch(c) {
  1337. 02574         case '-':
  1338. 02575                 e->sign = 1;
  1339. 02576         case '+':
  1340. 02577                 s++;
  1341. 02578         }
  1342. 02579         while (c = *s++, isdigit(c) || (c == '.' && ! dotseen++)) {
  1343. 02580                 if (c == '.') continue;
  1344. 02581                 digitseen = 1;
  1345. 02582                 if (e->m1 <= (unsigned long)(0xFFFFFFFF)/10) {
  1346. 02583                         struct mantissa a1;
  1347. 02584
  1348. 02585                         a1 = e->mantissa;
  1349. 02586                         b64_sft(&(e->mantissa), -3);
  1350. 02587                         b64_sft(&a1, -1);
  1351. 02588                         b64_add(&(e->mantissa), &a1);
  1352. 02589                         a1.h_32 = 0;
  1353. 02590                         a1.l_32 = c - '0';
  1354. 02591                         b64_add(&(e->mantissa), &a1);
  1355. 02592                 }
  1356. 02593                 else exp++;
  1357. 02594                 if (dotseen) exp--;
  1358. 02595         }
  1359. 02596         if (! digitseen) return;
  1360. 02597
  1361. 02598         if (ss) *ss = (char *)s - 1;
  1362. 02599
  1363. 02600         if (c == 'E' || c == 'e') {
  1364. 02601                 int     exp1 = 0;
  1365. 02602                 int     sign = 1;
  1366. 02603                 int     exp_overflow = 0;
  1367. 02604
  1368. 02605                 switch(*s) {
  1369. 02606                 case '-':
  1370. 02607                         sign = -1;
  1371. 02608                 case '+':
  1372. 02609                         s++;
  1373. 02610                 }
  1374. 02611                 if (c = *s, isdigit(c)) {
  1375. 02612                         do {
  1376. 02613                                 int tmp;
  1377. 02614
  1378. 02615                                 exp1 = 10 * exp1 + (c - '0');
  1379. 02616                                 if ((tmp = sign * exp1 + exp) > MAX_EXP ||
  1380. 02617                                      tmp < -MAX_EXP) {
  1381. 02618                                         exp_overflow = 1;
  1382. 02619                                 }
  1383. 02620                         } while (c = *++s, isdigit(c));
  1384. 02621                         if (ss) *ss = (char *)s;
  1385. 02622                 }
  1386. 02623                 exp += sign * exp1;
  1387. 02624                 if (exp_overflow) {
  1388. 02625                         exp = sign * MAX_EXP;
  1389. 02626                         if (e->m1 != 0 || e->m2 != 0) errno = ERANGE;
  1390. 02627                 }
  1391. 02628         }
  1392. 02629         if (e->m1 == 0 && e->m2 == 0) return;
  1393. 02630         e->exp = 63;
  1394. 02631         while (! (e->m1 & 0x80000000)) {
  1395. 02632                 b64_sft(&(e->mantissa),-1);
  1396. 02633                 e->exp--;
  1397. 02634         }
  1398. 02635         add_exponent(e, exp);
  1399. 02636 }
  1400. 02638 #include        <math.h>
  1401. 02639
  1402. 02640 static
  1403. 02641 ten_mult(struct EXTEND *e)
  1404. 02642 {
  1405. 02643         struct EXTEND e1 = *e;
  1406. 02644
  1407. 02645         e1.exp++;
  1408. 02646         e->exp += 3;
  1409. 02647         add_ext(e, &e1, e);
  1410. 02648 }
  1411. 02650 #define NDIGITS 128
  1412. 02651 #define NSIGNIFICANT 19
  1413. 02652
  1414. 02653 char *
  1415. 02654 _ext_str_cvt(struct EXTEND *e, int ndigit, int *decpt, int *sign, int ecvtflag)
  1416. 02655 {
  1417. 02656         /*      Like cvt(), but for extended precision */
  1418. 02657
  1419. 02658         static char buf[NDIGITS+1];
  1420. 02659         struct EXTEND m;
  1421. 02660         register char *p = buf;
  1422. 02661         register char *pe;
  1423. 02662         int findex = 0;
  1424. 02663
  1425. 02664         if (ndigit < 0) ndigit = 0;
  1426. 02665         if (ndigit > NDIGITS) ndigit = NDIGITS;
  1427. 02666         pe = &buf[ndigit];
  1428. 02667         buf[0] = '';
  1429. 02668
  1430. 02669         *sign = 0;
  1431. 02670         if (e->sign) {
  1432. 02671                 *sign = 1;
  1433. 02672                 e->sign = 0;
  1434. 02673         }
  1435. 02674
  1436. 02675         *decpt = 0;
  1437. 02676         if (e->m1 != 0) {
  1438. 02677                 register struct EXTEND *pp = &big_ten_powers[1];
  1439. 02678
  1440. 02679                 while(cmp_ext(e,pp) >= 0) {
  1441. 02680                         pp++;
  1442. 02681                         findex = pp - big_ten_powers;
  1443. 02682                         if (findex >= BTP) break;
  1444. 02683                 }
  1445. 02684                 pp--;
  1446. 02685                 findex = pp - big_ten_powers;
  1447. 02686                 mul_ext(e,&r_big_ten_powers[findex],e);
  1448. 02687                 *decpt += findex * TP;
  1449. 02688                 pp = &ten_powers[1];
  1450. 02689                 while(pp < &ten_powers[TP] && cmp_ext(e, pp) >= 0) pp++;
  1451. 02690                 pp--;
  1452. 02691                 findex = pp - ten_powers;
  1453. 02692                 *decpt += findex;
  1454. 02693
  1455. 02694                 if (cmp_ext(e, &ten_powers[0]) < 0) {
  1456. 02695                         pp = &r_big_ten_powers[1];
  1457. 02696                         while(cmp_ext(e,pp) < 0) pp++;
  1458. 02697                         pp--;
  1459. 02698                         findex = pp - r_big_ten_powers;
  1460. 02699                         mul_ext(e, &big_ten_powers[findex], e);
  1461. 02700                         *decpt -= findex * TP;
  1462. 02701                         /* here, value >= 10 ** -28 */
  1463. 02702                         ten_mult(e);
  1464. 02703                         (*decpt)--;
  1465. 02704                         pp = &r_ten_powers[0];
  1466. 02705                         while(cmp_ext(e, pp) < 0) pp++;
  1467. 02706                         findex = pp - r_ten_powers;
  1468. 02707                         mul_ext(e, &ten_powers[findex], e);
  1469. 02708                         *decpt -= findex;
  1470. 02709                         findex = 0;
  1471. 02710                 }
  1472. 02711                 (*decpt)++;     /* because now value in [1.0, 10.0) */
  1473. 02712         }
  1474. 02713         if (! ecvtflag) {
  1475. 02714                 /* for fcvt() we need ndigit digits behind the dot */
  1476. 02715                 pe += *decpt;
  1477. 02716                 if (pe > &buf[NDIGITS]) pe = &buf[NDIGITS];
  1478. 02717         }
  1479. 02718         m.exp = -62;
  1480. 02719         m.sign = 0;
  1481. 02720         m.m1 = 0xA0000000;
  1482. 02721         m.m2 = 0;
  1483. 02722         while (p <= pe) {
  1484. 02723                 struct EXTEND oneminm;
  1485. 02724
  1486. 02725                 if (p - pe > NSIGNIFICANT) {
  1487. 02726                         findex = 0;
  1488. 02727                         e->m1 = 0;
  1489. 02728                 }
  1490. 02729                 if (findex) {
  1491. 02730                         struct EXTEND tc, oldtc;
  1492. 02731                         int count = 0;
  1493. 02732
  1494. 02733                         oldtc.exp = 0;
  1495. 02734                         oldtc.sign = 0;
  1496. 02735                         oldtc.m1 = 0;
  1497. 02736                         oldtc.m2 = 0;
  1498. 02737                         tc = ten_powers[findex];
  1499. 02738                         while (cmp_ext(e, &tc) >= 0) {
  1500. 02739                                 oldtc = tc;
  1501. 02740                                 add_ext(&tc, &ten_powers[findex], &tc);
  1502. 02741                                 count++;
  1503. 02742                         }
  1504. 02743                         *p++ = count + '0';
  1505. 02744                         oldtc.sign = 1;
  1506. 02745                         add_ext(e, &oldtc, e);
  1507. 02746                         findex--;
  1508. 02747                         continue;
  1509. 02748                 }
  1510. 02749                 if (e->m1) {
  1511. 02750                         m.sign = 1;
  1512. 02751                         add_ext(&ten_powers[0], &m, &oneminm);
  1513. 02752                         m.sign = 0;
  1514. 02753                         if (e->exp >= 0) {
  1515. 02754                                 struct EXTEND x;
  1516. 02755
  1517. 02756                                 x.m2 = 0; x.exp = e->exp;
  1518. 02757                                 x.sign = 1;
  1519. 02758                                 x.m1 = e->m1>>(31-e->exp);
  1520. 02759                                 *p++ = (x.m1) + '0';
  1521. 02760                                 x.m1 = x.m1 << (31-e->exp);
  1522. 02761                                 add_ext(e, &x, e);
  1523. 02762                         }
  1524. 02763                         else *p++ = '0';
  1525. 02764                         /* Check that remainder is still significant */
  1526. 02765                         if (cmp_ext(&m, e) > 0 || cmp_ext(e, &oneminm) > 0) {
  1527. 02766                                 if (e->m1 && e->exp >= -1) *(p-1) += 1;
  1528. 02767                                 e->m1 = 0;
  1529. 02768                                 continue;
  1530. 02769                         }
  1531. 02770                         ten_mult(&m);
  1532. 02771                         ten_mult(e);
  1533. 02772                 }
  1534. 02773                 else *p++ = '0';
  1535. 02774         }
  1536. 02775         if (pe >= buf) {
  1537. 02776                 p = pe;
  1538. 02777                 *p += 5;        /* round of at the end */
  1539. 02778                 while (*p > '9') {
  1540. 02779                         *p = '0';
  1541. 02780                         if (p > buf) ++*--p;
  1542. 02781                         else {
  1543. 02782                                 *p = '1';
  1544. 02783                                 ++*decpt;
  1545. 02784                                 if (! ecvtflag) {
  1546. 02785                                         /* maybe add another digit at the end,
  1547. 02786                                            because the point was shifted right
  1548. 02787                                         */
  1549. 02788                                         if (pe > buf) *pe = '0';
  1550. 02789                                         pe++;
  1551. 02790                                 }
  1552. 02791                         }
  1553. 02792                 }
  1554. 02793                 *pe = '';
  1555. 02794         }
  1556. 02795         return buf;
  1557. 02796 }
  1558. 02798 _dbl_ext_cvt(double value, struct EXTEND *e)
  1559. 02799 {
  1560. 02800         /*      Convert double to extended
  1561. 02801         */
  1562. 02802         int exponent;
  1563. 02803
  1564. 02804         value = frexp(value, &exponent);
  1565. 02805         e->sign = value < 0.0;
  1566. 02806         if (e->sign) value = -value;
  1567. 02807         e->exp = exponent - 1;
  1568. 02808         value *= 4294967296.0;
  1569. 02809         e->m1 = value;
  1570. 02810         value -= e->m1;
  1571. 02811         value *= 4294967296.0;
  1572. 02812         e->m2 = value;
  1573. 02813 }
  1574. 02815 static struct EXTEND max_d;
  1575. 02816
  1576. 02817 double
  1577. 02818 _ext_dbl_cvt(struct EXTEND *e)
  1578. 02819 {
  1579. 02820         /*      Convert extended to double
  1580. 02821         */
  1581. 02822         double f;
  1582. 02823         int sign = e->sign;
  1583. 02824
  1584. 02825         e->sign = 0;
  1585. 02826         if (e->m1 == 0 && e->m2 == 0) {
  1586. 02827                 return 0.0;
  1587. 02828         }
  1588. 02829         if (max_d.exp == 0) {
  1589. 02830                 _dbl_ext_cvt(DBL_MAX, &max_d);
  1590. 02831         }
  1591. 02832         if (cmp_ext(&max_d, e) < 0) {
  1592. 02833                 f = HUGE_VAL;
  1593. 02834                 errno = ERANGE;
  1594. 02835         }
  1595. 02836         else    f = ldexp((double)e->m1*4294967296.0 + (double)e->m2, e->exp-63);
  1596. 02837         if (sign) f = -f;
  1597. 02838         if (f == 0.0 && (e->m1 != 0 || e->m2 != 0)) {
  1598. 02839                 errno = ERANGE;
  1599. 02840         }
  1600. 02841         return f;
  1601. 02842 }
  1602. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1603. src/lib/ansi/getenv.c    
  1604. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1605. 02900 /*
  1606. 02901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  1607. 02902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  1608. 02903  */
  1609. 02904 /* $Header: getenv.c,v 1.4 91/04/24 12:18:03 ceriel Exp $ */
  1610. 02905
  1611. 02906 #include        <stdlib.h>
  1612. 02907
  1613. 02908 extern const char **_penvp;
  1614. 02909
  1615. 02910 char *
  1616. 02911 getenv(const char *name)
  1617. 02912 {
  1618. 02913         register const char **v = _penvp;
  1619. 02914         register const char *p, *q;
  1620. 02915
  1621. 02916         if (v == NULL || name == NULL)
  1622. 02917                 return (char *)NULL;
  1623. 02918         while ((p = *v++) != NULL) {
  1624. 02919                 q = name;
  1625. 02920                 while (*q && (*q == *p++))
  1626. 02921                         q++;
  1627. 02922                 if (*q || (*p != '='))
  1628. 02923                         continue;
  1629. 02924                 return (char *)p + 1;
  1630. 02925         }
  1631. 02926         return (char *)NULL;
  1632. 02927 }
  1633. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1634. src/lib/ansi/gmtime.c    
  1635. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1636. 03000 /*
  1637. 03001  * gmtime - convert the calendar time into broken down time
  1638. 03002  */
  1639. 03003 /* $Header: gmtime.c,v 1.4 91/04/22 13:20:27 ceriel Exp $ */
  1640. 03004
  1641. 03005 #include        <time.h>
  1642. 03006 #include        <limits.h>
  1643. 03007 #include        "loc_time.h"
  1644. 03008
  1645. 03009 struct tm *
  1646. 03010 gmtime(register const time_t *timer)
  1647. 03011 {
  1648. 03012         static struct tm br_time;
  1649. 03013         register struct tm *timep = &br_time;
  1650. 03014         time_t time = *timer;
  1651. 03015         register unsigned long dayclock, dayno;
  1652. 03016         int year = EPOCH_YR;
  1653. 03017
  1654. 03018         dayclock = (unsigned long)time % SECS_DAY;
  1655. 03019         dayno = (unsigned long)time / SECS_DAY;
  1656. 03020
  1657. 03021         timep->tm_sec = dayclock % 60;
  1658. 03022         timep->tm_min = (dayclock % 3600) / 60;
  1659. 03023         timep->tm_hour = dayclock / 3600;
  1660. 03024         timep->tm_wday = (dayno + 4) % 7;       /* day 0 was a thursday */
  1661. 03025         while (dayno >= YEARSIZE(year)) {
  1662. 03026                 dayno -= YEARSIZE(year);
  1663. 03027                 year++;
  1664. 03028         }
  1665. 03029         timep->tm_year = year - YEAR0;
  1666. 03030         timep->tm_yday = dayno;
  1667. 03031         timep->tm_mon = 0;
  1668. 03032         while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) {
  1669. 03033                 dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon];
  1670. 03034                 timep->tm_mon++;
  1671. 03035         }
  1672. 03036         timep->tm_mday = dayno + 1;
  1673. 03037         timep->tm_isdst = 0;
  1674. 03038
  1675. 03039         return timep;
  1676. 03040 }
  1677. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1678. src/lib/ansi/isalnum.c    
  1679. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1680. 03100 #include        <ctype.h>
  1681. 03101
  1682. 03102 int (isalnum)(int c) {
  1683. 03103         return isalnum(c);
  1684. 03104 }
  1685. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1686. src/lib/ansi/isalpha.c    
  1687. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1688. 03200 #include        <ctype.h>
  1689. 03201
  1690. 03202 int (isalpha)(int c) {
  1691. 03203         return isalpha(c);
  1692. 03204 }
  1693. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1694. src/lib/ansi/isascii.c    
  1695. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1696. 03300 #include        <ctype.h>
  1697. 03301
  1698. 03302 int (isascii)(int c) {
  1699. 03303         return isascii(c);
  1700. 03304 }
  1701. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1702. src/lib/ansi/iscntrl.c    
  1703. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1704. 03400 #include        <ctype.h>
  1705. 03401
  1706. 03402 int (iscntrl)(int c) {
  1707. 03403         return iscntrl(c);
  1708. 03404 }
  1709. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1710. src/lib/ansi/isdigit.c    
  1711. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1712. 03500 #include        <ctype.h>
  1713. 03501
  1714. 03502 int (isdigit)(int c) {
  1715. 03503         return isdigit(c);
  1716. 03504 }
  1717. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1718. src/lib/ansi/isgraph.c    
  1719. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1720. 03600 #include        <ctype.h>
  1721. 03601
  1722. 03602 int (isgraph)(int c) {
  1723. 03603         return isgraph(c);
  1724. 03604 }
  1725. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1726. src/lib/ansi/islower.c    
  1727. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1728. 03700 #include        <ctype.h>
  1729. 03701
  1730. 03702 int (islower)(int c) {
  1731. 03703         return islower(c);
  1732. 03704 }
  1733. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1734. src/lib/ansi/isprint.c    
  1735. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1736. 03800 #include        <ctype.h>
  1737. 03801
  1738. 03802 int (isprint)(int c) {
  1739. 03803         return isprint(c);
  1740. 03804 }
  1741. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1742. src/lib/ansi/ispunct.c    
  1743. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1744. 03900 #include        <ctype.h>
  1745. 03901
  1746. 03902 int (ispunct)(int c) {
  1747. 03903         return ispunct(c);
  1748. 03904 }
  1749. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1750. src/lib/ansi/isspace.c    
  1751. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1752. 04000 #include        <ctype.h>
  1753. 04001
  1754. 04002 int (isspace)(int c) {
  1755. 04003         return isspace(c);
  1756. 04004 }
  1757. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1758. src/lib/ansi/isupper.c    
  1759. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1760. 04100 #include        <ctype.h>
  1761. 04101
  1762. 04102 int (isupper)(int c) {
  1763. 04103         return isupper(c);
  1764. 04104 }
  1765. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1766. src/lib/ansi/isxdigit.c    
  1767. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1768. 04200 #include        <ctype.h>
  1769. 04201
  1770. 04202 int (isxdigit)(int c) {
  1771. 04203         return isxdigit(c);
  1772. 04204 }
  1773. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1774. src/lib/ansi/labs.c    
  1775. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1776. 04300 /*
  1777. 04301  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  1778. 04302  * See the copyright notice in the ACK home directory, in the file "Copyright".
  1779. 04303  */
  1780. 04304 /* $Header: labs.c,v 1.1 89/05/16 13:08:11 eck Exp $ */
  1781. 04305
  1782. 04306 #include        <stdlib.h>
  1783. 04307
  1784. 04308 long
  1785. 04309 labs(register long l)
  1786. 04310 {
  1787. 04311         return l >= 0 ? l : -l;
  1788. 04312 }
  1789. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1790. src/lib/ansi/ldiv.c    
  1791. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1792. 04400 /*
  1793. 04401  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  1794. 04402  * See the copyright notice in the ACK home directory, in the file "Copyright".
  1795. 04403  */
  1796. 04404 /* $Header: ldiv.c,v 1.3 90/03/05 13:48:03 eck Exp $ */
  1797. 04405
  1798. 04406 #include        <stdlib.h>
  1799. 04407
  1800. 04408 static long tmp = -1;
  1801. 04409
  1802. 04410 ldiv_t
  1803. 04411 ldiv(register long numer, register long denom)
  1804. 04412 {
  1805. 04413         ldiv_t r;
  1806. 04414
  1807. 04415         /* The assignment of tmp should not be optimized !! */
  1808. 04416         if (tmp == -1) {
  1809. 04417                 tmp = (tmp / 2 == 0);
  1810. 04418         }
  1811. 04419         if (numer == 0) {
  1812. 04420                 r.quot = numer / denom;         /* might trap if denom == 0 */
  1813. 04421                 r.rem = numer % denom;
  1814. 04422         } else if ( !tmp && ((numer < 0) != (denom < 0))) {
  1815. 04423                 r.quot = (numer / denom) + 1;
  1816. 04424                 r.rem = numer - (numer / denom + 1) * denom;
  1817. 04425         } else {
  1818. 04426                 r.quot = numer / denom;
  1819. 04427                 r.rem = numer % denom;
  1820. 04428         }
  1821. 04429         return r;
  1822. 04430 }
  1823. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1824. src/lib/ansi/localeconv.c    
  1825. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1826. 04500 /*
  1827. 04501  * localeconv - set components of a struct according to current locale
  1828. 04502  */
  1829. 04503 /* $Header: localeconv.c,v 1.2 89/12/18 15:48:58 eck Exp $ */
  1830. 04504
  1831. 04505 #include        <limits.h>
  1832. 04506 #include        <locale.h>
  1833. 04507
  1834. 04508 extern struct lconv _lc;
  1835. 04509
  1836. 04510 struct lconv *
  1837. 04511 localeconv(void)
  1838. 04512 {
  1839. 04513         register struct lconv *lcp = &_lc;
  1840. 04514
  1841. 04515         lcp->decimal_point = ".";
  1842. 04516         lcp->thousands_sep = "";
  1843. 04517         lcp->grouping = "";
  1844. 04518         lcp->int_curr_symbol = "";
  1845. 04519         lcp->currency_symbol = "";
  1846. 04520         lcp->mon_decimal_point = "";
  1847. 04521         lcp->mon_thousands_sep = "";
  1848. 04522         lcp->mon_grouping = "";
  1849. 04523         lcp->positive_sign = "";
  1850. 04524         lcp->negative_sign = "";
  1851. 04525         lcp->int_frac_digits = CHAR_MAX;
  1852. 04526         lcp->frac_digits = CHAR_MAX;
  1853. 04527         lcp->p_cs_precedes = CHAR_MAX;
  1854. 04528         lcp->p_sep_by_space = CHAR_MAX;
  1855. 04529         lcp->n_cs_precedes = CHAR_MAX;
  1856. 04530         lcp->n_sep_by_space = CHAR_MAX;
  1857. 04531         lcp->p_sign_posn = CHAR_MAX;
  1858. 04532         lcp->n_sign_posn = CHAR_MAX;
  1859. 04533
  1860. 04534         return lcp;
  1861. 04535 }
  1862. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1863. src/lib/ansi/localtime.c    
  1864. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1865. 04600 /*
  1866. 04601  * localtime - convert a calendar time into broken down time
  1867. 04602  */
  1868. 04603 /* $Header: localtime.c,v 1.3 91/04/22 13:20:36 ceriel Exp $ */
  1869. 04604
  1870. 04605 #include        <time.h>
  1871. 04606 #include        "loc_time.h"
  1872. 04607
  1873. 04608 /* We must be careful, since an int can't represent all the seconds in a day.
  1874. 04609  * Hence the adjustment of minutes when adding timezone and dst information.
  1875. 04610  * This assumes that both must be expressable in multiples of a minute.
  1876. 04611  * Furthermore, it is assumed that both fit into an integer when expressed as
  1877. 04612  * minutes (this is about 22 days, so this should not cause any problems). 
  1878. 04613  */
  1879. 04614 struct tm *
  1880. 04615 localtime(const time_t *timer)
  1881. 04616 {
  1882. 04617         struct tm *timep;
  1883. 04618         unsigned dst;
  1884. 04619
  1885. 04620         _tzset();
  1886. 04621         timep = gmtime(timer);                  /* tm->tm_isdst == 0 */
  1887. 04622         timep->tm_min -= _timezone / 60;
  1888. 04623         timep->tm_sec -= _timezone % 60;
  1889. 04624         mktime(timep);
  1890. 04625
  1891. 04626         dst = _dstget(timep);
  1892. 04627         if (dst) {
  1893. 04628                 timep->tm_min += dst / 60;
  1894. 04629                 timep->tm_sec += dst % 60;
  1895. 04630                 mktime(timep);
  1896. 04631         }
  1897. 04632         return timep;
  1898. 04633 }
  1899. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1900. src/lib/ansi/malloc.c    
  1901. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1902. 04700 /* $Header$ */
  1903. 04701
  1904. 04702 /* replace undef by define */
  1905. 04703 #undef   DEBUG          /* check assertions */
  1906. 04704 #undef   SLOWDEBUG      /* some extra test loops (requires DEBUG) */
  1907. 04705
  1908. 04706 #include        <stdlib.h>
  1909. 04707 #include        <string.h>
  1910. 04708 #include        <errno.h>
  1911. 04709
  1912. 04710 #ifdef DEBUG
  1913. 04711 #define ASSERT(b)       if (!(b)) assert_failed();
  1914. 04712 #else
  1915. 04713 #define ASSERT(b)       /* empty */
  1916. 04714 #endif
  1917. 04715
  1918. 04716 #if _EM_WSIZE == _EM_PSIZE
  1919. 04717 #define ptrint          int
  1920. 04718 #else
  1921. 04719 #define ptrint          long
  1922. 04720 #endif
  1923. 04721
  1924. 04722 #if     _EM_PSIZE == 2
  1925. 04723 #define BRKSIZE         1024
  1926. 04724 #else
  1927. 04725 #define BRKSIZE         4096
  1928. 04726 #endif
  1929. 04727 #define PTRSIZE         ((int) sizeof(void *))
  1930. 04728 #define Align(x,a)      (((x) + (a - 1)) & ~(a - 1))
  1931. 04729 #define NextSlot(p)     (* (void **) ((p) - PTRSIZE))
  1932. 04730 #define NextFree(p)     (* (void **) (p))
  1933. 04731
  1934. 04732 /*
  1935. 04733  * A short explanation of the data structure and algorithms.
  1936. 04734  * An area returned by malloc() is called a slot. Each slot
  1937. 04735  * contains the number of bytes requested, but preceeded by
  1938. 04736  * an extra pointer to the next the slot in memory.
  1939. 04737  * '_bottom' and '_top' point to the first/last slot.
  1940. 04738  * More memory is asked for using brk() and appended to top.
  1941. 04739  * The list of free slots is maintained to keep malloc() fast.
  1942. 04740  * '_empty' points the the first free slot. Free slots are
  1943. 04741  * linked together by a pointer at the start of the
  1944. 04742  * user visable part, so just after the next-slot pointer.
  1945. 04743  * Free slots are merged together by free().
  1946. 04744  */
  1947. 04745
  1948. 04746 extern void *_sbrk(int);
  1949. 04747 extern int _brk(void *);
  1950. 04748 static void *_bottom, *_top, *_empty;
  1951. 04749
  1952. 04750 static int grow(size_t len)
  1953. 04751 {
  1954. 04752   register char *p;
  1955. 04753
  1956. 04754   ASSERT(NextSlot((char *)_top) == 0);
  1957. 04755   errno = ENOMEM;
  1958. 04756   if ((char *) _top + len < (char *) _top
  1959. 04757       || (p = (char *)Align((ptrint)_top + len, BRKSIZE)) < (char *) _top 
  1960. 04758       || _brk(p) != 0)
  1961. 04759         return(0);
  1962. 04760   NextSlot((char *)_top) = p;
  1963. 04761   NextSlot(p) = 0;
  1964. 04762   free(_top);
  1965. 04763   _top = p;
  1966. 04764   return 1;
  1967. 04765 }
  1968. 04767 void *
  1969. 04768 malloc(size_t size)
  1970. 04769 {
  1971. 04770   register char *prev, *p, *next, *new;
  1972. 04771   register unsigned len, ntries;
  1973. 04772
  1974. 04773   if (size == 0) return NULL;
  1975. 04774   errno = ENOMEM;
  1976. 04775   for (ntries = 0; ntries < 2; ntries++) {
  1977. 04776         if ((len = Align(size, PTRSIZE) + PTRSIZE) < 2 * PTRSIZE)
  1978. 04777                 return NULL;
  1979. 04778         if (_bottom == 0) {
  1980. 04779                 if ((p = _sbrk(2 * PTRSIZE)) == (char *) -1)
  1981. 04780                         return NULL;
  1982. 04781                 p = (char *) Align((ptrint)p, PTRSIZE);
  1983. 04782                 p += PTRSIZE;
  1984. 04783                 _top = _bottom = p;
  1985. 04784                 NextSlot(p) = 0;
  1986. 04785         }
  1987. 04786 #ifdef SLOWDEBUG
  1988. 04787         for (p = _bottom; (next = NextSlot(p)) != 0; p = next)
  1989. 04788                 ASSERT(next > p);
  1990. 04789         ASSERT(p == _top);
  1991. 04790 #endif
  1992. 04791         for (prev = 0, p = _empty; p != 0; prev = p, p = NextFree(p)) {
  1993. 04792                 next = NextSlot(p);
  1994. 04793                 new = p + len;  /* easily overflows!! */
  1995. 04794                 if (new > next || new <= p)
  1996. 04795                         continue;               /* too small */
  1997. 04796                 if (new + PTRSIZE < next) {     /* too big, so split */
  1998. 04797                         /* + PTRSIZE avoids tiny slots on free list */
  1999. 04798                         NextSlot(new) = next;
  2000. 04799                         NextSlot(p) = new;
  2001. 04800                         NextFree(new) = NextFree(p);
  2002. 04801                         NextFree(p) = new;
  2003. 04802                 }
  2004. 04803                 if (prev)
  2005. 04804                         NextFree(prev) = NextFree(p);
  2006. 04805                 else
  2007. 04806                         _empty = NextFree(p);
  2008. 04807                 return p;
  2009. 04808         }
  2010. 04809         if (grow(len) == 0)
  2011. 04810                 break;
  2012. 04811   }
  2013. 04812   ASSERT(ntries != 2);
  2014. 04813   return NULL;
  2015. 04814 }
  2016. 04816 void *
  2017. 04817 realloc(void *oldp, size_t size)
  2018. 04818 {
  2019. 04819   register char *prev, *p, *next, *new;
  2020. 04820   char *old = oldp;
  2021. 04821   register size_t len, n;
  2022. 04822
  2023. 04823   if (!old) return malloc(size);
  2024. 04824   else if (!size) {
  2025. 04825         free(oldp);
  2026. 04826         return NULL;
  2027. 04827   }
  2028. 04828   len = Align(size, PTRSIZE) + PTRSIZE;
  2029. 04829   next = NextSlot(old);
  2030. 04830   n = (int)(next - old);                        /* old length */
  2031. 04831   /*
  2032. 04832    * extend old if there is any free space just behind it
  2033. 04833    */
  2034. 04834   for (prev = 0, p = _empty; p != 0; prev = p, p = NextFree(p)) {
  2035. 04835         if (p > next)
  2036. 04836                 break;
  2037. 04837         if (p == next) {        /* 'next' is a free slot: merge */
  2038. 04838                 NextSlot(old) = NextSlot(p);
  2039. 04839                 if (prev)
  2040. 04840                         NextFree(prev) = NextFree(p);
  2041. 04841                 else
  2042. 04842                         _empty = NextFree(p);
  2043. 04843                 next = NextSlot(old);
  2044. 04844                 break;
  2045. 04845         }
  2046. 04846   }
  2047. 04847   new = old + len;
  2048. 04848   /*
  2049. 04849    * Can we use the old, possibly extended slot?
  2050. 04850    */
  2051. 04851   if (new <= next && new >= old) {              /* it does fit */
  2052. 04852         if (new + PTRSIZE < next) {             /* too big, so split */
  2053. 04853                 /* + PTRSIZE avoids tiny slots on free list */
  2054. 04854                 NextSlot(new) = next;
  2055. 04855                 NextSlot(old) = new;
  2056. 04856                 free(new);
  2057. 04857         }
  2058. 04858         return old;
  2059. 04859   }
  2060. 04860   if ((new = malloc(size)) == NULL)             /* it didn't fit */
  2061. 04861         return NULL;
  2062. 04862   memcpy(new, old, n);                          /* n < size */
  2063. 04863   free(old);
  2064. 04864   return new;
  2065. 04865 }
  2066. 04867 void
  2067. 04868 free(void *ptr)
  2068. 04869 {
  2069. 04870   register char *prev, *next;
  2070. 04871   char *p = ptr;
  2071. 04872
  2072. 04873   if (!p) return;
  2073. 04874
  2074. 04875   ASSERT(NextSlot(p) > p);
  2075. 04876   for (prev = 0, next = _empty; next != 0; prev = next, next = NextFree(next))
  2076. 04877         if (p < next)
  2077. 04878                 break;
  2078. 04879   NextFree(p) = next;
  2079. 04880   if (prev)
  2080. 04881         NextFree(prev) = p;
  2081. 04882   else
  2082. 04883         _empty = p;
  2083. 04884   if (next) {
  2084. 04885         ASSERT(NextSlot(p) <= next);
  2085. 04886         if (NextSlot(p) == next) {              /* merge p and next */
  2086. 04887                 NextSlot(p) = NextSlot(next);
  2087. 04888                 NextFree(p) = NextFree(next);
  2088. 04889         }
  2089. 04890   }
  2090. 04891   if (prev) {
  2091. 04892         ASSERT(NextSlot(prev) <= p);
  2092. 04893         if (NextSlot(prev) == p) {              /* merge prev and p */
  2093. 04894                 NextSlot(prev) = NextSlot(p);
  2094. 04895                 NextFree(prev) = NextFree(p);
  2095. 04896         }
  2096. 04897   }
  2097. 04898 }
  2098. 04900 #ifdef DEBUG
  2099. 04901 static assert_failed()
  2100. 04902 {
  2101. 04903         write(2, "assert failed in lib/malloc.cn", 30);
  2102. 04904         abort();
  2103. 04905 }
  2104. 04906 #endif
  2105. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2106. src/lib/ansi/mblen.c    
  2107. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2108. 05000 /*
  2109. 05001  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2110. 05002  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2111. 05003  */
  2112. 05004 /* $Header: mblen.c,v 1.2 89/12/18 15:12:50 eck Exp $ */
  2113. 05005
  2114. 05006 #include        <stdlib.h>
  2115. 05007 #include        <limits.h>
  2116. 05008
  2117. 05009 #define CHAR_SHIFT      8
  2118. 05010
  2119. 05011 int
  2120. 05012 mblen(const char *s, size_t n)
  2121. 05013 {
  2122. 05014         if (s == (const char *)NULL) return 0;  /* no state dependent codings */
  2123. 05015         if (n <= 0) return 0;
  2124. 05016         return (*s != 0);
  2125. 05017 }
  2126. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2127. src/lib/ansi/mbstowcs.c    
  2128. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2129. 05100 /*
  2130. 05101  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2131. 05102  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2132. 05103  */
  2133. 05104 /* $Header: mbstowcs.c,v 1.2 89/12/18 15:12:59 eck Exp $ */
  2134. 05105
  2135. 05106 #include        <stdlib.h>
  2136. 05107
  2137. 05108 size_t
  2138. 05109 mbstowcs(register wchar_t *pwcs, register const char *s, size_t n)
  2139. 05110 {
  2140. 05111         register int i = n;
  2141. 05112
  2142. 05113         while (--i >= 0) {
  2143. 05114                 if (!(*pwcs++ = *s++))
  2144. 05115                         return n - i - 1;
  2145. 05116         }
  2146. 05117         return n - i;
  2147. 05118 }
  2148. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2149. src/lib/ansi/mbtowc.c    
  2150. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2151. 05200 /*
  2152. 05201  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2153. 05202  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2154. 05203  */
  2155. 05204 /* $Header: mbtowc.c,v 1.3 90/03/28 16:36:45 eck Exp $ */
  2156. 05205
  2157. 05206 #include        <stdlib.h>
  2158. 05207 #include        <limits.h>
  2159. 05208
  2160. 05209 int
  2161. 05210 mbtowc(wchar_t *pwc, register const char *s, size_t n)
  2162. 05211 {
  2163. 05212         if (s == (const char *)NULL) return 0;
  2164. 05213         if (n <= 0) return 0;
  2165. 05214         if (pwc) *pwc = *s;
  2166. 05215         return (*s != 0);
  2167. 05216 }
  2168. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2169. src/lib/ansi/memchr.c    
  2170. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2171. 05300 /*
  2172. 05301  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2173. 05302  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2174. 05303  */
  2175. 05304 /* $Header: memchr.c,v 1.3 90/08/28 13:52:11 eck Exp $ */
  2176. 05305
  2177. 05306 #include        <string.h>
  2178. 05307
  2179. 05308 void *
  2180. 05309 memchr(const void *s, register int c, register size_t n)
  2181. 05310 {
  2182. 05311         register const unsigned char *s1 = s;
  2183. 05312
  2184. 05313         c = (unsigned char) c;
  2185. 05314         if (n) {
  2186. 05315                 n++;
  2187. 05316                 while (--n > 0) {
  2188. 05317                         if (*s1++ != c) continue;
  2189. 05318                         return (void *) --s1;
  2190. 05319                 }
  2191. 05320         }
  2192. 05321         return NULL;
  2193. 05322 }
  2194. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2195. src/lib/ansi/memcmp.c    
  2196. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2197. 05400 /*
  2198. 05401  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2199. 05402  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2200. 05403  */
  2201. 05404 /* $Id: memcmp.c,v 1.6 1994/06/24 11:56:26 ceriel Exp $ */
  2202. 05405
  2203. 05406 #include        <string.h>
  2204. 05407
  2205. 05408 int
  2206. 05409 memcmp(const void *s1, const void *s2, size_t n)
  2207. 05410 {
  2208. 05411         register const unsigned char *p1 = s1, *p2 = s2;
  2209. 05412
  2210. 05413         if (n) {
  2211. 05414                 n++;
  2212. 05415                 while (--n > 0) {
  2213. 05416                         if (*p1++ == *p2++) continue;
  2214. 05417                         return *--p1 - *--p2;
  2215. 05418                 }
  2216. 05419         }
  2217. 05420         return 0;
  2218. 05421 }
  2219. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2220. src/lib/ansi/memcpy.c    
  2221. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2222. 05500 /*
  2223. 05501  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2224. 05502  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2225. 05503  */
  2226. 05504 /* $Header: memcpy.c,v 1.4 90/08/28 13:52:31 eck Exp $ */
  2227. 05505
  2228. 05506 #include        <string.h>
  2229. 05507
  2230. 05508 void *
  2231. 05509 memcpy(void *s1, const void *s2, register size_t n)
  2232. 05510 {
  2233. 05511         register char *p1 = s1;
  2234. 05512         register const char *p2 = s2;
  2235. 05513
  2236. 05514
  2237. 05515         if (n) {
  2238. 05516                 n++;
  2239. 05517                 while (--n > 0) {
  2240. 05518                         *p1++ = *p2++;
  2241. 05519                 }
  2242. 05520         }
  2243. 05521         return s1;
  2244. 05522 }
  2245. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2246. src/lib/ansi/memmove.c    
  2247. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2248. 05600 /*
  2249. 05601  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2250. 05602  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2251. 05603  */
  2252. 05604 /* $Header: memmove.c,v 1.3 90/08/28 13:52:42 eck Exp $ */
  2253. 05605
  2254. 05606 #include        <string.h>
  2255. 05607
  2256. 05608 void *
  2257. 05609 memmove(void *s1, const void *s2, register size_t n)
  2258. 05610 {
  2259. 05611         register char *p1 = s1;
  2260. 05612         register const char *p2 = s2;
  2261. 05613
  2262. 05614         if (n>0) {
  2263. 05615                 if (p2 <= p1 && p2 + n > p1) {
  2264. 05616                         /* overlap, copy backwards */
  2265. 05617                         p1 += n;
  2266. 05618                         p2 += n;
  2267. 05619                         n++;
  2268. 05620                         while (--n > 0) {
  2269. 05621                                 *--p1 = *--p2;
  2270. 05622                         }
  2271. 05623                 } else {
  2272. 05624                         n++;
  2273. 05625                         while (--n > 0) {
  2274. 05626                                 *p1++ = *p2++;
  2275. 05627                         }
  2276. 05628                 }
  2277. 05629         }
  2278. 05630         return s1;
  2279. 05631 }
  2280. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2281. src/lib/ansi/memset.c    
  2282. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2283. 05700 /*
  2284. 05701  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2285. 05702  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2286. 05703  */
  2287. 05704 /* $Header: memset.c,v 1.3 90/08/28 13:52:54 eck Exp $ */
  2288. 05705
  2289. 05706 #include        <string.h>
  2290. 05707
  2291. 05708 void *
  2292. 05709 memset(void *s, register int c, register size_t n)
  2293. 05710 {
  2294. 05711         register char *s1 = s;
  2295. 05712
  2296. 05713         if (n>0) {
  2297. 05714                 n++;
  2298. 05715                 while (--n > 0) {
  2299. 05716                         *s1++ = c;
  2300. 05717                 }
  2301. 05718         }
  2302. 05719         return s;
  2303. 05720 }
  2304. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2305. src/lib/ansi/misc.c    
  2306. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2307. 05800 /*
  2308. 05801  * misc - data and miscellaneous routines
  2309. 05802  */
  2310. 05803 /* $Header: misc.c,v 1.11 91/04/22 13:20:45 ceriel Exp $ */
  2311. 05804
  2312. 05805 #include        <ctype.h>
  2313. 05806 #include        <time.h>
  2314. 05807 #include        <stdlib.h>
  2315. 05808 #include        <string.h>
  2316. 05809
  2317. 05810 #if     defined(__BSD4_2)
  2318. 05811
  2319. 05812 struct timeval {
  2320. 05813         long    tv_sec;         /* seconds */
  2321. 05814         long    tv_usec;        /* and microseconds */
  2322. 05815 };
  2323. 05816
  2324. 05817 struct timezone {
  2325. 05818         int     tz_minuteswest; /* minutes west of Greenwich */
  2326. 05819         int     tz_dsttime;     /* type of dst correction */
  2327. 05820 };
  2328. 05821
  2329. 05822 int _gettimeofday(struct timeval *tp, struct timezone *tzp);
  2330. 05823
  2331. 05824 #elif   !defined(_POSIX_SOURCE) && !defined(__USG)
  2332. 05825 #if     !defined(_MINIX)                /* MINIX has no ftime() */
  2333. 05826 struct timeb {
  2334. 05827         long    time;
  2335. 05828         unsigned short millitm;
  2336. 05829         short   timezone;
  2337. 05830         short   dstflag;
  2338. 05831 };
  2339. 05832 void _ftime(struct timeb *bp);
  2340. 05833 #endif
  2341. 05834 #endif
  2342. 05835
  2343. 05836 #include        "loc_time.h"
  2344. 05837
  2345. 05838 #define RULE_LEN        120
  2346. 05839 #define TZ_LEN          10
  2347. 05840
  2348. 05841 /* Make sure that the strings do not end up in ROM.
  2349. 05842  * These strings probably contain the wrong value, and we cannot obtain the
  2350. 05843  * right value from the system. TZ is the only help.
  2351. 05844  */
  2352. 05845 static char ntstr[TZ_LEN + 1] = "GMT";  /* string for normal time */
  2353. 05846 static char dststr[TZ_LEN + 1] = "GDT"; /* string for daylight saving */
  2354. 05847
  2355. 05848 long    _timezone = 0;
  2356. 05849 long    _dst_off = 60 * 60;
  2357. 05850 int     _daylight = 0;
  2358. 05851 char    *_tzname[2] = {ntstr, dststr};
  2359. 05852
  2360. 05853 #if     defined(__USG) || defined(_POSIX_SOURCE)
  2361. 05854 char    *tzname[2] = {ntstr, dststr};
  2362. 05855
  2363. 05856 #if     defined(__USG)
  2364. 05857 long    timezone = 0;
  2365. 05858 int     daylight = 0;
  2366. 05859 #endif
  2367. 05860 #endif
  2368. 05861
  2369. 05862 static struct dsttype {
  2370. 05863         char ds_type;           /* Unknown, Julian, Zero-based or M */
  2371. 05864         int ds_date[3];         /* months, weeks, days */
  2372. 05865         long ds_sec;            /* usually 02:00:00 */
  2373. 05866 }       dststart = { 'U', { 0, 0, 0 }, 2 * 60 * 60 }
  2374. 05867         , dstend = { 'U', { 0, 0, 0 }, 2 * 60 * 60 };
  2375. 05868
  2376. 05869 const char *_days[] = {
  2377. 05870                         "Sunday", "Monday", "Tuesday", "Wednesday",
  2378. 05871                         "Thursday", "Friday", "Saturday"
  2379. 05872                 };
  2380. 05873
  2381. 05874 const char *_months[] = {
  2382. 05875                         "January", "February", "March",
  2383. 05876                         "April", "May", "June",
  2384. 05877                         "July", "August", "September",
  2385. 05878                         "October", "November", "December"
  2386. 05879                 };
  2387. 05880
  2388. 05881 const int _ytab[2][12] = {
  2389. 05882                 { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
  2390. 05883                 { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
  2391. 05884         };
  2392. 05885
  2393. 05886 #if     !defined(_POSIX_SOURCE) && !defined(__USG)
  2394. 05887 #define USE_TABLE       1
  2395. 05888 #endif
  2396. 05889
  2397. 05890 #if     USE_TABLE
  2398. 05891 static int usetable = 1;
  2399. 05892
  2400. 05893 typedef struct table {
  2401. 05894         const char *tz_name;
  2402. 05895         const int daylight;
  2403. 05896         const long zoneoffset;
  2404. 05897 } TABLE;
  2405. 05898
  2406. 05899 #define HOUR(x) ((x) * 60*60)
  2407. 05900
  2408. 05901 static TABLE TimezoneTable[] = {
  2409. 05902         {"GMT", 0,      HOUR(0) },      /* Greenwich Mean */
  2410. 05903         {"BST", 60*60,  HOUR(0) },      /* British Summer */
  2411. 05904         {"WAT", 0,      HOUR(1) },      /* West Africa */
  2412. 05905         {"AT", 0,       HOUR(2) },      /* Azores */
  2413. 05906         {"BST", 0,      HOUR(3) },      /* Brazil Standard */
  2414. 05907         {"NFT", 0,      HOUR(3.5) },    /* Newfoundland */
  2415. 05908         {"NDT", 60*60,  HOUR(3.5) },    /* Newfoundland Daylight */
  2416. 05909         {"AST", 0,      HOUR(4) },      /* Atlantic Standard */
  2417. 05910         {"ADT", 60*60,  HOUR(4) },      /* Atlantic Daylight */
  2418. 05911         {"EST", 0,      HOUR(5) },      /* Eastern Standard */
  2419. 05912         {"EDT", 60*60,  HOUR(5) },      /* Eastern Daylight */
  2420. 05913         {"CST", 0,      HOUR(6) },      /* Central Standard */
  2421. 05914         {"CDT", 60*60,  HOUR(6) },      /* Central Daylight */
  2422. 05915         {"MST", 0,      HOUR(7) },      /* Mountain Standard */
  2423. 05916         {"MDT", 60*60,  HOUR(7) },      /* Mountain Daylight */
  2424. 05917         {"PST", 0,      HOUR(8) },      /* Pacific Standard */
  2425. 05918         {"PDT", 60*60,  HOUR(8) },      /* Pacific Daylight */
  2426. 05919         {"YST", 0,      HOUR(9) },      /* Yukon Standard */
  2427. 05920         {"YDT", 60*60,  HOUR(9) },      /* Yukon Daylight */
  2428. 05921         {"HST", 0,      HOUR(10) },     /* Hawaii Standard */
  2429. 05922         {"HDT", 60*60,  HOUR(10) },     /* Hawaii Daylight */
  2430. 05923         {"NT", 0,       HOUR(11) },     /* Nome */
  2431. 05924         {"IDLW", 0,     HOUR(12) },     /* International Date Line West */
  2432. 05925         {"MET", 0,      -HOUR(1) },     /* Middle European */
  2433. 05926         {"MDT", 60*60,  -HOUR(1) },     /* Middle European Summer */
  2434. 05927         {"EET", 0,      -HOUR(2) },     /* Eastern Europe, USSR Zone 1 */
  2435. 05928         {"BT", 0,       -HOUR(3) },     /* Baghdad, USSR Zone 2 */
  2436. 05929         {"IT", 0,       -HOUR(3.5) },   /* Iran */
  2437. 05930         {"ZP4", 0,      -HOUR(4) },     /* USSR Zone 3 */
  2438. 05931         {"ZP5", 0,      -HOUR(5) },     /* USSR Zone 4 */
  2439. 05932         {"IST", 0,      -HOUR(5.5) },   /* Indian Standard */
  2440. 05933         {"ZP6", 0,      -HOUR(6) },     /* USSR Zone 5 */
  2441. 05934         {"NST", 0,      -HOUR(6.5) },   /* North Sumatra */
  2442. 05935         {"SST", 0,      -HOUR(7) },     /* South Sumatra, USSR Zone 6 */
  2443. 05936         {"WAST", 0,     -HOUR(7) },     /* West Australian Standard */
  2444. 05937         {"WADT", 60*60, -HOUR(7) },     /* West Australian Daylight */
  2445. 05938         {"JT", 0,       -HOUR(7.5) },   /* Java (3pm in Cronusland!) */
  2446. 05939         {"CCT", 0,      -HOUR(8) },     /* China Coast, USSR Zone 7 */
  2447. 05940         {"JST", 0,      -HOUR(9) },     /* Japan Standard, USSR Zone 8 */
  2448. 05941         {"CAST", 0,     -HOUR(9.5) },   /* Central Australian Standard */
  2449. 05942         {"CADT", 60*60, -HOUR(9.5) },   /* Central Australian Daylight */
  2450. 05943         {"EAST", 0,     -HOUR(10) },    /* Eastern Australian Standard */
  2451. 05944         {"EADT", 60*60, -HOUR(10) },    /* Eastern Australian Daylight */
  2452. 05945         {"NZT", 0,      -HOUR(12) },    /* New Zealand */
  2453. 05946         {"NZDT", 60*60, -HOUR(12) },    /* New Zealand Daylight */
  2454. 05947         {  NULL, 0, 0  }
  2455. 05948 };
  2456. 05949
  2457. 05950 /*
  2458. 05951  * The function ZoneFromTable() searches the table for the current
  2459. 05952  * timezone.  It saves the last one found in ntstr or dststr, depending on
  2460. 05953  * wheter the name is for daylight-saving-time or not.
  2461. 05954  * Both ntstr and dststr are TZ_LEN + 1 chars.
  2462. 05955  */
  2463. 05956 static void
  2464. 05957 ZoneFromTable(long timezone)
  2465. 05958 {
  2466. 05959         register TABLE *tptr = TimezoneTable;
  2467. 05960
  2468. 05961         while (tptr->tz_name != NULL) {
  2469. 05962                 if (tptr->zoneoffset == timezone) {
  2470. 05963                         if (tptr->daylight == 0) {
  2471. 05964                                 strncpy(ntstr,tptr->tz_name, TZ_LEN);
  2472. 05965                                 ntstr[TZ_LEN] = '';
  2473. 05966                         } else {
  2474. 05967                                 strncpy(dststr,tptr->tz_name, TZ_LEN);
  2475. 05968                                 dststr[TZ_LEN] = '';
  2476. 05969                         }
  2477. 05970                 }
  2478. 05971                 tptr++;
  2479. 05972         }
  2480. 05973 }
  2481. 05974 #endif  /* USE_TABLE */
  2482. 05975
  2483. 05976 static const char *
  2484. 05977 parseZoneName(register char *buf, register const char *p)
  2485. 05978 {
  2486. 05979         register int n = 0;
  2487. 05980
  2488. 05981         if (*p == ':') return NULL;
  2489. 05982         while (*p && !isdigit(*p) && *p != ',' && *p != '-' && *p != '+') {
  2490. 05983                 if (n < TZ_LEN)
  2491. 05984                         *buf++ = *p;
  2492. 05985                 p++;
  2493. 05986                 n++;
  2494. 05987         }
  2495. 05988         if (n < 3) return NULL;                         /* error */
  2496. 05989         *buf = '';
  2497. 05990         return p;
  2498. 05991 }
  2499. 05993 static const char *
  2500. 05994 parseTime(register long *tm, const char *p, register struct dsttype *dst)
  2501. 05995 {
  2502. 05996         register int n = 0;
  2503. 05997         register const char *q = p;
  2504. 05998         char ds_type = (dst ? dst->ds_type : '');
  2505. 05999
  2506. 06000         if (dst) dst->ds_type = 'U';
  2507. 06001
  2508. 06002         *tm = 0;
  2509. 06003         while(*p >= '0' && *p <= '9') {
  2510. 06004                 n = 10 * n + (*p++ - '0');
  2511. 06005         }
  2512. 06006         if (q == p) return NULL;        /* "The hour shall be required" */
  2513. 06007         if (n < 0 || n >= 24)   return NULL;
  2514. 06008         *tm = n * 60 * 60;
  2515. 06009         if (*p == ':') {
  2516. 06010                 p++;
  2517. 06011                 n = 0;
  2518. 06012                 while(*p >= '0' && *p <= '9') {
  2519. 06013                         n = 10 * n + (*p++ - '0');
  2520. 06014                 }
  2521. 06015                 if (q == p) return NULL;        /* format error */
  2522. 06016                 if (n < 0 || n >= 60)   return NULL;
  2523. 06017                 *tm += n * 60;
  2524. 06018                 if (*p == ':') {
  2525. 06019                         p++;
  2526. 06020                         n = 0;
  2527. 06021                         while(*p >= '0' && *p <= '9') {
  2528. 06022                                 n = 10 * n + (*p++ - '0');
  2529. 06023                         }
  2530. 06024                         if (q == p) return NULL;        /* format error */
  2531. 06025                         if (n < 0 || n >= 60)   return NULL;
  2532. 06026                         *tm += n;
  2533. 06027                 }
  2534. 06028         }
  2535. 06029         if (dst) {
  2536. 06030                 dst->ds_type = ds_type;
  2537. 06031                 dst->ds_sec = *tm;
  2538. 06032         }
  2539. 06033         return p;
  2540. 06034 }
  2541. 06036 static const char *
  2542. 06037 parseDate(register char *buf, register const char *p, struct dsttype *dstinfo)
  2543. 06038 {
  2544. 06039         register const char *q;
  2545. 06040         register int n = 0;
  2546. 06041         int cnt = 0;
  2547. 06042         const int bnds[3][2] =  {       { 1, 12 },
  2548. 06043                                         { 1, 5 },
  2549. 06044                                         { 0, 6}
  2550. 06045                                  };
  2551. 06046         char ds_type;
  2552. 06047
  2553. 06048         if (*p != 'M') {
  2554. 06049                 if (*p == 'J') {
  2555. 06050                         *buf++ = *p++;
  2556. 06051                         ds_type = 'J';
  2557. 06052                 }
  2558. 06053                 else    ds_type = 'Z';
  2559. 06054                 q = p;
  2560. 06055                 while(*p >= '0' && *p <= '9') {
  2561. 06056                         n = 10 * n + (*p - '0');
  2562. 06057                         *buf++ = *p++;
  2563. 06058                 }
  2564. 06059                 if (q == p) return NULL;        /* format error */
  2565. 06060                 if (n < (ds_type == 'J') || n > 365) return NULL;
  2566. 06061                 dstinfo->ds_type = ds_type;
  2567. 06062                 dstinfo->ds_date[0] = n;
  2568. 06063                 return p;
  2569. 06064         }
  2570. 06065         ds_type = 'M';
  2571. 06066         do {
  2572. 06067                 *buf++ = *p++;
  2573. 06068                 q = p;
  2574. 06069                 n = 0;
  2575. 06070                 while(*p >= '0' && *p <= '9') {
  2576. 06071                         n = 10 * n + (*p - '0');
  2577. 06072                         *buf++ = *p++;
  2578. 06073                 }
  2579. 06074                 if (q == p) return NULL;        /* format error */
  2580. 06075                 if (n < bnds[cnt][0] || n > bnds[cnt][1]) return NULL;
  2581. 06076                 dstinfo->ds_date[cnt] = n;
  2582. 06077                 cnt++;
  2583. 06078         } while (cnt < 3 && *p == '.');
  2584. 06079         if (cnt != 3) return NULL;
  2585. 06080         *buf = '';
  2586. 06081         dstinfo->ds_type = ds_type;
  2587. 06082         return p;
  2588. 06083 }
  2589. 06085 static const char *
  2590. 06086 parseRule(register char *buf, register const char *p)
  2591. 06087 {
  2592. 06088         long time;
  2593. 06089         register const char *q;
  2594. 06090
  2595. 06091         if (!(p = parseDate(buf, p, &dststart))) return NULL;
  2596. 06092         buf += strlen(buf);
  2597. 06093         if (*p == '/') {
  2598. 06094                 q = ++p;
  2599. 06095                 if (!(p = parseTime(&time, p, &dststart))) return NULL;
  2600. 06096                 while( p != q) *buf++ = *q++;
  2601. 06097         }
  2602. 06098         if (*p != ',') return NULL;
  2603. 06099         p++;
  2604. 06100         if (!(p = parseDate(buf, p, &dstend))) return NULL;
  2605. 06101         buf += strlen(buf);
  2606. 06102         if (*p == '/') {
  2607. 06103                 q = ++p;
  2608. 06104                 if (!(p = parseTime(&time, p, &dstend))) return NULL;
  2609. 06105                 while(*buf++ = *q++);
  2610. 06106         }
  2611. 06107         if (*p) return NULL;
  2612. 06108         return p;
  2613. 06109 }
  2614. 06111 /* The following routine parses timezone information in POSIX-format. For
  2615. 06112  * the requirements, see IEEE Std 1003.1-1988 section 8.1.1.
  2616. 06113  * The function returns as soon as it spots an error.
  2617. 06114  */
  2618. 06115 static void
  2619. 06116 parseTZ(const char *p)
  2620. 06117 {
  2621. 06118         long tz, dst = 60 * 60, sign = 1;
  2622. 06119         static char lastTZ[2 * RULE_LEN];
  2623. 06120         static char buffer[RULE_LEN];
  2624. 06121
  2625. 06122         if (!p) return;
  2626. 06123
  2627. 06124 #if     USE_TABLE
  2628. 06125         usetable = 0;
  2629. 06126 #endif
  2630. 06127         if (*p == ':') {
  2631. 06128                 /*
  2632. 06129                  * According to POSIX, this is implementation defined.
  2633. 06130                  * Since it depends on the particular operating system, we
  2634. 06131                  * can do nothing.
  2635. 06132                  */
  2636. 06133                 return;
  2637. 06134         }
  2638. 06135
  2639. 06136         if (!strcmp(lastTZ, p)) return;         /* nothing changed */
  2640. 06137
  2641. 06138         *_tzname[0] = '';
  2642. 06139         *_tzname[1] = '';
  2643. 06140         dststart.ds_type = 'U';
  2644. 06141         dststart.ds_sec = 2 * 60 * 60;
  2645. 06142         dstend.ds_type = 'U';
  2646. 06143         dstend.ds_sec = 2 * 60 * 60;
  2647. 06144
  2648. 06145         if (strlen(p) > 2 * RULE_LEN) return;
  2649. 06146         strcpy(lastTZ, p);
  2650. 06147
  2651. 06148         if (!(p = parseZoneName(buffer, p))) return;
  2652. 06149
  2653. 06150         if (*p == '-') {
  2654. 06151                 sign = -1;
  2655. 06152                 p++;
  2656. 06153         } else if (*p == '+') p++;
  2657. 06154
  2658. 06155         if (!(p = parseTime(&tz, p, NULL))) return;
  2659. 06156         tz *= sign;
  2660. 06157         _timezone = tz;
  2661. 06158         strncpy(_tzname[0], buffer, TZ_LEN);
  2662. 06159
  2663. 06160         if (!(_daylight = (*p != ''))) return;
  2664. 06161
  2665. 06162         buffer[0] = '';
  2666. 06163         if (!(p = parseZoneName(buffer, p))) return;
  2667. 06164         strncpy(_tzname[1], buffer, TZ_LEN);
  2668. 06165
  2669. 06166         buffer[0] = '';
  2670. 06167         if (*p && (*p != ','))
  2671. 06168                 if (!(p = parseTime(&dst, p, NULL))) return;
  2672. 06169         _dst_off = dst;                 /* dst was initialized to 1 hour */
  2673. 06170         if (*p) {
  2674. 06171                 if (*p != ',') return;
  2675. 06172                 p++;
  2676. 06173                 if (strlen(p) > RULE_LEN) return;
  2677. 06174                 if (!(p = parseRule(buffer, p))) return;
  2678. 06175         }
  2679. 06176 }
  2680. 06178 void
  2681. 06179 _tzset(void)
  2682. 06180 {
  2683. 06181 #if     defined(__BSD4_2)
  2684. 06182
  2685. 06183         struct timeval tv;
  2686. 06184         struct timezone tz;
  2687. 06185
  2688. 06186         _gettimeofday(&tv, &tz);
  2689. 06187         _daylight = tz.tz_dsttime;
  2690. 06188         _timezone = tz.tz_minuteswest * 60L;
  2691. 06189
  2692. 06190 #elif   !defined(_POSIX_SOURCE) && !defined(__USG)
  2693. 06191
  2694. 06192 #if     !defined(_MINIX)                /* MINIX has no ftime() */
  2695. 06193         struct timeb time;
  2696. 06194
  2697. 06195         _ftime(&time);
  2698. 06196         _timezone = time.timezone * 60L;
  2699. 06197         _daylight = time.dstflag;
  2700. 06198 #endif
  2701. 06199
  2702. 06200 #endif  /* !_POSIX_SOURCE && !__USG */
  2703. 06201
  2704. 06202         parseTZ(getenv("TZ"));          /* should go inside #if */
  2705. 06203
  2706. 06204 #if     defined(__USG) || defined(_POSIX_SOURCE)
  2707. 06205         tzname[0] = _tzname[0];
  2708. 06206         tzname[1] = _tzname[1];
  2709. 06207 #if     defined(__USG)
  2710. 06208         timezone = _timezone;
  2711. 06209         daylight = _daylight;
  2712. 06210 #endif
  2713. 06211 #endif  /* __USG || _POSIX_SOURCE */
  2714. 06212 }
  2715. 06214 static int
  2716. 06215 last_sunday(register int day, register struct tm *timep)
  2717. 06216 {
  2718. 06217         int first = FIRSTSUNDAY(timep);
  2719. 06218
  2720. 06219         if (day >= 58 && LEAPYEAR(YEAR0 + timep->tm_year)) day++;
  2721. 06220         if (day < first) return first;
  2722. 06221         return day - (day - first) % 7;
  2723. 06222 }
  2724. 06224 static int
  2725. 06225 date_of(register struct dsttype *dst, struct tm *timep)
  2726. 06226 {
  2727. 06227         int leap = LEAPYEAR(YEAR0 + timep->tm_year);
  2728. 06228         int firstday, tmpday;
  2729. 06229         register int day, month;
  2730. 06230
  2731. 06231         if (dst->ds_type != 'M') {
  2732. 06232                 return dst->ds_date[0] -
  2733. 06233                             (dst->ds_type == 'J'
  2734. 06234                                 && leap
  2735. 06235                                 && dst->ds_date[0] < 58);
  2736. 06236         }
  2737. 06237         day = 0;
  2738. 06238         month = 1;
  2739. 06239         while (month < dst->ds_date[0]) {
  2740. 06240                 day += _ytab[leap][month - 1];
  2741. 06241                 month++;
  2742. 06242         }
  2743. 06243         firstday = (day + FIRSTDAYOF(timep)) % 7;
  2744. 06244         tmpday = day;
  2745. 06245         day += (dst->ds_date[2] - firstday + 7) % 7
  2746. 06246                 + 7 * (dst->ds_date[1] - 1);
  2747. 06247         if (day >= tmpday + _ytab[leap][month]) day -= 7;
  2748. 06248         return day;
  2749. 06249 }
  2750. 06251 /*
  2751. 06252  * The default dst transitions are those for Western Europe (except Great
  2752. 06253  * Britain). 
  2753. 06254  */
  2754. 06255 unsigned
  2755. 06256 _dstget(register struct tm *timep)
  2756. 06257 {
  2757. 06258         int begindst, enddst;
  2758. 06259         register struct dsttype *dsts = &dststart, *dste = &dstend;
  2759. 06260         int do_dst = 0;
  2760. 06261
  2761. 06262         if (_daylight == -1)
  2762. 06263                 _tzset();
  2763. 06264
  2764. 06265         timep->tm_isdst = _daylight;
  2765. 06266         if (!_daylight) return 0;
  2766. 06267
  2767. 06268         if (dsts->ds_type != 'U')
  2768. 06269                 begindst = date_of(dsts, timep);
  2769. 06270         else begindst = last_sunday(89, timep); /* last Sun before Apr */
  2770. 06271         if (dste->ds_type != 'U')
  2771. 06272                 enddst = date_of(dste, timep);
  2772. 06273         else enddst = last_sunday(272, timep);  /* last Sun in Sep */
  2773. 06274
  2774. 06275         /* assume begindst != enddst (otherwise it would be no use) */
  2775. 06276         if (begindst < enddst) {                /* northern hemisphere */
  2776. 06277                 if (timep->tm_yday > begindst && timep->tm_yday < enddst)
  2777. 06278                         do_dst = 1;
  2778. 06279         } else {                                /* southern hemisphere */
  2779. 06280                 if (timep->tm_yday > begindst || timep->tm_yday < enddst)
  2780. 06281                         do_dst = 1;
  2781. 06282         }
  2782. 06283
  2783. 06284         if (!do_dst
  2784. 06285             && (timep->tm_yday == begindst || timep->tm_yday == enddst)) {
  2785. 06286                 long dsttranssec;       /* transition when day is this old */
  2786. 06287                 long cursec;
  2787. 06288
  2788. 06289                 if (timep->tm_yday == begindst)
  2789. 06290                         dsttranssec = dsts->ds_sec;
  2790. 06291                 else    dsttranssec = dste->ds_sec;
  2791. 06292                 cursec = ((timep->tm_hour * 60) + timep->tm_min) * 60L
  2792. 06293                             + timep->tm_sec;
  2793. 06294
  2794. 06295                 if ((timep->tm_yday == begindst && cursec >= dsttranssec)
  2795. 06296                     || (timep->tm_yday == enddst && cursec < dsttranssec))
  2796. 06297                         do_dst = 1;
  2797. 06298         }
  2798. 06299 #if USE_TABLE
  2799. 06300         if (usetable) ZoneFromTable(_timezone);
  2800. 06301 #endif
  2801. 06302         if (do_dst) return _dst_off;
  2802. 06303         timep->tm_isdst = 0;
  2803. 06304         return 0;
  2804. 06305 }
  2805. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2806. src/lib/ansi/mktime.c    
  2807. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2808. 06400 /*
  2809. 06401  * mktime - convert local time into calendar time
  2810. 06402  */
  2811. 06403 /* $Header: mktime.c,v 1.5 91/04/22 13:20:54 ceriel Exp $ */
  2812. 06404
  2813. 06405 /* Michael A. Temari <temari@ix.netcom.com>   03/01/96    */
  2814. 06406 /*   -  fixed bug is structure fixup code                 */
  2815. 06407
  2816. 06408 #include        <time.h>
  2817. 06409 #include        <limits.h>
  2818. 06410 #include        "loc_time.h"
  2819. 06411
  2820. 06412 /* The code assumes that unsigned long can be converted to time_t.
  2821. 06413  * A time_t should not be wider than unsigned long, since this would mean
  2822. 06414  * that the check for overflow at the end could fail.
  2823. 06415  */
  2824. 06416 time_t
  2825. 06417 mktime(register struct tm *timep)
  2826. 06418 {
  2827. 06419         register long day, year;
  2828. 06420         register int tm_year;
  2829. 06421         int yday, month;
  2830. 06422         register unsigned long seconds;
  2831. 06423         int overflow;
  2832. 06424         unsigned dst;
  2833. 06425
  2834. 06426         timep->tm_min += timep->tm_sec / 60;
  2835. 06427         timep->tm_sec %= 60;
  2836. 06428         if (timep->tm_sec < 0) {
  2837. 06429                 timep->tm_sec += 60;
  2838. 06430                 timep->tm_min--;
  2839. 06431         }
  2840. 06432         timep->tm_hour += timep->tm_min / 60;
  2841. 06433         timep->tm_min = timep->tm_min % 60;
  2842. 06434         if (timep->tm_min < 0) {
  2843. 06435                 timep->tm_min += 60;
  2844. 06436                 timep->tm_hour--;
  2845. 06437         }
  2846. 06438         day = timep->tm_hour / 24;
  2847. 06439         timep->tm_hour= timep->tm_hour % 24;
  2848. 06440         if (timep->tm_hour < 0) {
  2849. 06441                 timep->tm_hour += 24;
  2850. 06442                 day--;
  2851. 06443         }
  2852. 06444         timep->tm_year += timep->tm_mon / 12;
  2853. 06445         timep->tm_mon %= 12;
  2854. 06446         if (timep->tm_mon < 0) {
  2855. 06447                 timep->tm_mon += 12;
  2856. 06448                 timep->tm_year--;
  2857. 06449         }
  2858. 06450         day += (timep->tm_mday - 1);
  2859. 06451         while (day < 0) {
  2860. 06452                 if(--timep->tm_mon < 0) {
  2861. 06453                         timep->tm_year--;
  2862. 06454                         timep->tm_mon = 11;
  2863. 06455                 }
  2864. 06456                 day += _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon];
  2865. 06457         }
  2866. 06458         while (day >= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]) {
  2867. 06459                 day -= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon];
  2868. 06460                 if (++(timep->tm_mon) == 12) {
  2869. 06461                         timep->tm_mon = 0;
  2870. 06462                         timep->tm_year++;
  2871. 06463                 }
  2872. 06464         }
  2873. 06465         timep->tm_mday = day + 1;
  2874. 06466         _tzset();                       /* set timezone and dst info  */
  2875. 06467         year = EPOCH_YR;
  2876. 06468         if (timep->tm_year < year - YEAR0) return (time_t)-1;
  2877. 06469         seconds = 0;
  2878. 06470         day = 0;                        /* means days since day 0 now */
  2879. 06471         overflow = 0;
  2880. 06472
  2881. 06473         /* Assume that when day becomes negative, there will certainly
  2882. 06474          * be overflow on seconds.
  2883. 06475          * The check for overflow needs not to be done for leapyears
  2884. 06476          * divisible by 400.
  2885. 06477          * The code only works when year (1970) is not a leapyear.
  2886. 06478          */
  2887. 06479 #if     EPOCH_YR != 1970
  2888. 06480 #error  EPOCH_YR != 1970
  2889. 06481 #endif
  2890. 06482         tm_year = timep->tm_year + YEAR0;
  2891. 06483
  2892. 06484         if (LONG_MAX / 365 < tm_year - year) overflow++;
  2893. 06485         day = (tm_year - year) * 365;
  2894. 06486         if (LONG_MAX - day < (tm_year - year) / 4 + 1) overflow++;
  2895. 06487         day += (tm_year - year) / 4
  2896. 06488                 + ((tm_year % 4) && tm_year % 4 < year % 4);
  2897. 06489         day -= (tm_year - year) / 100
  2898. 06490                 + ((tm_year % 100) && tm_year % 100 < year % 100);
  2899. 06491         day += (tm_year - year) / 400
  2900. 06492                 + ((tm_year % 400) && tm_year % 400 < year % 400);
  2901. 06493
  2902. 06494         yday = month = 0;
  2903. 06495         while (month < timep->tm_mon) {
  2904. 06496                 yday += _ytab[LEAPYEAR(tm_year)][month];
  2905. 06497                 month++;
  2906. 06498         }
  2907. 06499         yday += (timep->tm_mday - 1);
  2908. 06500         if (day + yday < 0) overflow++;
  2909. 06501         day += yday;
  2910. 06502
  2911. 06503         timep->tm_yday = yday;
  2912. 06504         timep->tm_wday = (day + 4) % 7;         /* day 0 was thursday (4) */
  2913. 06505
  2914. 06506         seconds = ((timep->tm_hour * 60L) + timep->tm_min) * 60L + timep->tm_sec;
  2915. 06507
  2916. 06508         if ((TIME_MAX - seconds) / SECS_DAY < day) overflow++;
  2917. 06509         seconds += day * SECS_DAY;
  2918. 06510
  2919. 06511         /* Now adjust according to timezone and daylight saving time */
  2920. 06512
  2921. 06513         if (((_timezone > 0) && (TIME_MAX - _timezone < seconds))
  2922. 06514             || ((_timezone < 0) && (seconds < -_timezone)))
  2923. 06515                 overflow++;
  2924. 06516         seconds += _timezone;
  2925. 06517
  2926. 06518         if (timep->tm_isdst < 0)
  2927. 06519                 dst = _dstget(timep);
  2928. 06520         else if (timep->tm_isdst)
  2929. 06521                 dst = _dst_off;
  2930. 06522         else dst = 0;
  2931. 06523
  2932. 06524         if (dst > seconds) overflow++;  /* dst is always non-negative */
  2933. 06525         seconds -= dst;
  2934. 06526
  2935. 06527         if (overflow) return (time_t)-1;
  2936. 06528
  2937. 06529         if ((time_t)seconds != seconds) return (time_t)-1;
  2938. 06530         return (time_t)seconds;
  2939. 06531 }
  2940. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2941. src/lib/ansi/qsort.c    
  2942. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2943. 06600 /*
  2944. 06601  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  2945. 06602  * See the copyright notice in the ACK home directory, in the file "Copyright".
  2946. 06603  */
  2947. 06604 /* $Header: qsort.c,v 1.3 90/08/28 14:03:24 eck Exp $ */
  2948. 06605
  2949. 06606 #include        <stdlib.h>
  2950. 06607
  2951. 06608 static  void qsort1(char *, char *, size_t);
  2952. 06609 static  int (*qcompar)(const char *, const char *);
  2953. 06610 static  void qexchange(char *, char *, size_t);
  2954. 06611 static  void q3exchange(char *, char *, char *, size_t);
  2955. 06612
  2956. 06613 void
  2957. 06614 qsort(void *base, size_t nel, size_t width,
  2958. 06615       int (*compar)(const void *, const void *))
  2959. 06616 {
  2960. 06617         /* when nel is 0, the expression '(nel - 1) * width' is wrong */
  2961. 06618         if (!nel) return;
  2962. 06619         qcompar = (int (*)(const char *, const char *)) compar;
  2963. 06620         qsort1(base, (char *)base + (nel - 1) * width, width);
  2964. 06621 }
  2965. 06623 static void
  2966. 06624 qsort1(char *a1, char *a2, register size_t width)
  2967. 06625 {
  2968. 06626         register char *left, *right;
  2969. 06627         register char *lefteq, *righteq;
  2970. 06628         int cmp;
  2971. 06629
  2972. 06630         for (;;) {
  2973. 06631                 if (a2 <= a1) return;
  2974. 06632                 left = a1;
  2975. 06633                 right = a2;
  2976. 06634                 lefteq = righteq = a1 + width * (((a2-a1)+width)/(2*width));
  2977. 06635                 /*
  2978. 06636                    Pick an element in the middle of the array.
  2979. 06637                    We will collect the equals around it.
  2980. 06638                    "lefteq" and "righteq" indicate the left and right
  2981. 06639                    bounds of the equals respectively.
  2982. 06640                    Smaller elements end up left of it, larger elements end
  2983. 06641                    up right of it.
  2984. 06642                 */
  2985. 06643 again:
  2986. 06644                 while (left < lefteq && (cmp = (*qcompar)(left, lefteq)) <= 0) {
  2987. 06645                         if (cmp < 0) {
  2988. 06646                                 /* leave it where it is */
  2989. 06647                                 left += width;
  2990. 06648                         }
  2991. 06649                         else {
  2992. 06650                                 /* equal, so exchange with the element to
  2993. 06651                                    the left of the "equal"-interval.
  2994. 06652                                 */
  2995. 06653                                 lefteq -= width;
  2996. 06654                                 qexchange(left, lefteq, width);
  2997. 06655                         }
  2998. 06656                 }
  2999. 06657                 while (right > righteq) {
  3000. 06658                         if ((cmp = (*qcompar)(right, righteq)) < 0) {
  3001. 06659                                 /* smaller, should go to left part
  3002. 06660                                 */
  3003. 06661                                 if (left < lefteq) {
  3004. 06662                                         /* yes, we had a larger one at the
  3005. 06663                                            left, so we can just exchange
  3006. 06664                                         */
  3007. 06665                                         qexchange(left, right, width);
  3008. 06666                                         left += width;
  3009. 06667                                         right -= width;
  3010. 06668                                         goto again;
  3011. 06669                                 }
  3012. 06670                                 /* no more room at the left part, so we
  3013. 06671                                    move the "equal-interval" one place to the
  3014. 06672                                    right, and the smaller element to the
  3015. 06673                                    left of it.
  3016. 06674                                    This is best expressed as a three-way
  3017. 06675                                    exchange.
  3018. 06676                                 */
  3019. 06677                                 righteq += width;
  3020. 06678                                 q3exchange(left, righteq, right, width);
  3021. 06679                                 lefteq += width;
  3022. 06680                                 left = lefteq;
  3023. 06681                         }
  3024. 06682                         else if (cmp == 0) {
  3025. 06683                                 /* equal, so exchange with the element to
  3026. 06684                                    the right of the "equal-interval"
  3027. 06685                                 */
  3028. 06686                                 righteq += width;
  3029. 06687                                 qexchange(right, righteq, width);
  3030. 06688                         }
  3031. 06689                         else    /* just leave it */ right -= width;
  3032. 06690                 }
  3033. 06691                 if (left < lefteq) {
  3034. 06692                         /* larger element to the left, but no more room,
  3035. 06693                            so move the "equal-interval" one place to the
  3036. 06694                            left, and the larger element to the right
  3037. 06695                            of it.
  3038. 06696                         */
  3039. 06697                         lefteq -= width;
  3040. 06698                         q3exchange(right, lefteq, left, width);
  3041. 06699                         righteq -= width;
  3042. 06700                         right = righteq;
  3043. 06701                         goto again;
  3044. 06702                 }
  3045. 06703                 /* now sort the "smaller" part */
  3046. 06704                 qsort1(a1, lefteq - width, width);
  3047. 06705                 /* and now the larger, saving a subroutine call
  3048. 06706                    because of the for(;;)
  3049. 06707                 */
  3050. 06708                 a1 = righteq + width;
  3051. 06709         }
  3052. 06710         /*NOTREACHED*/
  3053. 06711 }
  3054. 06713 static void
  3055. 06714 qexchange(register char *p, register char *q,
  3056. 06715           register size_t n)
  3057. 06716 {
  3058. 06717         register int c;
  3059. 06718
  3060. 06719         while (n-- > 0) {
  3061. 06720                 c = *p;
  3062. 06721                 *p++ = *q;
  3063. 06722                 *q++ = c;
  3064. 06723         }
  3065. 06724 }
  3066. 06726 static void
  3067. 06727 q3exchange(register char *p, register char *q, register char *r,
  3068. 06728            register size_t n)
  3069. 06729 {
  3070. 06730         register int c;
  3071. 06731
  3072. 06732         while (n-- > 0) {
  3073. 06733                 c = *p;
  3074. 06734                 *p++ = *r;
  3075. 06735                 *r++ = *q;
  3076. 06736                 *q++ = c;
  3077. 06737         }
  3078. 06738 }
  3079. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3080. src/lib/ansi/raise.c    
  3081. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3082. 06800 /*
  3083. 06801  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3084. 06802  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3085. 06803  */
  3086. 06804 /* $Header: raise.c,v 1.3 90/11/22 13:55:50 eck Exp $ */
  3087. 06805
  3088. 06806 #if     defined(_POSIX_SOURCE)
  3089. 06807 #include        <sys/types.h>
  3090. 06808 #endif
  3091. 06809 #include        <signal.h>
  3092. 06810
  3093. 06811 int _kill(int pid, int sig);
  3094. 06812 pid_t _getpid(void);
  3095. 06813
  3096. 06814 int
  3097. 06815 raise(int sig)
  3098. 06816 {
  3099. 06817         if (sig < 0 || sig > _NSIG)
  3100. 06818                 return -1;
  3101. 06819         return _kill(_getpid(), sig);
  3102. 06820 }
  3103. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3104. src/lib/ansi/rand.c    
  3105. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3106. 06900 /*
  3107. 06901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3108. 06902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3109. 06903  */
  3110. 06904 /* $Header: rand.c,v 1.3 90/06/30 20:02:45 ceriel Exp $ */
  3111. 06905
  3112. 06906 #include        <stdlib.h>
  3113. 06907
  3114. 06908 static unsigned long int next = 1;
  3115. 06909
  3116. 06910 int rand(void)
  3117. 06911 {
  3118. 06912         next = next * 1103515245 + 12345;
  3119. 06913         return (unsigned int)(next/(2 * (RAND_MAX +1L)) % (RAND_MAX+1L));
  3120. 06914 }
  3121. 06916 void srand(unsigned int seed)
  3122. 06917 {
  3123. 06918         next = seed;
  3124. 06919 }
  3125. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3126. src/lib/ansi/setlocale.c    
  3127. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3128. 07000 /*
  3129. 07001  * setlocale - set the programs locale
  3130. 07002  */
  3131. 07003 /* $Header: setlocale.c,v 1.2 89/12/18 15:49:11 eck Exp $ */
  3132. 07004
  3133. 07005 #include        <locale.h>
  3134. 07006 #include        <string.h>
  3135. 07007
  3136. 07008 struct lconv _lc;
  3137. 07009
  3138. 07010 char *
  3139. 07011 setlocale(int category, const char *locale)
  3140. 07012 {
  3141. 07013         if (!locale) return "C";
  3142. 07014         if (*locale && strcmp(locale, "C")) return (char *)NULL;
  3143. 07015         
  3144. 07016         switch(category) {
  3145. 07017         case LC_ALL:
  3146. 07018         case LC_CTYPE:
  3147. 07019         case LC_COLLATE:
  3148. 07020         case LC_TIME:
  3149. 07021         case LC_NUMERIC:
  3150. 07022         case LC_MONETARY:
  3151. 07023                 return *locale ? (char *)locale : "C";
  3152. 07024         default:
  3153. 07025                 return (char *)NULL;
  3154. 07026         }
  3155. 07027 }
  3156. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3157. src/lib/ansi/sigmisc.c    
  3158. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3159. 07100 /*
  3160. 07101  * sigmisc.c - used to get a signal mask
  3161. 07102  */
  3162. 07103 /* $Header: sigmisc.c,v 1.2 90/10/15 11:23:08 eck Exp $ */
  3163. 07104
  3164. 07105 #if     defined(_POSIX_SOURCE)
  3165. 07106
  3166. 07107 /* This can't be done in setjmp.e, since SIG_SETMASK is defined in
  3167. 07108  * <signal.h>. This is a C-file, which can't be included.
  3168. 07109  */
  3169. 07110
  3170. 07111 #include        <sys/types.h>
  3171. 07112 #include        <signal.h>
  3172. 07113 #include        <stddef.h>
  3173. 07114
  3174. 07115 int _sigprocmask(int, sigset_t *, sigset_t *);
  3175. 07116
  3176. 07117 static void
  3177. 07118 __testsigset(void) {
  3178. 07119         /* This switch compiles when a sigset_t has the right size. */
  3179. 07120         switch(0) {
  3180. 07121         case 0: 
  3181. 07122         case sizeof(sigset_t) <= sizeof(long): break;
  3182. 07123         }
  3183. 07124 }
  3184. 07126 void
  3185. 07127 __newsigset(sigset_t *p)
  3186. 07128 {
  3187. 07129         /* The SIG_SETMASK is not significant */
  3188. 07130         _sigprocmask(SIG_SETMASK, NULL, p);
  3189. 07131 }
  3190. 07133 void
  3191. 07134 __oldsigset(sigset_t *p)
  3192. 07135 {
  3193. 07136         _sigprocmask(SIG_SETMASK, p, NULL);
  3194. 07137 }
  3195. 07138 #endif  /* _POSIX_SOURCE */
  3196. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3197. src/lib/ansi/signal.c    
  3198. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3199. 07200 /* SYSVR4 and ANSI compatible signal(2). */
  3200. 07201
  3201. 07202 #include <lib.h>
  3202. 07203 #define sigaction       _sigaction
  3203. 07204 #define sigemptyset     _sigemptyset
  3204. 07205 #include <signal.h>
  3205. 07206
  3206. 07207 PUBLIC sighandler_t signal(sig, disp)
  3207. 07208 int sig;                        /* signal number */
  3208. 07209 sighandler_t disp;              /* signal handler, or SIG_DFL, or SIG_IGN */
  3209. 07210 {
  3210. 07211   struct sigaction sa, osa;
  3211. 07212
  3212. 07213   if (sig <= 0 || sig > _NSIG || sig == SIGKILL) {
  3213. 07214         errno = EINVAL;
  3214. 07215         return(SIG_ERR);
  3215. 07216   }
  3216. 07217   sigemptyset(&sa.sa_mask);
  3217. 07218
  3218. 07219 #ifdef WANT_UNRELIABLE_SIGNALS
  3219. 07220   /* Allow the signal being handled to interrupt the signal handler. */
  3220. 07221   sa.sa_flags = SA_NODEFER;
  3221. 07222
  3222. 07223   /* When signal is caught, reset signal handler to SIG_DFL for all but
  3223. 07224    * SIGILL and SIGTRAP.
  3224. 07225    */
  3225. 07226   if (sig != SIGILL && sig != SIGTRAP) sa.sa_flags |= SA_RESETHAND;
  3226. 07227 #else
  3227. 07228   sa.sa_flags = 0;
  3228. 07229 #endif
  3229. 07230
  3230. 07231   sa.sa_handler = disp;
  3231. 07232   if (sigaction(sig, &sa, &osa) < 0) return(SIG_ERR);
  3232. 07233   return(osa.sa_handler);
  3233. 07234 }
  3234. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3235. src/lib/ansi/strcat.c    
  3236. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3237. 07300 /*
  3238. 07301  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3239. 07302  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3240. 07303  */
  3241. 07304 /* $Header: strcat.c,v 1.2 90/05/31 18:33:06 ceriel Exp $ */
  3242. 07305
  3243. 07306 #include        <string.h>
  3244. 07307
  3245. 07308 char *
  3246. 07309 strcat(char *ret, register const char *s2)
  3247. 07310 {
  3248. 07311         register char *s1 = ret;
  3249. 07312
  3250. 07313         while (*s1++ != '')
  3251. 07314                 /* EMPTY */ ;
  3252. 07315         s1--;
  3253. 07316         while (*s1++ = *s2++)
  3254. 07317                 /* EMPTY */ ;
  3255. 07318         return ret;
  3256. 07319 }
  3257. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3258. src/lib/ansi/strchr.c    
  3259. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3260. 07400 /*
  3261. 07401  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3262. 07402  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3263. 07403  */
  3264. 07404 /* $Header: strchr.c,v 1.3 90/08/28 13:53:00 eck Exp $ */
  3265. 07405
  3266. 07406 #include        <string.h>
  3267. 07407
  3268. 07408 char *
  3269. 07409 strchr(register const char *s, register int c)
  3270. 07410 {
  3271. 07411         c = (char) c;
  3272. 07412
  3273. 07413         while (c != *s) {
  3274. 07414                 if (*s++ == '') return NULL;
  3275. 07415         }
  3276. 07416         return (char *)s;
  3277. 07417 }
  3278. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3279. src/lib/ansi/strcmp.c    
  3280. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3281. 07500 /*
  3282. 07501  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3283. 07502  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3284. 07503  */
  3285. 07504 /* $Id: strcmp.c,v 1.4 1994/06/24 11:56:43 ceriel Exp $ */
  3286. 07505
  3287. 07506 #include        <string.h>
  3288. 07507
  3289. 07508 int
  3290. 07509 strcmp(register const char *s1, register const char *s2)
  3291. 07510 {
  3292. 07511         while (*s1 == *s2++) {
  3293. 07512                 if (*s1++ == '') {
  3294. 07513                         return 0;
  3295. 07514                 }
  3296. 07515         }
  3297. 07516         if (*s1 == '') return -1;
  3298. 07517         if (*--s2 == '') return 1;
  3299. 07518         return (unsigned char) *s1 - (unsigned char) *s2;
  3300. 07519 }
  3301. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3302. src/lib/ansi/strcoll.c    
  3303. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3304. 07600 /*
  3305. 07601  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3306. 07602  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3307. 07603  */
  3308. 07604 /* $Header: strcoll.c,v 1.2 90/08/28 13:53:23 eck Exp $ */
  3309. 07605
  3310. 07606 #include        <string.h>
  3311. 07607 #include        <locale.h>
  3312. 07608
  3313. 07609 int
  3314. 07610 strcoll(register const char *s1, register const char *s2)
  3315. 07611 {
  3316. 07612         while (*s1 == *s2++) {
  3317. 07613                 if (*s1++ == '') {
  3318. 07614                         return 0;
  3319. 07615                 }
  3320. 07616         }
  3321. 07617         return *s1 - *--s2;
  3322. 07618 }
  3323. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3324. src/lib/ansi/strcpy.c    
  3325. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3326. 07700 /*
  3327. 07701  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3328. 07702  * See the copyright notice in the ACK home directory, in the file "Copyright".
  3329. 07703  */
  3330. 07704 /* $Header: strcpy.c,v 1.2 90/05/31 18:33:13 ceriel Exp $ */
  3331. 07705
  3332. 07706 #include        <string.h>
  3333. 07707
  3334. 07708 char *
  3335. 07709 strcpy(char *ret, register const char *s2)
  3336. 07710 {
  3337. 07711         register char *s1 = ret;
  3338. 07712
  3339. 07713         while (*s1++ = *s2++)
  3340. 07714                 /* EMPTY */ ;
  3341. 07715
  3342. 07716         return ret;
  3343. 07717 }