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

操作系统开发

开发平台:

C/C++

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