LIB.TXT
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:1006k
源码类别:

操作系统开发

开发平台:

WINDOWS

  1. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. src/lib/ansi/strcspn.c    
  3. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. 07800 /*
  5. 07801  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  6. 07802  * See the copyright notice in the ACK home directory, in the file "Copyright".
  7. 07803  */
  8. 07804 /* $Header: strcspn.c,v 1.2 89/12/18 16:01:42 eck Exp $ */
  9. 07805
  10. 07806 #include        <string.h>
  11. 07807
  12. 07808 size_t
  13. 07809 strcspn(const char *string, const char *notin)
  14. 07810 {
  15. 07811         register const char *s1, *s2;
  16. 07812
  17. 07813         for (s1 = string; *s1; s1++) {
  18. 07814                 for(s2 = notin; *s2 != *s1 && *s2; s2++)
  19. 07815                         /* EMPTY */ ;
  20. 07816                 if (*s2)
  21. 07817                         break;
  22. 07818         }
  23. 07819         return s1 - string;
  24. 07820 }
  25. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  26. src/lib/ansi/strerror.c    
  27. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  28. 07900 /*
  29. 07901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  30. 07902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  31. 07903  */
  32. 07904 /* $Header: strerror.c,v 1.3 90/08/28 13:53:31 eck Exp $ */
  33. 07905
  34. 07906 #include        <string.h>
  35. 07907
  36. 07908 /*
  37. 07909  * I don't know why, but X3J11 says that strerror() should be in declared
  38. 07910  * in <string.h>.  That is why the function is defined here.
  39. 07911  */
  40. 07912 char *
  41. 07913 strerror(register int errnum)
  42. 07914 {
  43. 07915         extern const char *_sys_errlist[];
  44. 07916         extern const int _sys_nerr;
  45. 07917
  46. 07918         if (errnum < 0 || errnum >= _sys_nerr)
  47. 07919                 return "unknown error";
  48. 07920         return (char *)_sys_errlist[errnum];
  49. 07921 }
  50. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  51. src/lib/ansi/strftime.c    
  52. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  53. 08000 /*
  54. 08001  * strftime - convert a structure to a string, controlled by an argument
  55. 08002  */
  56. 08003 /* $Header: strftime.c,v 1.3 91/04/22 13:21:03 ceriel Exp $ */
  57. 08004
  58. 08005 #include        <time.h>
  59. 08006 #include        "loc_time.h"
  60. 08007
  61. 08008 /* The width can be -1 in both s_prnt() as in u_prnt(). This
  62. 08009  * indicates that as many characters as needed should be printed.
  63. 08010  */
  64. 08011 static char *
  65. 08012 s_prnt(char *s, size_t maxsize, const char *str, int width)
  66. 08013 {
  67. 08014         while (width > 0 || (width < 0 && *str)) {
  68. 08015                 if (!maxsize) break;
  69. 08016                 *s++ = *str++;
  70. 08017                 maxsize--;
  71. 08018                 width--;
  72. 08019         }
  73. 08020         return s;
  74. 08021 }
  75. 08023 static char *
  76. 08024 u_prnt(char *s, size_t maxsize, unsigned val, int width)
  77. 08025 {
  78. 08026         int c;
  79. 08027
  80. 08028         c = val % 10;
  81. 08029         val = val / 10;
  82. 08030         if (--width > 0 || (width < 0 && val != 0))
  83. 08031                 s = u_prnt(s, (maxsize ? maxsize - 1 : 0), val, width);
  84. 08032         if (maxsize) *s++ = c + '0';
  85. 08033         return s;
  86. 08034 }
  87. 08036 size_t
  88. 08037 strftime(char *s, size_t maxsize,
  89. 08038                 const char *format, const struct tm *timeptr)
  90. 08039 {
  91. 08040         size_t n;
  92. 08041         char *firsts, *olds;
  93. 08042
  94. 08043         if (!format) return 0;
  95. 08044
  96. 08045         _tzset();       /* for %Z conversion */
  97. 08046         firsts = s;
  98. 08047         while (maxsize && *format) {
  99. 08048                 while (maxsize && *format && *format != '%') {
  100. 08049                         *s++ = *format++;
  101. 08050                         maxsize--;
  102. 08051                 }
  103. 08052                 if (!maxsize || !*format) break;
  104. 08053                 format++;
  105. 08054
  106. 08055                 olds = s;
  107. 08056                 switch (*format++) {
  108. 08057                 case 'a':
  109. 08058                         s = s_prnt(s, maxsize,
  110. 08059                                         _days[timeptr->tm_wday], ABB_LEN);
  111. 08060                         maxsize -= s - olds;
  112. 08061                         break;
  113. 08062                 case 'A':
  114. 08063                         s = s_prnt(s, maxsize, _days[timeptr->tm_wday], -1);
  115. 08064                         maxsize -= s - olds;
  116. 08065                         break;
  117. 08066                 case 'b':
  118. 08067                         s = s_prnt(s, maxsize,
  119. 08068                                         _months[timeptr->tm_mon], ABB_LEN);
  120. 08069                         maxsize -= s - olds;
  121. 08070                         break;
  122. 08071                 case 'B':
  123. 08072                         s = s_prnt(s, maxsize, _months[timeptr->tm_mon], -1);
  124. 08073                         maxsize -= s - olds;
  125. 08074                         break;
  126. 08075                 case 'c':
  127. 08076                         n = strftime(s, maxsize,
  128. 08077                                         "%a %b %d %H:%M:%S %Y", timeptr);
  129. 08078                         if (n) maxsize -= n;
  130. 08079                         else maxsize = 0;
  131. 08080                         s += n;
  132. 08081                         break;
  133. 08082                 case 'd':
  134. 08083                         s = u_prnt(s, maxsize, timeptr->tm_mday, 2);
  135. 08084                         maxsize -= s - olds;
  136. 08085                         break;
  137. 08086                 case 'H':
  138. 08087                         s = u_prnt(s, maxsize, timeptr->tm_hour, 2);
  139. 08088                         maxsize -= s - olds;
  140. 08089                         break;
  141. 08090                 case 'I':
  142. 08091                         s = u_prnt(s, maxsize,
  143. 08092                                         (timeptr->tm_hour + 11) % 12 + 1, 2);
  144. 08093                         maxsize -= s - olds;
  145. 08094                         break;
  146. 08095                 case 'j':
  147. 08096                         s = u_prnt(s, maxsize, timeptr->tm_yday + 1, 3);
  148. 08097                         maxsize -= s - olds;
  149. 08098                         break;
  150. 08099                 case 'm':
  151. 08100                         s = u_prnt(s, maxsize, timeptr->tm_mon + 1, 2);
  152. 08101                         maxsize -= s - olds;
  153. 08102                         break;
  154. 08103                 case 'M':
  155. 08104                         s = u_prnt(s, maxsize, timeptr->tm_min, 2);
  156. 08105                         maxsize -= s - olds;
  157. 08106                         break;
  158. 08107                 case 'p':
  159. 08108                         s = s_prnt(s, maxsize,
  160. 08109                                     (timeptr->tm_hour < 12) ? "AM" : "PM", 2);
  161. 08110                         maxsize -= s - olds;
  162. 08111                         break;
  163. 08112                 case 'S':
  164. 08113                         s = u_prnt(s, maxsize, timeptr->tm_sec, 2);
  165. 08114                         maxsize -= s - olds;
  166. 08115                         break;
  167. 08116                 case 'U':
  168. 08117                         s = u_prnt(s, maxsize,          /* ??? */
  169. 08118                             (timeptr->tm_yday + 7 - timeptr->tm_wday) / 7, 2);
  170. 08119                         maxsize -= s - olds;
  171. 08120                         break;
  172. 08121                 case 'w':
  173. 08122                         s = u_prnt(s, maxsize, timeptr->tm_wday, 1);
  174. 08123                         maxsize -= s - olds;
  175. 08124                         break;
  176. 08125                 case 'W':
  177. 08126                         s = u_prnt(s, maxsize,          /* ??? */
  178. 08127                             (timeptr->tm_yday+7-(timeptr->tm_wday+6)%7)/7,2);
  179. 08128                         maxsize -= s - olds;
  180. 08129                         break;
  181. 08130                 case 'x':
  182. 08131                         n = strftime(s, maxsize, "%a %b %d %Y", timeptr);
  183. 08132                         if (n) maxsize -= n;
  184. 08133                         else maxsize = 0;
  185. 08134                         s += n;
  186. 08135                         break;
  187. 08136                 case 'X':
  188. 08137                         n = strftime(s, maxsize, "%H:%M:%S", timeptr);
  189. 08138                         if (n) maxsize -= n;
  190. 08139                         else maxsize = 0;
  191. 08140                         s += n;
  192. 08141                         break;
  193. 08142                 case 'y':
  194. 08143                         s = u_prnt(s, maxsize, timeptr->tm_year % 100, 2);
  195. 08144                         maxsize -= s - olds;
  196. 08145                         break;
  197. 08146                 case 'Y':
  198. 08147                         s = u_prnt(s, maxsize, timeptr->tm_year + YEAR0, -1);
  199. 08148                         maxsize -= s - olds;
  200. 08149                         break;
  201. 08150                 case 'Z':
  202. 08151                         s = s_prnt(s, maxsize,
  203. 08152                                         _tzname[(timeptr->tm_isdst > 0)], -1);
  204. 08153                         maxsize -= s - olds;
  205. 08154                         break;
  206. 08155                 case '%':
  207. 08156                         *s++ = '%';
  208. 08157                         maxsize--;
  209. 08158                         break;
  210. 08159                 default:
  211. 08160                         /* A conversion error. Leave the loop. */
  212. 08161                         while (*format) format++;
  213. 08162                         break;
  214. 08163                 }
  215. 08164
  216. 08165         }
  217. 08166         if (maxsize) {
  218. 08167                 *s = '';
  219. 08168                 return s - firsts;
  220. 08169         }
  221. 08170         return 0;       /* The buffer is full */
  222. 08171 }
  223. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  224. src/lib/ansi/strlen.c    
  225. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  226. 08200 /*
  227. 08201  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  228. 08202  * See the copyright notice in the ACK home directory, in the file "Copyright".
  229. 08203  */
  230. 08204 /* $Header: strlen.c,v 1.4 90/08/28 13:53:42 eck Exp $ */
  231. 08205
  232. 08206 #include        <string.h>
  233. 08207
  234. 08208 size_t
  235. 08209 strlen(const char *org)
  236. 08210 {
  237. 08211         register const char *s = org;
  238. 08212
  239. 08213         while (*s++)
  240. 08214                 /* EMPTY */ ;
  241. 08215
  242. 08216         return --s - org;
  243. 08217 }
  244. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  245. src/lib/ansi/strncat.c    
  246. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  247. 08300 /*
  248. 08301  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  249. 08302  * See the copyright notice in the ACK home directory, in the file "Copyright".
  250. 08303  */
  251. 08304 /* $Header: strncat.c,v 1.3 90/08/28 13:53:54 eck Exp $ */
  252. 08305
  253. 08306 #include        <string.h>
  254. 08307
  255. 08308 char *
  256. 08309 strncat(char *ret, register const char *s2, size_t n)
  257. 08310 {
  258. 08311         register char *s1 = ret;
  259. 08312
  260. 08313         if (n > 0) {
  261. 08314                 while (*s1++)
  262. 08315                         /* EMPTY */ ;
  263. 08316                 s1--;
  264. 08317                 while (*s1++ = *s2++)  {
  265. 08318                         if (--n > 0) continue;
  266. 08319                         *s1 = '';
  267. 08320                         break;
  268. 08321                 }
  269. 08322                 return ret;
  270. 08323         } else return s1;
  271. 08324 }
  272. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  273. src/lib/ansi/strncmp.c    
  274. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  275. 08400 /*
  276. 08401  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  277. 08402  * See the copyright notice in the ACK home directory, in the file "Copyright".
  278. 08403  */
  279. 08404 /* $Id: strncmp.c,v 1.4 1994/06/24 11:57:04 ceriel Exp $ */
  280. 08405
  281. 08406 #include        <string.h>
  282. 08407
  283. 08408 int
  284. 08409 strncmp(register const char *s1, register const char *s2, register size_t n)
  285. 08410 {
  286. 08411         if (n) {
  287. 08412                 do {
  288. 08413                         if (*s1 != *s2++)
  289. 08414                                 break;
  290. 08415                         if (*s1++ == '')
  291. 08416                                 return 0;
  292. 08417                 } while (--n > 0);
  293. 08418                 if (n > 0) {
  294. 08419                         if (*s1 == '') return -1;
  295. 08420                         if (*--s2 == '') return 1;
  296. 08421                         return (unsigned char) *s1 - (unsigned char) *s2;
  297. 08422                 }
  298. 08423         }
  299. 08424         return 0;
  300. 08425 }
  301. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  302. src/lib/ansi/strncpy.c    
  303. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  304. 08500 /*
  305. 08501  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  306. 08502  * See the copyright notice in the ACK home directory, in the file "Copyright".
  307. 08503  */
  308. 08504 /* $Header: strncpy.c,v 1.3 90/08/28 13:54:11 eck Exp $ */
  309. 08505
  310. 08506 #include        <string.h>
  311. 08507
  312. 08508 char *
  313. 08509 strncpy(char *ret, register const char *s2, register size_t n)
  314. 08510 {
  315. 08511         register char *s1 = ret;
  316. 08512
  317. 08513         if (n>0) {
  318. 08514                 while((*s1++ = *s2++) && --n > 0)
  319. 08515                         /* EMPTY */ ;
  320. 08516                 if ((*--s2 == '') && --n > 0) {
  321. 08517                         do {
  322. 08518                                 *s1++ = '';
  323. 08519                         } while(--n > 0);
  324. 08520                 }
  325. 08521         }
  326. 08522         return ret;
  327. 08523 }
  328. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  329. src/lib/ansi/strpbrk.c    
  330. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  331. 08600 /*
  332. 08601  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  333. 08602  * See the copyright notice in the ACK home directory, in the file "Copyright".
  334. 08603  */
  335. 08604 /* $Header: strpbrk.c,v 1.2 89/12/18 16:02:21 eck Exp $ */
  336. 08605
  337. 08606 #include        <string.h>
  338. 08607
  339. 08608 char *
  340. 08609 strpbrk(register const char *string, register const char *brk)
  341. 08610 {
  342. 08611         register const char *s1;
  343. 08612
  344. 08613         while (*string) {
  345. 08614                 for (s1 = brk; *s1 && *s1 != *string; s1++)
  346. 08615                         /* EMPTY */ ;
  347. 08616                 if (*s1)
  348. 08617                         return (char *)string;
  349. 08618                 string++;
  350. 08619         }
  351. 08620         return (char *)NULL;
  352. 08621 }
  353. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  354. src/lib/ansi/strrchr.c    
  355. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  356. 08700 /*
  357. 08701  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  358. 08702  * See the copyright notice in the ACK home directory, in the file "Copyright".
  359. 08703  */
  360. 08704 /* $Header: strrchr.c,v 1.3 90/08/28 13:54:21 eck Exp $ */
  361. 08705
  362. 08706 #include        <string.h>
  363. 08707
  364. 08708 char *
  365. 08709 strrchr(register const char *s, int c)
  366. 08710 {
  367. 08711         register const char *result = NULL;
  368. 08712
  369. 08713         c = (char) c;
  370. 08714
  371. 08715         do {
  372. 08716                 if (c == *s)
  373. 08717                         result = s;
  374. 08718         } while (*s++ != '');
  375. 08719
  376. 08720         return (char *)result;
  377. 08721 }
  378. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  379. src/lib/ansi/strspn.c    
  380. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  381. 08800 /*
  382. 08801  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  383. 08802  * See the copyright notice in the ACK home directory, in the file "Copyright".
  384. 08803  */
  385. 08804 /* $Header: strspn.c,v 1.1 89/05/11 10:09:09 eck Exp $ */
  386. 08805
  387. 08806 #include        <string.h>
  388. 08807
  389. 08808 size_t
  390. 08809 strspn(const char *string, const char *in)
  391. 08810 {
  392. 08811         register const char *s1, *s2;
  393. 08812
  394. 08813         for (s1 = string; *s1; s1++) {
  395. 08814                 for (s2 = in; *s2 && *s2 != *s1; s2++)
  396. 08815                         /* EMPTY */ ;
  397. 08816                 if (*s2 == '')
  398. 08817                         break;
  399. 08818         }
  400. 08819         return s1 - string;
  401. 08820 }
  402. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  403. src/lib/ansi/strstr.c    
  404. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  405. 08900 /*
  406. 08901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  407. 08902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  408. 08903  */
  409. 08904 /* $Header: strstr.c,v 1.3 90/08/28 13:54:28 eck Exp $ */
  410. 08905
  411. 08906 #include        <string.h>
  412. 08907
  413. 08908 char *
  414. 08909 strstr(register const char *s, register const char *wanted)
  415. 08910 {
  416. 08911         register const size_t len = strlen(wanted);
  417. 08912
  418. 08913         if (len == 0) return (char *)s;
  419. 08914         while (*s != *wanted || strncmp(s, wanted, len))
  420. 08915                 if (*s++ == '')
  421. 08916                         return (char *)NULL;
  422. 08917         return (char *)s;
  423. 08918 }
  424. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  425. src/lib/ansi/strtok.c    
  426. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  427. 09000 /*
  428. 09001  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  429. 09002  * See the copyright notice in the ACK home directory, in the file "Copyright".
  430. 09003  */
  431. 09004 /* $Header: strtok.c,v 1.2 90/08/28 13:54:38 eck Exp $ */
  432. 09005
  433. 09006 #include        <string.h>
  434. 09007
  435. 09008 char *
  436. 09009 strtok(register char *string, const char *separators)
  437. 09010 {
  438. 09011         register char *s1, *s2;
  439. 09012         static char *savestring;
  440. 09013
  441. 09014         if (string == NULL) {
  442. 09015                 string = savestring;
  443. 09016                 if (string == NULL) return (char *)NULL;
  444. 09017         }
  445. 09018
  446. 09019         s1 = string + strspn(string, separators);
  447. 09020         if (*s1 == '') {
  448. 09021                 savestring = NULL;
  449. 09022                 return (char *)NULL;
  450. 09023         }
  451. 09024
  452. 09025         s2 = strpbrk(s1, separators);
  453. 09026         if (s2 != NULL)
  454. 09027                 *s2++ = '';
  455. 09028         savestring = s2;
  456. 09029         return s1;
  457. 09030 }
  458. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  459. src/lib/ansi/strtol.c    
  460. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  461. 09100 /*
  462. 09101  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  463. 09102  * See the copyright notice in the ACK home directory, in the file "Copyright".
  464. 09103  */
  465. 09104 /* $Header: strtol.c,v 1.4 90/05/11 15:22:19 eck Exp $ */
  466. 09105
  467. 09106 #include        <ctype.h>
  468. 09107 #include        <errno.h>
  469. 09108 #include        <limits.h>
  470. 09109 #include        <stdlib.h>
  471. 09110
  472. 09111 static unsigned long
  473. 09112 string2long(register const char *nptr, char **endptr,
  474. 09113                         int base, int is_signed);
  475. 09114
  476. 09115 long int
  477. 09116 strtol(register const char *nptr, char **endptr, int base)
  478. 09117 {
  479. 09118         return (signed long)string2long(nptr, endptr, base, 1);
  480. 09119 }
  481. 09121 unsigned long int
  482. 09122 strtoul(register const char *nptr, char **endptr, int base)
  483. 09123 {
  484. 09124         return (unsigned long)string2long(nptr, endptr, base, 0);
  485. 09125 }
  486. 09127 #define between(a, c, z)  ((unsigned) ((c) - (a)) <= (unsigned) ((z) - (a)))
  487. 09128
  488. 09129 static unsigned long
  489. 09130 string2long(register const char *nptr, char ** const endptr,
  490. 09131                         int base, int is_signed)
  491. 09132 {
  492. 09133         register unsigned int v;
  493. 09134         register unsigned long val = 0;
  494. 09135         register int c;
  495. 09136         int ovfl = 0, sign = 1;
  496. 09137         const char *startnptr = nptr, *nrstart;
  497. 09138
  498. 09139         if (endptr) *endptr = (char *)nptr;
  499. 09140         while (isspace(*nptr)) nptr++;
  500. 09141         c = *nptr;
  501. 09142
  502. 09143         if (c == '-' || c == '+') {
  503. 09144                 if (c == '-') sign = -1;
  504. 09145                 nptr++;
  505. 09146         }
  506. 09147         nrstart = nptr;                 /* start of the number */
  507. 09148
  508. 09149         /* When base is 0, the syntax determines the actual base */
  509. 09150         if (base == 0)
  510. 09151                 if (*nptr == '0')
  511. 09152                         if (*++nptr == 'x' || *nptr == 'X') {
  512. 09153                                 base = 16;
  513. 09154                                 nptr++;
  514. 09155                         }
  515. 09156                         else    base = 8;
  516. 09157                 else    base = 10;
  517. 09158         else if (base==16 && *nptr=='0' && (*++nptr =='x' || *nptr =='X'))
  518. 09159                 nptr++;
  519. 09160
  520. 09161         for (;;) {
  521. 09162                 c = *nptr;
  522. 09163                 if (between('0', c, '9')) {
  523. 09164                         v = c - '0';
  524. 09165                 } else
  525. 09166                 if (between('a', c, 'z')) {
  526. 09167                         v = c - 'a' + 0xa;
  527. 09168                 } else
  528. 09169                 if (between('A', c, 'Z')) {
  529. 09170                         v = c - 'A' + 0xA;
  530. 09171                 } else {
  531. 09172                         break;
  532. 09173                 }
  533. 09174                 if (v >= base) break;
  534. 09175                 if (val > (ULONG_MAX - v) / base) ovfl++;
  535. 09176                 val = (val * base) + v;
  536. 09177                 nptr++;
  537. 09178         }
  538. 09179         if (endptr) {
  539. 09180                 if (nrstart == nptr) *endptr = (char *)startnptr;
  540. 09181                 else *endptr = (char *)nptr;
  541. 09182         }
  542. 09183
  543. 09184         if (!ovfl) {
  544. 09185                 /* Overflow is only possible when converting a signed long. */
  545. 09186                 if (is_signed
  546. 09187                     && (   (sign < 0 && val > -(unsigned long)LONG_MIN)
  547. 09188                         || (sign > 0 && val > LONG_MAX)))
  548. 09189                     ovfl++;
  549. 09190         }
  550. 09191
  551. 09192         if (ovfl) {
  552. 09193                 errno = ERANGE;
  553. 09194                 if (is_signed)
  554. 09195                         if (sign < 0) return LONG_MIN;
  555. 09196                         else return LONG_MAX;
  556. 09197                 else return ULONG_MAX;
  557. 09198         }
  558. 09199         return (long) sign * val;
  559. 09200 }
  560. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  561. src/lib/ansi/strxfrm.c    
  562. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  563. 09300 /*
  564. 09301  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  565. 09302  * See the copyright notice in the ACK home directory, in the file "Copyright".
  566. 09303  */
  567. 09304 /* $Header: strxfrm.c,v 1.4 90/08/28 13:54:46 eck Exp $ */
  568. 09305
  569. 09306 #include        <string.h>
  570. 09307
  571. 09308 size_t
  572. 09309 strxfrm(register char *s1, register const char *save, register size_t n)
  573. 09310 {
  574. 09311         register const char *s2 = save;
  575. 09312
  576. 09313         while (*s2) {
  577. 09314                 if (n > 1) {
  578. 09315                         n--;
  579. 09316                         *s1++ = *s2++;
  580. 09317                 } else
  581. 09318                         s2++;
  582. 09319         }
  583. 09320         if (n > 0)
  584. 09321                 *s1++ = '';
  585. 09322         return s2 - save;
  586. 09323 }
  587. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  588. src/lib/ansi/system.c    
  589. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  590. 09400 /*
  591. 09401  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  592. 09402  * See the copyright notice in the ACK home directory, in the file "Copyright".
  593. 09403  */
  594. 09404 /* $Header: system.c,v 1.4 90/11/22 13:59:54 eck Exp $ */
  595. 09405
  596. 09406 #if     defined(_POSIX_SOURCE)
  597. 09407 #include        <sys/types.h>
  598. 09408 #endif
  599. 09409 #include        <stdlib.h>
  600. 09410 #include        <signal.h>
  601. 09411
  602. 09412 extern pid_t _fork(void);
  603. 09413 extern pid_t _wait(int *);
  604. 09414 extern void _exit(int);
  605. 09415 extern void _execve(const char *path, const char ** argv, const char ** envp);
  606. 09416 extern int _close(int);
  607. 09417
  608. 09418 #define FAIL    127
  609. 09419
  610. 09420 extern const char **_penvp;
  611. 09421 static const char *exec_tab[] = {
  612. 09422         "sh",                   /* argv[0] */
  613. 09423         "-c",                   /* argument to the shell */
  614. 09424         NULL,                   /* to be filled with user command */
  615. 09425         NULL                    /* terminating NULL */
  616. 09426         };
  617. 09427
  618. 09428 int
  619. 09429 system(const char *str)
  620. 09430 {
  621. 09431         int pid, exitstatus, waitval;
  622. 09432         int i;
  623. 09433
  624. 09434         if ((pid = _fork()) < 0) return str ? -1 : 0;
  625. 09435
  626. 09436         if (pid == 0) {
  627. 09437                 for (i = 3; i <= 20; i++)
  628. 09438                         _close(i);
  629. 09439                 if (!str) str = "cd .";         /* just testing for a shell */
  630. 09440                 exec_tab[2] = str;              /* fill in command */
  631. 09441                 _execve("/bin/sh", exec_tab, _penvp);
  632. 09442                 /* get here if execve fails ... */
  633. 09443                 _exit(FAIL);    /* see manual page */
  634. 09444         }
  635. 09445         while ((waitval = _wait(&exitstatus)) != pid) {
  636. 09446                 if (waitval == -1) break;
  637. 09447         }
  638. 09448         if (waitval == -1) {
  639. 09449                 /* no child ??? or maybe interrupted ??? */
  640. 09450                 exitstatus = -1;
  641. 09451         }
  642. 09452         if (!str) {
  643. 09453                 if (exitstatus == FAIL << 8)            /* execve() failed */
  644. 09454                         exitstatus = 0;
  645. 09455                 else exitstatus = 1;                    /* /bin/sh exists */
  646. 09456         }
  647. 09457         return exitstatus;
  648. 09458 }
  649. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  650. src/lib/ansi/tolower.c    
  651. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  652. 09500 #include        <ctype.h>
  653. 09501
  654. 09502 int tolower(int c) {
  655. 09503         return isupper(c) ? c - 'A' + 'a' : c ;
  656. 09504 }
  657. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  658. src/lib/ansi/toupper.c    
  659. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  660. 09600 #include        <ctype.h>
  661. 09601
  662. 09602 int toupper(int c) {
  663. 09603         return islower(c) ? c - 'a' + 'A' : c ;
  664. 09604 }
  665. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  666. src/lib/ansi/tzset.c    
  667. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  668. 09700 /*
  669. 09701  * tzset - set timezone information
  670. 09702  */
  671. 09703 /* $Header: tzset.c,v 1.3 91/04/22 13:21:11 ceriel Exp $ */
  672. 09704
  673. 09705 /* This function is present for System V && POSIX */
  674. 09706
  675. 09707 #include        <time.h>
  676. 09708 #include        "loc_time.h"
  677. 09709
  678. 09710 void
  679. 09711 tzset(void)
  680. 09712 {
  681. 09713         _tzset();       /* does the job */
  682. 09714 }
  683. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  684. src/lib/ansi/wcstombs.c    
  685. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  686. 09800 /*
  687. 09801  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  688. 09802  * See the copyright notice in the ACK home directory, in the file "Copyright".
  689. 09803  */
  690. 09804 /* $Header: wcstombs.c,v 1.3 90/03/28 16:37:07 eck Exp $ */
  691. 09805
  692. 09806 #include        <stdlib.h>
  693. 09807 #include        <locale.h>
  694. 09808 #include        <limits.h>
  695. 09809
  696. 09810 size_t
  697. 09811 wcstombs(register char *s, register const wchar_t *pwcs, size_t n)
  698. 09812 {
  699. 09813         register int i = n;
  700. 09814
  701. 09815         while (--i >= 0) {
  702. 09816                 if (!(*s++ = *pwcs++))
  703. 09817                         break;
  704. 09818         }
  705. 09819         return n - i - 1;
  706. 09820 }
  707. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  708. src/lib/ansi/wctomb.c    
  709. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  710. 09900 /*
  711. 09901  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  712. 09902  * See the copyright notice in the ACK home directory, in the file "Copyright".
  713. 09903  */
  714. 09904 /* $Header: wctomb.c,v 1.4 91/01/15 11:55:33 ceriel Exp $ */
  715. 09905
  716. 09906 #include        <stdlib.h>
  717. 09907 #include        <limits.h>
  718. 09908
  719. 09909 int
  720. 09910 /* was: wctomb(char *s, wchar_t wchar) 
  721. 09911  * This conflicts with prototype, so it was changed to:
  722. 09912  */
  723. 09913 wctomb(char *s, wchar_t wchar)
  724. 09914 {
  725. 09915         if (!s) return 0;               /* no state dependent codings */
  726. 09916
  727. 09917         *s = wchar;
  728. 09918         return 1;
  729. 09919 }
  730. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  731. src/lib/curses/curspriv.h    
  732. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  733. 10000 /* Constants */
  734. 10001 #define _SUBWIN         1               /* window is a subwindow */
  735. 10002 #define _ENDLINE        2               /* last winline is last screen line */
  736. 10003 #define _FULLWIN        4               /* window fills screen */
  737. 10004 #define _SCROLLWIN      8               /* window lwr rgt is screen lwr rgt */
  738. 10005
  739. 10006 #define _NO_CHANGE      -1              /* flags line edge unchanged */
  740. 10007 #define _BREAKCHAR      0x03            /* ^C character */
  741. 10008 #define _DCCHAR         0x08            /* Delete Char char (BS) */
  742. 10009 #define _DLCHAR         0x1b            /* Delete Line char (ESC) */
  743. 10010 #define _GOCHAR         0x11            /* ^Q character */
  744. 10011 #define _PRINTCHAR      0x10            /* ^P character */
  745. 10012 #define _STOPCHAR       0x13            /* ^S character */
  746. 10013 #define  NUNGETCH       10              /* max # chars to ungetch() */
  747. 10014
  748. 10015 #define max(a,b) (((a) > (b)) ? (a) : (b))
  749. 10016 #define min(a,b) (((a) < (b)) ? (a) : (b))
  750. 10017
  751. 10018 /* Character mask definitions. */
  752. 10019 #define CHR_MSK ((int) 0x00ff)          /* ASCIIZ character mask */
  753. 10020 #define ATR_MSK ((int) 0xff00)          /* attribute mask */
  754. 10021 #define ATR_NRM ((int) 0x0000)          /* no special attributes */
  755. 10022
  756. 10023 /* Type declarations. */
  757. 10024
  758. 10025 typedef struct {
  759. 10026   WINDOW  *tmpwin;                      /* window used for updates */
  760. 10027   int      cursrow;                     /* position of physical cursor */
  761. 10028   int      curscol;
  762. 10029   bool     rawmode;
  763. 10030   bool     cbrkmode;
  764. 10031   bool     echoit;
  765. 10032 } cursv;
  766. 10033
  767. 10034 /* External variables */
  768. 10035 extern  cursv   _cursvar;               /* curses variables */
  769. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  770. src/lib/curses/beep.c    
  771. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  772. 10100 #include <curses.h>
  773. 10101 #include "curspriv.h"
  774. 10102 #include <termcap.h>
  775. 10103
  776. 10104 extern char *bl, *vb;
  777. 10105
  778. 10106 /* Beep() sounds the terminal bell. */
  779. 10107 void beep()
  780. 10108 {
  781. 10109   if (bl)
  782. 10110         tputs(bl, 1, outc);
  783. 10111   else if (vb)
  784. 10112         tputs(vb, 1, outc);
  785. 10113 }
  786. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  787. src/lib/curses/charpick.c    
  788. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  789. 10200 #include <curses.h>
  790. 10201 #include "curspriv.h"
  791. 10202
  792. 10203 /****************************************************************/
  793. 10204 /* Winch(win) returns the character at the current position in  */
  794. 10205 /* Window 'win'.                                                */
  795. 10206 /****************************************************************/
  796. 10207
  797. 10208 int winch(win)
  798. 10209 WINDOW *win;
  799. 10210 {
  800. 10211   return((win->_line[win->_cury][win->_curx]) & 0xff);
  801. 10212 }                               /* winch */
  802. 10213
  803. 10214 /****************************************************************/
  804. 10215 /* Mvinch() moves the stdscr cursor to a new position, then     */
  805. 10216 /* Returns the character at that position.                      */
  806. 10217 /****************************************************************/
  807. 10218
  808. 10219 int mvinch(y, x)
  809. 10220 int y;
  810. 10221 int x;
  811. 10222 {
  812. 10223   if (wmove(stdscr, y, x) == ERR) return(ERR);
  813. 10224   return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff);
  814. 10225 }
  815. 10227 /****************************************************************/
  816. 10228 /* Mvwinch() moves the cursor of window 'win' to a new posi-    */
  817. 10229 /* Tion, then returns the character at that position.           */
  818. 10230 /****************************************************************/
  819. 10231
  820. 10232 int mvwinch(win, y, x)
  821. 10233 WINDOW *win;
  822. 10234 int y;
  823. 10235 int x;
  824. 10236 {
  825. 10237   if (wmove(win, y, x) == ERR) return(ERR);
  826. 10238   return((win->_line[win->_cury][win->_curx]) & 0xff);
  827. 10239 }
  828. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  829. src/lib/curses/curs_set.c    
  830. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  831. 10300 #include <curses.h>
  832. 10301 #include "curspriv.h"
  833. 10302 #include <termcap.h>
  834. 10303
  835. 10304 extern char *vi, *ve, *vs;
  836. 10305
  837. 10306 /* Sets cursor visibility to unvisible=0; normal visible=1 or very good
  838. 10307  * visible=2. 
  839. 10308 */
  840. 10309 void curs_set(visibility)
  841. 10310 int visibility;
  842. 10311 {
  843. 10312   switch (visibility) {
  844. 10313       case 0:
  845. 10314         if (vi) tputs(vi, 1, outc);
  846. 10315         break;
  847. 10316       case 1:
  848. 10317         if (ve) tputs(ve, 1, outc);
  849. 10318         break;
  850. 10319       case 2:
  851. 10320         if (vs)
  852. 10321                 tputs(vs, 1, outc);
  853. 10322         else if (ve)
  854. 10323                 tputs(ve, 1, outc);
  855. 10324   }
  856. 10325 }
  857. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  858. src/lib/curses/cursesio.c    
  859. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  860. 10400 #include <stdlib.h>
  861. 10401 #include <termcap.h>
  862. 10402 #include <sys/types.h>
  863. 10403 #include <sys/ioctl.h>
  864. 10404 #include <curses.h>
  865. 10405 #include "curspriv.h"
  866. 10406
  867. 10407 struct termios _orig_tty, _tty;
  868. 10408 cursv _cursvar;
  869. 10409
  870. 10410 WINDOW *stdscr, *curscr;
  871. 10411 int LINES, COLS;
  872. 10412 bool NONL;
  873. 10413
  874. 10414 char termcap[1024];             /* termcap buffer */
  875. 10415 char tc[200];                   /* area to hold string capabilities */
  876. 10416 char *ttytype;                  /* terminal type from env */
  877. 10417 char *arp;                      /* pointer for use in tgetstr */
  878. 10418 char *cp;                       /* character pointer */
  879. 10419
  880. 10420 char *cl;                       /* clear screen capability */
  881. 10421 char *cm;                       /* cursor motion capability */
  882. 10422 char *so;                       /* start standout capability */
  883. 10423 char *se;                       /* end standout capability */
  884. 10424 char *mr;                       /* start of reverse */
  885. 10425 char *me;                       /* revert to normal */
  886. 10426 char *mb;                       /* start of blink */
  887. 10427 char *md;                       /* start of bold */
  888. 10428 char *us;                       /* start of underscore */
  889. 10429 char *ue;                       /* end of underscore */
  890. 10430 char *vi;                       /* cursor invisible */
  891. 10431 char *ve;                       /* cursor normal */
  892. 10432 char *vs;                       /* cursor good visible */
  893. 10433 char *as;                       /* alternative charset start */
  894. 10434 char *ae;                       /* alternative charset end */
  895. 10435 char *bl;                       /* ring the bell */
  896. 10436 char *vb;                       /* visual bell */
  897. 10437
  898. 10438 /* fatal - report error and die. Never returns */
  899. 10439 void fatal(s)
  900. 10440 char *s;
  901. 10441 {
  902. 10442   (void) fprintf(stderr, "curses: %sn", s);
  903. 10443   exit(1);
  904. 10444 }
  905. 10446 /* Outc - call putchar, necessary because putchar is a macro. */
  906. 10447 void outc(c)
  907. 10448 int c;
  908. 10449 {
  909. 10450   putchar(c);
  910. 10451 }
  911. 10453 /* Move cursor to r,c */
  912. 10454 void poscur(r, c)
  913. 10455 int r, c;
  914. 10456 {
  915. 10457   tputs(tgoto(cm, c, r), 1, outc);
  916. 10458 }
  917. 10460 /* Clear the screen */
  918. 10461 void clrscr()
  919. 10462 {
  920. 10463   tputs(cl, 1, outc);
  921. 10464 }
  922. 10466 /* This are terminal independent characters which can be used in curses */
  923. 10467
  924. 10468 unsigned int ACS_ULCORNER;
  925. 10469 unsigned int ACS_LLCORNER;
  926. 10470 unsigned int ACS_URCORNER;
  927. 10471 unsigned int ACS_LRCORNER;
  928. 10472 unsigned int ACS_RTEE;
  929. 10473 unsigned int ACS_LTEE;
  930. 10474 unsigned int ACS_BTEE;
  931. 10475 unsigned int ACS_TTEE;
  932. 10476 unsigned int ACS_HLINE;
  933. 10477 unsigned int ACS_VLINE;
  934. 10478 unsigned int ACS_PLUS;
  935. 10479 unsigned int ACS_S1;
  936. 10480 unsigned int ACS_S9;
  937. 10481 unsigned int ACS_DIAMOND;
  938. 10482 unsigned int ACS_CKBOARD;
  939. 10483 unsigned int ACS_DEGREE;
  940. 10484 unsigned int ACS_PLMINUS;
  941. 10485 unsigned int ACS_BULLET;
  942. 10486 unsigned int ACS_LARROW;
  943. 10487 unsigned int ACS_RARROW;
  944. 10488 unsigned int ACS_DARROW;
  945. 10489 unsigned int ACS_UARROW;
  946. 10490 unsigned int ACS_BOARD;
  947. 10491 unsigned int ACS_LANTERN;
  948. 10492 unsigned int ACS_BLOCK;
  949. 10493
  950. 10494 /* These defines describe the full set of grafic block characters which
  951. 10495  * can be defined via termcap.
  952. 10496  */
  953. 10497
  954. 10498 #define RIGHTARROW  0
  955. 10499 #define LEFTARROW   1
  956. 10500 #define DOWNARROW   2
  957. 10501 #define UPARROW     3
  958. 10502 #define FULLSQUARE  4
  959. 10503 #define GREYSQUARE  5
  960. 10504 #define EMPTYSQUARE 6
  961. 10505 #define LATERN      7
  962. 10506 #define DIAMOND     8
  963. 10507 #define DEGREE      9
  964. 10508 #define PLUSMINUS  10
  965. 10509 #define DOWNRIGHT  11
  966. 10510 #define UPRIGHT    12
  967. 10511 #define UPLEFT     13
  968. 10512 #define DOWNLEFT   14
  969. 10513 #define CROSS      15
  970. 10514 #define UPLINE     16
  971. 10515 #define UPMIDLINE  17
  972. 10516 #define MIDLINE    18
  973. 10517 #define DOMIDLINE  19
  974. 10518 #define DOWNLINE   20
  975. 10519 #define TEELEFT    21
  976. 10520 #define TEERIGHT   22
  977. 10521 #define TEEHEAD    23
  978. 10522 #define TEENORMAL  24
  979. 10523 #define VERTLINE   25
  980. 10524 #define PARAGRAPH  26
  981. 10525
  982. 10526 unsigned int _cursgraftable[27] =
  983. 10527 {
  984. 10528  '>', '<', 'v', '^', '#', ':', ' ', '#', '+', ''', '#', '+', '+',
  985. 10529  '+', '+', '+', '-', ' ', '-', ' ', '_', '+', '+', '+', '+', '|'
  986. 10530 };
  987. 10531 char _cursident[28] = "+,.-0ahI`fgjklmnopqrstuvwx~";
  988. 10532
  989. 10533 int setterm(type)
  990. 10534 char *type;
  991. 10535 {
  992. 10536   unsigned char *ac;
  993. 10537   int i;
  994. 10538 #ifdef TIOCGWINSZ
  995. 10539   struct winsize wsize;
  996. 10540 #endif
  997. 10541
  998. 10542   if (tgetent(termcap, type) != 1) return ERR;
  999. 10543
  1000. 10544 #ifdef TIOCGWINSZ
  1001. 10545   if (ioctl(0, TIOCGWINSZ, &wsize) == 0) {
  1002. 10546         LINES = wsize.ws_row != 0 ? wsize.ws_row : tgetnum("li");
  1003. 10547         COLS = wsize.ws_col != 0 ? wsize.ws_col : tgetnum("co");
  1004. 10548   } else {
  1005. 10549 #endif
  1006. 10550         LINES = tgetnum("li");
  1007. 10551         COLS = tgetnum("co");
  1008. 10552 #ifdef TIOCGWINSZ
  1009. 10553   }
  1010. 10554 #endif
  1011. 10555   arp = tc;
  1012. 10556   cl = tgetstr("cl", &arp);
  1013. 10557   so = tgetstr("so", &arp);
  1014. 10558   se = tgetstr("se", &arp);
  1015. 10559   cm = tgetstr("cm", &arp);
  1016. 10560   mr = tgetstr("mr", &arp);
  1017. 10561   me = tgetstr("me", &arp);
  1018. 10562   mb = tgetstr("mb", &arp);
  1019. 10563   md = tgetstr("md", &arp);
  1020. 10564   us = tgetstr("us", &arp);
  1021. 10565   ue = tgetstr("ue", &arp);
  1022. 10566   vi = tgetstr("vi", &arp);
  1023. 10567   ve = tgetstr("ve", &arp);
  1024. 10568   vs = tgetstr("vs", &arp);
  1025. 10569   as = tgetstr("as", &arp);
  1026. 10570   ae = tgetstr("ae", &arp);
  1027. 10571   ac = (unsigned char *) tgetstr("ac", &arp);
  1028. 10572   bl = tgetstr("bl", &arp);
  1029. 10573   vb = tgetstr("vb", &arp);
  1030. 10574
  1031. 10575   if (ac) {
  1032. 10576         while (*ac) {
  1033. 10577                 i = 0;
  1034. 10578                 while (*ac != _cursident[i]) i++;
  1035. 10579                 _cursgraftable[i] = *++ac | A_ALTCHARSET;
  1036. 10580                 ac++;
  1037. 10581         }
  1038. 10582   }
  1039. 10583
  1040. 10584   ACS_ULCORNER = _cursgraftable[UPLEFT];
  1041. 10585   ACS_LLCORNER = _cursgraftable[DOWNLEFT];
  1042. 10586   ACS_URCORNER = _cursgraftable[UPRIGHT];
  1043. 10587   ACS_LRCORNER = _cursgraftable[DOWNRIGHT];
  1044. 10588   ACS_RTEE = _cursgraftable[TEERIGHT];
  1045. 10589   ACS_LTEE = _cursgraftable[TEELEFT];
  1046. 10590   ACS_BTEE = _cursgraftable[TEEHEAD];
  1047. 10591   ACS_TTEE = _cursgraftable[TEENORMAL];
  1048. 10592   ACS_HLINE = _cursgraftable[MIDLINE];
  1049. 10593   ACS_VLINE = _cursgraftable[VERTLINE];
  1050. 10594   ACS_PLUS = _cursgraftable[CROSS];
  1051. 10595   ACS_S1 = _cursgraftable[UPLINE];
  1052. 10596   ACS_S9 = _cursgraftable[DOWNLINE];
  1053. 10597   ACS_DIAMOND = _cursgraftable[DIAMOND];
  1054. 10598   ACS_CKBOARD = _cursgraftable[GREYSQUARE];
  1055. 10599   ACS_DEGREE = _cursgraftable[DEGREE];
  1056. 10600   ACS_PLMINUS = _cursgraftable[PLUSMINUS];
  1057. 10601   ACS_BULLET = 'o';             /* where the hell is a bullet defined in
  1058. 10602                          * termcap ??? */
  1059. 10603   ACS_LARROW = _cursgraftable[LEFTARROW];
  1060. 10604   ACS_RARROW = _cursgraftable[RIGHTARROW];
  1061. 10605   ACS_DARROW = _cursgraftable[DOWNARROW];
  1062. 10606   ACS_UARROW = _cursgraftable[UPARROW];
  1063. 10607   ACS_BOARD = _cursgraftable[EMPTYSQUARE];
  1064. 10608   ACS_LANTERN = _cursgraftable[LATERN];
  1065. 10609   ACS_BLOCK = _cursgraftable[FULLSQUARE];
  1066. 10610   /* Wow, I got it! */
  1067. 10611   return OK;
  1068. 10612 }
  1069. 10614 void gettmode()
  1070. 10615 {
  1071. 10616   tcgetattr(0, &_orig_tty);
  1072. 10617   tcgetattr(0, &_tty);
  1073. 10618   _cursvar.echoit = (_tty.c_lflag & ECHO) != 0;
  1074. 10619   _cursvar.rawmode = (_tty.c_lflag & (ICANON|ISIG)) == 0;
  1075. 10620   _cursvar.cbrkmode = (_tty.c_lflag & (ICANON|ISIG)) == ISIG;
  1076. 10621   NONL = (_tty.c_iflag & ICRNL) != 0;
  1077. 10622 }
  1078. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1079. src/lib/curses/endwin.c    
  1080. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1081. 10700 #include <curses.h>
  1082. 10701 #include "curspriv.h"
  1083. 10702 #include <termcap.h>
  1084. 10703
  1085. 10704 int endwin()
  1086. 10705 {
  1087. 10706   extern char *me;
  1088. 10707
  1089. 10708   curs_set(1);
  1090. 10709   poscur(LINES - 1, 0);
  1091. 10710   refresh();
  1092. 10711   tputs(me, 1, outc);
  1093. 10712   delwin(stdscr);
  1094. 10713   delwin(curscr);
  1095. 10714   delwin(_cursvar.tmpwin);
  1096. 10715   resetty();
  1097. 10716   return(OK);
  1098. 10717 }
  1099. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1100. src/lib/curses/flash.c    
  1101. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1102. 10800 #include <curses.h>
  1103. 10801 #include "curspriv.h"
  1104. 10802 #include <termcap.h>
  1105. 10803
  1106. 10804 extern char *bl, *vb;
  1107. 10805
  1108. 10806 /* Flash() flashes the terminal screen. */
  1109. 10807 void flash()
  1110. 10808 {
  1111. 10809   if (vb)
  1112. 10810         tputs(vb, 1, outc);
  1113. 10811   else if (bl)
  1114. 10812         tputs(bl, 1, outc);
  1115. 10813 }
  1116. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1117. src/lib/curses/initscr.c    
  1118. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1119. 10900 /* initscr.c - initialize the curses library */
  1120. 10901
  1121. 10902 #include <stdlib.h>
  1122. 10903 #include <curses.h>
  1123. 10904 #include "curspriv.h"
  1124. 10905
  1125. 10906 WINDOW *initscr()
  1126. 10907 {
  1127. 10908   char *term;
  1128. 10909
  1129. 10910   if ((term = getenv("TERM")) == NULL) return NULL;
  1130. 10911   setterm(term);
  1131. 10912   gettmode();
  1132. 10913   if ((_cursvar.tmpwin = newwin(LINES, COLS, 0, 0)) == NULL) return NULL;
  1133. 10914   if ((curscr = newwin(LINES, COLS, 0, 0)) == NULL) return NULL;
  1134. 10915   if ((stdscr = newwin(LINES, COLS, 0, 0)) == NULL) return NULL;
  1135. 10916   clearok(curscr, TRUE);
  1136. 10917   return(stdscr);
  1137. 10918 }
  1138. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1139. src/lib/curses/longname.c    
  1140. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1141. 11000 #include <curses.h>
  1142. 11001 #include "curspriv.h"
  1143. 11002
  1144. 11003 /****************************************************************/
  1145. 11004 /* Longname() returns a pointer to a string describing the      */
  1146. 11005 /* User terminal.                                               */
  1147. 11006 /****************************************************************/
  1148. 11007
  1149. 11008 char *longname()
  1150. 11009 {
  1151. 11010   return("not implemented");
  1152. 11011 }
  1153. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1154. src/lib/curses/move.c    
  1155. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1156. 11100 #include <curses.h>
  1157. 11101 #include "curspriv.h"
  1158. 11102
  1159. 11103 /****************************************************************/
  1160. 11104 /* Wmove() moves the cursor in window 'win' to position (x,y).  */
  1161. 11105 /****************************************************************/
  1162. 11106
  1163. 11107 int wmove(win, y, x)
  1164. 11108 WINDOW *win;
  1165. 11109 int y;
  1166. 11110 int x;
  1167. 11111 {
  1168. 11112   if ((x<0) || (x>win->_maxx) || (y<win->_regtop) || (y>win->_regbottom)) 
  1169. 11113         return(ERR);
  1170. 11114   win->_curx = x;
  1171. 11115   win->_cury = y;
  1172. 11116   return(OK);
  1173. 11117 }
  1174. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1175. src/lib/curses/mvcursor.c    
  1176. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1177. 11200 #include <curses.h>
  1178. 11201 #include "curspriv.h"
  1179. 11202
  1180. 11203 /****************************************************************/
  1181. 11204 /* Mvcur(oldy,oldx,newy,newx) the display cursor to <newy,newx> */
  1182. 11205 /****************************************************************/
  1183. 11206
  1184. 11207 int mvcur(oldy, oldx, newy, newx)
  1185. 11208 int oldy;
  1186. 11209 int oldx;
  1187. 11210 int newy;
  1188. 11211 int newx;
  1189. 11212 {
  1190. 11213   if ((newy >= LINES) || (newx >= COLS) || (newy < 0) || (newx < 0))
  1191. 11214         return(ERR);
  1192. 11215   poscur(newy, newx);
  1193. 11216   _cursvar.cursrow = newy;
  1194. 11217   _cursvar.curscol = newx;
  1195. 11218   return(OK);
  1196. 11219 }
  1197. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1198. src/lib/curses/newwin.c    
  1199. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1200. 11300 #include <stdlib.h>
  1201. 11301 #include <curses.h>
  1202. 11302 #include "curspriv.h"
  1203. 11303
  1204. 11304 /****************************************************************/
  1205. 11305 /* Makenew() allocates all data for a new window except the     */
  1206. 11306 /* Actual lines themselves.                                     */
  1207. 11307 /****************************************************************/
  1208. 11308
  1209. 11309 _PROTOTYPE(static WINDOW *makenew, (int nlines, int ncols, int begy,int begx));
  1210. 11310
  1211. 11311 static WINDOW *makenew(num_lines, num_columns, begy, begx)
  1212. 11312 int num_lines, num_columns, begy, begx;
  1213. 11313 {
  1214. 11314   int i;
  1215. 11315   WINDOW *win;
  1216. 11316
  1217. 11317   /* Allocate the window structure itself */
  1218. 11318   if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL) 
  1219. 11319         return((WINDOW *) ERR);
  1220. 11320
  1221. 11321   /* Allocate the line pointer array */
  1222. 11322   if ((win->_line = (int **) calloc(num_lines, sizeof(int *))) == NULL) {
  1223. 11323         free(win);
  1224. 11324         return((WINDOW *) ERR);
  1225. 11325   }
  1226. 11326
  1227. 11327   /* Allocate the minchng and maxchng arrays */
  1228. 11328   if ((win->_minchng = (int *) calloc(num_lines, sizeof(int))) == NULL) {
  1229. 11329         free(win);
  1230. 11330         free(win->_line);
  1231. 11331         return((WINDOW *) ERR);
  1232. 11332   }
  1233. 11333   if ((win->_maxchng = (int *) calloc(num_lines, sizeof(int))) == NULL) {
  1234. 11334         free(win);
  1235. 11335         free(win->_line);
  1236. 11336         free(win->_minchng);
  1237. 11337         return((WINDOW *) ERR);
  1238. 11338   }
  1239. 11339
  1240. 11340   /* Initialize window variables */
  1241. 11341   win->_curx = 0;
  1242. 11342   win->_cury = 0;
  1243. 11343   win->_maxy = num_lines - 1;
  1244. 11344   win->_maxx = num_columns - 1;
  1245. 11345   win->_begy = begy;
  1246. 11346   win->_begx = begx;
  1247. 11347   win->_flags = 0;
  1248. 11348   win->_attrs = ATR_NRM;
  1249. 11349   win->_tabsize = 8;
  1250. 11350   win->_clear = FALSE;
  1251. 11351   win->_leave = FALSE;
  1252. 11352   win->_scroll = FALSE;
  1253. 11353   win->_nodelay = FALSE;
  1254. 11354   win->_keypad = FALSE;
  1255. 11355   win->_regtop = 0;
  1256. 11356   win->_regbottom = num_lines - 1;
  1257. 11357
  1258. 11358   /* Init to say window unchanged */
  1259. 11359   for (i = 0; i < num_lines; i++) {
  1260. 11360         win->_minchng[i] = 0;
  1261. 11361         win->_maxchng[i] = num_columns - 1;
  1262. 11362   }
  1263. 11363
  1264. 11364   /* Set flags for window properties */
  1265. 11365   if ((begy + num_lines) == LINES) {
  1266. 11366         win->_flags |= _ENDLINE;
  1267. 11367         if ((begx == 0) && (num_columns == COLS) && (begy == 0))
  1268. 11368                 win->_flags |= _FULLWIN;
  1269. 11369   }                             /* if */
  1270. 11370   if (((begy + num_lines) == LINES) && ((begx + num_columns) == COLS))
  1271. 11371         win->_flags |= _SCROLLWIN;
  1272. 11372   return(win);
  1273. 11373 }
  1274. 11376 /****************************************************************/
  1275. 11377 /* Newwin() creates a new window with size num_lines * num_co-  */
  1276. 11378 /* Lumns, and origin begx,begy relative to the SCREEN. Special  */
  1277. 11379 /* Case: if num_lines and/or num_columns is 0, the remainder of */
  1278. 11380 /* The screen is used.                                          */
  1279. 11381 /****************************************************************/
  1280. 11382 WINDOW *newwin(num_lines, num_columns, begy, begx)
  1281. 11383 int num_lines, num_columns, begy, begx;
  1282. 11384 {
  1283. 11385   WINDOW *win;
  1284. 11386   int *ptr;
  1285. 11387   int i, j;
  1286. 11388
  1287. 11389   if (num_lines == 0) num_lines = LINES - begy;
  1288. 11390   if (num_columns == 0) num_columns = COLS - begx;
  1289. 11391   if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR)
  1290. 11392         return((WINDOW *) ERR);
  1291. 11393   for (i = 0; i < num_lines; i++) {     /* make and clear the lines */
  1292. 11394         if ((win->_line[i] = (int *)calloc(num_columns, sizeof(int))) == NULL){
  1293. 11395                 for (j = 0; j < i; j++) /* if error, free all the data */
  1294. 11396                         free(win->_line[j]);
  1295. 11397                 free(win->_minchng);
  1296. 11398                 free(win->_maxchng);
  1297. 11399                 free(win->_line);
  1298. 11400                 free(win);
  1299. 11401                 return((WINDOW *) ERR);
  1300. 11402         } else {
  1301. 11403                 for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns;)
  1302. 11404                         *ptr++ = ' ' | ATR_NRM;
  1303. 11405         }
  1304. 11406   }
  1305. 11407   return(win);
  1306. 11408 }
  1307. 11411 /****************************************************************/
  1308. 11412 /* Subwin() creates a sub-window in the 'orig' window, with     */
  1309. 11413 /* Size num_lines * num_columns, and with origin begx, begy     */
  1310. 11414 /* Relative to the SCREEN. Special case: if num_lines and/or    */
  1311. 11415 /* Num_columns is 0, the remainder of the original window is    */
  1312. 11416 /* Used. The subwindow uses the original window's line buffers  */
  1313. 11417 /* To store it's own lines.                                     */
  1314. 11418 /****************************************************************/
  1315. 11419 WINDOW *subwin(orig, num_lines, num_columns, begy, begx)
  1316. 11420 WINDOW *orig;
  1317. 11421 int num_lines, num_columns, begy, begx;
  1318. 11422 {
  1319. 11423   WINDOW *win;
  1320. 11424   int i, j, k;
  1321. 11425
  1322. 11426   /* Make sure window fits inside the original one */
  1323. 11427   if (begy < orig->_begy || begx < orig->_begx ||
  1324. 11428                       (begy + num_lines) > (orig->_begy + orig->_maxy) ||
  1325. 11429                       (begx + num_columns) > (orig->_begx + orig->_maxx) )
  1326. 11430         return((WINDOW *) ERR);
  1327. 11431
  1328. 11432   if (num_lines == 0) num_lines = orig->_maxy - (begy - orig->_begy);
  1329. 11433   if (num_columns == 0) num_columns = orig->_maxx - (begx - orig->_begx);
  1330. 11434   if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR)
  1331. 11435         return((WINDOW *) ERR);
  1332. 11436
  1333. 11437   /* Set line pointers the same as in the original window */
  1334. 11438   j = begy - orig->_begy;
  1335. 11439   k = begx - orig->_begx;
  1336. 11440   for (i = 0; i < num_lines; i++) win->_line[i] = (orig->_line[j++]) + k;
  1337. 11441   win->_flags |= _SUBWIN;
  1338. 11442   return(win);
  1339. 11443 }
  1340. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1341. src/lib/curses/options.c    
  1342. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1343. 11500 #include <curses.h>
  1344. 11501 #include "curspriv.h"
  1345. 11502
  1346. 11503 static bool hasold = FALSE;     /* for remembering old cursor type */
  1347. 11504 static int oldmode;
  1348. 11505
  1349. 11506 /****************************************************************/
  1350. 11507 /* Idlok() is used to set  flag for using the terminal insert/  */
  1351. 11508 /* Delete line capabilities. This is not relevant for the PC    */
  1352. 11509 /* Version of curses, and thus nothing is done.                 */
  1353. 11510 /****************************************************************/
  1354. 11511 void idlok(win, flag)
  1355. 11512 WINDOW *win;
  1356. 11513 bool flag;
  1357. 11514 {
  1358. 11515 }
  1359. 11517 /****************************************************************/
  1360. 11518 /* Clearok() marks window 'win' to cause screen clearing and    */
  1361. 11519 /* Redraw the next time a refresh is done.                      */
  1362. 11520 /****************************************************************/
  1363. 11521 void clearok(win, flag)
  1364. 11522 WINDOW *win;
  1365. 11523 bool flag;
  1366. 11524 {
  1367. 11525   if (win == curscr)
  1368. 11526         _cursvar.tmpwin->_clear = flag;
  1369. 11527   else
  1370. 11528         win->_clear = flag;
  1371. 11529 }
  1372. 11531 /****************************************************************/
  1373. 11532 /* Leaveok() marks window 'win' to allow the update routines    */
  1374. 11533 /* To leave the hardware cursor where it happens to be at the   */
  1375. 11534 /* End of update. Usually used in combination with cursoff().   */
  1376. 11535 /****************************************************************/
  1377. 11536
  1378. 11537 void leaveok(win, flag)
  1379. 11538 WINDOW *win;
  1380. 11539 bool flag;
  1381. 11540 {
  1382. 11541   win->_leave = flag;
  1383. 11542 }
  1384. 11544 /****************************************************************/
  1385. 11545 /* Scrollok() marks window 'win' to allow the scrolling region  */
  1386. 11546 /* Of it to actually scroll.                                    */
  1387. 11547 /****************************************************************/
  1388. 11548 void scrollok(win, flag)
  1389. 11549 WINDOW *win;
  1390. 11550 bool flag;
  1391. 11551 {
  1392. 11552   win->_scroll = flag;
  1393. 11553 }
  1394. 11555 /****************************************************************/
  1395. 11556 /* Nodelay() marks the window to make character input non-      */
  1396. 11557 /* Waiting, i.e. if there is no character to get, -1 will be    */
  1397. 11558 /* Returned.                                                    */
  1398. 11559 /****************************************************************/
  1399. 11560 void nodelay(win, flag)
  1400. 11561 WINDOW *win;
  1401. 11562 bool flag;
  1402. 11563 {
  1403. 11564   win->_nodelay = flag;
  1404. 11565 }
  1405. 11567 /****************************************************************/
  1406. 11568 /* Keypad() marks window 'win' to use the special keypad mode.  */
  1407. 11569 /****************************************************************/
  1408. 11570 void keypad(win, flag)
  1409. 11571 WINDOW *win;
  1410. 11572 bool flag;
  1411. 11573 {
  1412. 11574   win->_keypad = flag;
  1413. 11575 }
  1414. 11577 /****************************************************************/
  1415. 11578 /* Meta() allows use of any alternate character set allowed by  */
  1416. 11579 /* The terminal. We always allow this on the PC, so this one    */
  1417. 11580 /* Does nothing.                                                */
  1418. 11581 /****************************************************************/
  1419. 11582 void meta(win, flag)
  1420. 11583 WINDOW *win;
  1421. 11584 bool flag;
  1422. 11585 {
  1423. 11586 }
  1424. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1425. src/lib/curses/overlay.c    
  1426. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1427. 11600 /****************************************************************/
  1428. 11601 /* Overlay() and overwrite() functions of the PCcurses package  */
  1429. 11602 /*                                                              */
  1430. 11603 /****************************************************************/
  1431. 11604 /* This version of curses is based on ncurses, a curses version */
  1432. 11605 /* Originally written by Pavel Curtis at Cornell University.    */
  1433. 11606 /* I have made substantial changes to make it run on IBM PC's,  */
  1434. 11607 /* And therefore consider myself free to make it public domain. */
  1435. 11608 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  1436. 11609 /****************************************************************/
  1437. 11610 /* 1.0: Release:                                        870515  */
  1438. 11611 /****************************************************************/
  1439. 11612 /* Modified to run under the MINIX operating system by Don Cope */
  1440. 11613 /* These changes are also released into the public domain.      */
  1441. 11614 /*                                                      900906  */
  1442. 11615 /****************************************************************/
  1443. 11616
  1444. 11617 #include <curses.h>
  1445. 11618 #include "curspriv.h"
  1446. 11619
  1447. 11620 /****************************************************************/
  1448. 11621 /* Overlay() overwrites 'win1' upon 'win2', with origins alig-  */
  1449. 11622 /* Ned. Overlay is transparent; blanks from 'win1' are not      */
  1450. 11623 /* Copied to 'win2'.                                            */
  1451. 11624 /****************************************************************/
  1452. 11625 void overlay(win1, win2)
  1453. 11626 WINDOW *win1, *win2;
  1454. 11627 {
  1455. 11628   int *minchng;
  1456. 11629   int *maxchng;
  1457. 11630   int *w1ptr;
  1458. 11631   int *w2ptr;
  1459. 11632   int attrs;
  1460. 11633   int col;
  1461. 11634   int line;
  1462. 11635   int last_line;
  1463. 11636   int last_col;
  1464. 11637
  1465. 11638   last_col = min(win1->_maxx, win2->_maxx);
  1466. 11639   last_line = min(win1->_maxy, win2->_maxy);
  1467. 11640   attrs = win2->_attrs & ATR_MSK;
  1468. 11641   minchng = win2->_minchng;
  1469. 11642   maxchng = win2->_maxchng;
  1470. 11643
  1471. 11644   for (line = 0; line <= last_line; line++) {
  1472. 11645         register short fc, lc = 0;
  1473. 11646         w1ptr = win1->_line[line];
  1474. 11647         w2ptr = win2->_line[line];
  1475. 11648         fc = _NO_CHANGE;
  1476. 11649         for (col = 0; col <= last_col; col++) {
  1477. 11650                 if ((*w1ptr & CHR_MSK) != ' ') {
  1478. 11651                         *w2ptr = (*w1ptr & CHR_MSK) | attrs;
  1479. 11652                         if (fc == _NO_CHANGE) fc = col;
  1480. 11653                         lc = col;
  1481. 11654                 }
  1482. 11655                 w1ptr++;
  1483. 11656                 w2ptr++;
  1484. 11657         }
  1485. 11658
  1486. 11659         if (*minchng == _NO_CHANGE) {
  1487. 11660                 *minchng = fc;
  1488. 11661                 *maxchng = lc;
  1489. 11662         } else if (fc != _NO_CHANGE) {
  1490. 11663                 if (fc < *minchng) *minchng = fc;
  1491. 11664                 if (lc > *maxchng) *maxchng = lc;
  1492. 11665         }
  1493. 11666         minchng++;
  1494. 11667         maxchng++;
  1495. 11668   }                             /* for */
  1496. 11669 }                               /* overlay */
  1497. 11670
  1498. 11671 /****************************************************************/
  1499. 11672 /* Overwrite() overwrites 'win1' upon 'win2', with origins      */
  1500. 11673 /* Aligned. Overwrite is non-transparent; blanks from 'win1'    */
  1501. 11674 /* Are copied to 'win2'.                                        */
  1502. 11675 /****************************************************************/
  1503. 11676 void overwrite(win1, win2)
  1504. 11677 WINDOW *win1, *win2;
  1505. 11678 {
  1506. 11679   int *minchng;
  1507. 11680   int *maxchng;
  1508. 11681   int *w1ptr;
  1509. 11682   int *w2ptr;
  1510. 11683   int attrs;
  1511. 11684   int col;
  1512. 11685   int line;
  1513. 11686   int last_line;
  1514. 11687   int last_col;
  1515. 11688
  1516. 11689   last_col = min(win1->_maxx, win2->_maxx);
  1517. 11690   last_line = min(win1->_maxy, win2->_maxy);
  1518. 11691   attrs = win2->_attrs & ATR_MSK;
  1519. 11692   minchng = win2->_minchng;
  1520. 11693   maxchng = win2->_maxchng;
  1521. 11694
  1522. 11695   for (line = 0; line <= last_line; line++) {
  1523. 11696         register short fc, lc = 0;
  1524. 11697
  1525. 11698         w1ptr = win1->_line[line];
  1526. 11699         w2ptr = win2->_line[line];
  1527. 11700         fc = _NO_CHANGE;
  1528. 11701
  1529. 11702         for (col = 0; col <= last_col; col++) {
  1530. 11703                 if ((*w1ptr & CHR_MSK) != (*w2ptr & CHR_MSK)) {
  1531. 11704                         *w2ptr = (*w1ptr & CHR_MSK) | attrs;
  1532. 11705
  1533. 11706                         if (fc == _NO_CHANGE) fc = col;
  1534. 11707                         lc = col;
  1535. 11708                 }
  1536. 11709                 w1ptr++;
  1537. 11710                 w2ptr++;
  1538. 11711         }                       /* for */
  1539. 11712
  1540. 11713         if (*minchng == _NO_CHANGE) {
  1541. 11714                 *minchng = fc;
  1542. 11715                 *maxchng = lc;
  1543. 11716         } else if (fc != _NO_CHANGE) {
  1544. 11717                 if (fc < *minchng) *minchng = fc;
  1545. 11718                 if (lc > *maxchng) *maxchng = lc;
  1546. 11719         }
  1547. 11720         minchng++;
  1548. 11721         maxchng++;
  1549. 11722   }
  1550. 11723 }
  1551. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1552. src/lib/curses/prntscan.c    
  1553. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1554. 11800 #include <string.h>
  1555. 11801 #include <curses.h>
  1556. 11802 #include "curspriv.h"
  1557. 11803
  1558. 11804 static char printscanbuf[513];  /* buffer used during I/O */
  1559. 11805
  1560. 11806 /****************************************************************/
  1561. 11807 /* Wprintw(win,fmt,args) does a printf() in window 'win'.       */
  1562. 11808 /****************************************************************/
  1563. 11809 int wprintw(WINDOW *win, const char *fmt, ...)
  1564. 11810 {
  1565. 11811   va_list args;
  1566. 11812
  1567. 11813   va_start(args, fmt);
  1568. 11814   vsprintf(printscanbuf, fmt, args);
  1569. 11815   if (waddstr(win, printscanbuf) == ERR) return(ERR);
  1570. 11816   return(strlen(printscanbuf));
  1571. 11817 }
  1572. 11819 /****************************************************************/
  1573. 11820 /* Printw(fmt,args) does a printf() in stdscr.                  */
  1574. 11821 /****************************************************************/
  1575. 11822 int printw(const char *fmt, ...)
  1576. 11823 {
  1577. 11824   va_list args;
  1578. 11825
  1579. 11826   va_start(args, fmt);
  1580. 11827   vsprintf(printscanbuf, fmt, args);
  1581. 11828   if (waddstr(stdscr, printscanbuf) == ERR) return(ERR);
  1582. 11829   return(strlen(printscanbuf));
  1583. 11830 }                               /* printw */
  1584. 11831
  1585. 11832 /****************************************************************/
  1586. 11833 /* Mvprintw(fmt,args) moves the stdscr cursor to a new posi-    */
  1587. 11834 /* tion, then does a printf() in stdscr.                        */
  1588. 11835 /****************************************************************/
  1589. 11836 int mvprintw(int y, int x, const char *fmt, ...)
  1590. 11837 {
  1591. 11838   va_list args;
  1592. 11839
  1593. 11840   va_start(args, fmt);
  1594. 11841   if (wmove(stdscr, y, x) == ERR) return(ERR);
  1595. 11842   vsprintf(printscanbuf, fmt, args);
  1596. 11843   if (waddstr(stdscr, printscanbuf) == ERR) return(ERR);
  1597. 11844   return(strlen(printscanbuf));
  1598. 11845 }
  1599. 11847 /****************************************************************/
  1600. 11848 /* Mvwprintw(win,fmt,args) moves the window 'win's cursor to    */
  1601. 11849 /* A new position, then does a printf() in window 'win'.        */
  1602. 11850 /****************************************************************/
  1603. 11851 int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...)
  1604. 11852 {
  1605. 11853   va_list args;
  1606. 11854
  1607. 11855   va_start(args, fmt);
  1608. 11856   if (wmove(win, y, x) == ERR) return(ERR);
  1609. 11857   vsprintf(printscanbuf, fmt, args);
  1610. 11858   if (waddstr(win, printscanbuf) == ERR) return(ERR);
  1611. 11859   return(strlen(printscanbuf));
  1612. 11860 }                               /* mvwprintw */
  1613. 11861
  1614. 11862 /****************************************************************/
  1615. 11863 /* Wscanw(win,fmt,args) gets a string via window 'win', then    */
  1616. 11864 /* Scans the string using format 'fmt' to extract the values    */
  1617. 11865 /* And put them in the variables pointed to the arguments.      */
  1618. 11866 /****************************************************************/
  1619. 11867 int wscanw(WINDOW *win, const char *fmt, ...)
  1620. 11868 {
  1621. 11869   va_list args;
  1622. 11870
  1623. 11871   va_start(args, fmt);
  1624. 11872   wrefresh(win);                /* set cursor */
  1625. 11873   if (wgetstr(win, printscanbuf) == ERR)        /* get string */
  1626. 11874         return(ERR);
  1627. 11875   return(vsscanf(printscanbuf, fmt, args));
  1628. 11876 }                               /* wscanw */
  1629. 11877
  1630. 11878 /****************************************************************/
  1631. 11879 /* Scanw(fmt,args) gets a string via stdscr, then scans the     */
  1632. 11880 /* String using format 'fmt' to extract the values and put them */
  1633. 11881 /* In the variables pointed to the arguments.                   */
  1634. 11882 /****************************************************************/
  1635. 11883 int scanw(const char *fmt, ...)
  1636. 11884 {
  1637. 11885   va_list args;
  1638. 11886
  1639. 11887   va_start(args, fmt);
  1640. 11888   wrefresh(stdscr);             /* set cursor */
  1641. 11889   if (wgetstr(stdscr, printscanbuf) == ERR)     /* get string */
  1642. 11890         return(ERR);
  1643. 11891   return(vsscanf(printscanbuf, fmt, args));
  1644. 11892 }                               /* scanw */
  1645. 11893
  1646. 11894 /****************************************************************/
  1647. 11895 /* Mvscanw(y,x,fmt,args) moves stdscr's cursor to a new posi-   */
  1648. 11896 /* Tion, then gets a string via stdscr and scans the string     */
  1649. 11897 /* Using format 'fmt' to extract the values and put them in the */
  1650. 11898 /* Variables pointed to the arguments.                          */
  1651. 11899 /****************************************************************/
  1652. 11900 int mvscanw(int y, int x, const char *fmt, ...)
  1653. 11901 {
  1654. 11902   va_list args;
  1655. 11903
  1656. 11904   va_start(args, fmt);
  1657. 11905   if (wmove(stdscr, y, x) == ERR) return(ERR);
  1658. 11906   wrefresh(stdscr);             /* set cursor */
  1659. 11907   if (wgetstr(stdscr, printscanbuf) == ERR)     /* get string */
  1660. 11908         return(ERR);
  1661. 11909   return(vsscanf(printscanbuf, fmt, args));
  1662. 11910 }                               /* mvscanw */
  1663. 11911
  1664. 11912 /****************************************************************/
  1665. 11913 /* Mvwscanw(win,y,x,fmt,args) moves window 'win's cursor to a   */
  1666. 11914 /* New position, then gets a string via 'win' and scans the     */
  1667. 11915 /* String using format 'fmt' to extract the values and put them */
  1668. 11916 /* In the variables pointed to the arguments.                   */
  1669. 11917 /****************************************************************/
  1670. 11918 int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...)
  1671. 11919 {
  1672. 11920   va_list args;
  1673. 11921
  1674. 11922   va_start(args, fmt);
  1675. 11923   if (wmove(win, y, x) == ERR) return(ERR);
  1676. 11924   wrefresh(win);                /* set cursor */
  1677. 11925   if (wgetstr(win, printscanbuf) == ERR)        /* get string */
  1678. 11926         return(ERR);
  1679. 11927   return(vsscanf(printscanbuf, fmt, args));
  1680. 11928 }                               /* mvwscanw */
  1681. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1682. src/lib/curses/refresh.c    
  1683. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1684. 12000 /* refresh.c */
  1685. 12001
  1686. 12002 #include <curses.h>
  1687. 12003 #include "curspriv.h"
  1688. 12004
  1689. 12005 /* Wrefresh() updates window win's area of the physical screen. */
  1690. 12006 void wrefresh(win)
  1691. 12007 WINDOW *win;
  1692. 12008 {
  1693. 12009   if (win == curscr)
  1694. 12010         curscr->_clear = TRUE;
  1695. 12011   else
  1696. 12012         wnoutrefresh(win);
  1697. 12013   doupdate();
  1698. 12014 }
  1699. 12016 /****************************************************************/
  1700. 12017 /* Wnoutrefresh() updates the image of the desired screen,      */
  1701. 12018 /* Without doing physical update (copies window win's image to  */
  1702. 12019 /* The _cursvar.tmpwin window, which is hidden from the user).  */
  1703. 12020 /****************************************************************/
  1704. 12021
  1705. 12022 void wnoutrefresh(win)
  1706. 12023 register WINDOW *win;
  1707. 12024 {
  1708. 12025   register int *dst;            /* start destination in temp window */
  1709. 12026   register int *end;            /* end destination in temp window */
  1710. 12027   register int *src;            /* source in user window */
  1711. 12028   register int first;           /* first changed char on line */
  1712. 12029   register int last;            /* last changed char on line */
  1713. 12030   WINDOW *nscr;
  1714. 12031   int begy;                     /* window's place on screen */
  1715. 12032   int begx;
  1716. 12033   int i;
  1717. 12034   int j;
  1718. 12035
  1719. 12036   nscr = _cursvar.tmpwin;
  1720. 12037   begy = win->_begy;
  1721. 12038   begx = win->_begx;
  1722. 12039
  1723. 12040   for (i = 0, j = begy; i <= win->_maxy; i++, j++) {
  1724. 12041         if (win->_minchng[i] != _NO_CHANGE) {
  1725. 12042                 first = win->_minchng[i];
  1726. 12043                 last = win->_maxchng[i];
  1727. 12044                 dst = &(nscr->_line[j][begx + first]);
  1728. 12045                 end = &(nscr->_line[j][begx + last]);
  1729. 12046                 src = &(win->_line[i][first]);
  1730. 12047
  1731. 12048                 while (dst <= end)      /* copy user line to temp window */
  1732. 12049                         *dst++ = *src++;
  1733. 12050
  1734. 12051                 first += begx;  /* nscr's min/max change positions */
  1735. 12052                 last += begx;
  1736. 12053
  1737. 12054                 if ((nscr->_minchng[j] == _NO_CHANGE) || (nscr->_minchng[j] > first))
  1738. 12055                         nscr->_minchng[j] = first;
  1739. 12056                 if (last > nscr->_maxchng[j]) nscr->_maxchng[j] = last;
  1740. 12057
  1741. 12058                 win->_minchng[i] = _NO_CHANGE;  /* updated now */
  1742. 12059         }                       /* if */
  1743. 12060         win->_maxchng[i] = _NO_CHANGE;  /* updated now */
  1744. 12061   }                             /* for */
  1745. 12062
  1746. 12063   if (win->_clear) {
  1747. 12064         win->_clear = FALSE;
  1748. 12065         nscr->_clear = TRUE;
  1749. 12066   }                             /* if */
  1750. 12067   if (!win->_leave) {
  1751. 12068         nscr->_cury = win->_cury + begy;
  1752. 12069         nscr->_curx = win->_curx + begx;
  1753. 12070   }                             /* if */
  1754. 12071 }                               /* wnoutrefresh */
  1755. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1756. src/lib/curses/scrreg.c    
  1757. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1758. 12100 /****************************************************************/
  1759. 12101 /* Wsetscrreg() routine of the PCcurses package                 */
  1760. 12102 /*                                                              */
  1761. 12103 /****************************************************************/
  1762. 12104 /* This version of curses is based on ncurses, a curses version */
  1763. 12105 /* Originally written by Pavel Curtis at Cornell University.    */
  1764. 12106 /* I have made substantial changes to make it run on IBM PC's,  */
  1765. 12107 /* And therefore consider myself free to make it public domain. */
  1766. 12108 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  1767. 12109 /****************************************************************/
  1768. 12110 /* 1.0: Release:                                        870515  */
  1769. 12111 /****************************************************************/
  1770. 12112 /* Modified to run under the MINIX operating system by Don Cope */
  1771. 12113 /* These changes are also released into the public domain.      */
  1772. 12114 /*                                                      900906  */
  1773. 12115 /****************************************************************/
  1774. 12116
  1775. 12117 #include <curses.h>
  1776. 12118 #include "curspriv.h"
  1777. 12119
  1778. 12120 /****************************************************************/
  1779. 12121 /* Wsetscrreg() set the scrolling region of window 'win' to in- */
  1780. 12122 /* Clude all lines between 'top' and 'bottom'.                  */
  1781. 12123 /****************************************************************/
  1782. 12124
  1783. 12125 int wsetscrreg(win, top, bottom)
  1784. 12126 WINDOW *win;
  1785. 12127 int top;
  1786. 12128 int bottom;
  1787. 12129 {
  1788. 12130   if ((0 <= top) &&
  1789. 12131       (top <= win->_cury)
  1790. 12132       &&
  1791. 12133       (win->_cury <= bottom)
  1792. 12134       &&
  1793. 12135       (bottom <= win->_maxy)
  1794. 12136         ) {
  1795. 12137         win->_regtop = top;
  1796. 12138         win->_regbottom = bottom;
  1797. 12139         return(OK);
  1798. 12140   }
  1799. 12141
  1800. 12142    /* If */ 
  1801. 12143   else
  1802. 12144         return(ERR);
  1803. 12145 }                               /* wsetscrreg */
  1804. 12146
  1805. 12147 /****************************************************************/
  1806. 12148 /* Setscrreg() set the scrolling region of stdscr to include    */
  1807. 12149 /* All lines between 'top' and 'bottom'.                        */
  1808. 12150 /****************************************************************/
  1809. 12151
  1810. 12152 int setscrreg(top, bottom)
  1811. 12153 int top;
  1812. 12154 int bottom;
  1813. 12155 {
  1814. 12156   return(wsetscrreg(stdscr, top, bottom));
  1815. 12157 }                               /* setscrreg */
  1816. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1817. src/lib/curses/setterm.c    
  1818. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1819. 12200 #include <curses.h>
  1820. 12201 #include "curspriv.h"
  1821. 12202
  1822. 12203 _PROTOTYPE( static void ttysetflags, (void) );
  1823. 12204
  1824. 12205 static void ttysetflags()
  1825. 12206 {
  1826. 12207   _tty.c_iflag |= ICRNL | IXON;
  1827. 12208   _tty.c_oflag |= OPOST | ONLCR;
  1828. 12209   _tty.c_lflag |= ECHO | ICANON | IEXTEN | ISIG;
  1829. 12210
  1830. 12211   if (_cursvar.rawmode) {
  1831. 12212         _tty.c_iflag &= ~(ICRNL | IXON);
  1832. 12213         _tty.c_oflag &= ~(OPOST);
  1833. 12214         _tty.c_lflag &= ~(ICANON | IEXTEN | ISIG);
  1834. 12215   }
  1835. 12216   if (_cursvar.cbrkmode) {
  1836. 12217         _tty.c_lflag &= ~(ICANON);
  1837. 12218   }
  1838. 12219   if (!_cursvar.echoit) {
  1839. 12220         _tty.c_lflag &= ~(ECHO | ECHONL);
  1840. 12221   }
  1841. 12222   if (NONL) {
  1842. 12223         _tty.c_iflag &= ~(ICRNL);
  1843. 12224         _tty.c_oflag &= ~(ONLCR);
  1844. 12225   }
  1845. 12226   tcsetattr(0, TCSANOW, &_tty);
  1846. 12227 }                               /* ttysetflags */
  1847. 12228
  1848. 12229 void raw()
  1849. 12230 {
  1850. 12231   _cursvar.rawmode = TRUE;
  1851. 12232   ttysetflags();
  1852. 12233 }                               /* raw */
  1853. 12234
  1854. 12235 void noraw()
  1855. 12236 {
  1856. 12237   _cursvar.rawmode = FALSE;
  1857. 12238   ttysetflags();
  1858. 12239 }                               /* noraw */
  1859. 12240
  1860. 12241 void echo()
  1861. 12242 {
  1862. 12243   _cursvar.echoit = TRUE;
  1863. 12244   ttysetflags();
  1864. 12245 }
  1865. 12247 void noecho()
  1866. 12248 {
  1867. 12249   _cursvar.echoit = FALSE;
  1868. 12250   ttysetflags();
  1869. 12251 }
  1870. 12253 void nl()
  1871. 12254 {
  1872. 12255   NONL = FALSE;
  1873. 12256   ttysetflags();
  1874. 12257 }                               /* nl */
  1875. 12258
  1876. 12259 void nonl()
  1877. 12260 {
  1878. 12261   NONL = TRUE;
  1879. 12262   ttysetflags();
  1880. 12263 }                               /* nonl */
  1881. 12264
  1882. 12265 void cbreak()
  1883. 12266 {
  1884. 12267   _cursvar.cbrkmode = TRUE;
  1885. 12268   ttysetflags();
  1886. 12269 }                               /* cbreak */
  1887. 12270
  1888. 12271 void nocbreak()
  1889. 12272 {
  1890. 12273   _cursvar.cbrkmode = FALSE;
  1891. 12274   ttysetflags();
  1892. 12275 }                               /* nocbreak */
  1893. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1894. src/lib/curses/tabsize.c    
  1895. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1896. 12300 /****************************************************************/
  1897. 12301 /* Tabsize() routines of the PCcurses package                   */
  1898. 12302 /*                                                              */
  1899. 12303 /****************************************************************/
  1900. 12304 /* This version of curses is based on ncurses, a curses version */
  1901. 12305 /* Originally written by Pavel Curtis at Cornell University.    */
  1902. 12306 /* I have made substantial changes to make it run on IBM PC's,  */
  1903. 12307 /* And therefore consider myself free to make it public domain. */
  1904. 12308 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  1905. 12309 /****************************************************************/
  1906. 12310 /* 1.0: Release:                                        870515  */
  1907. 12311 /****************************************************************/
  1908. 12312 /* Modified to run under the MINIX operating system by Don Cope */
  1909. 12313 /* These changes are also released into the public domain.      */
  1910. 12314 /*                                                      900906  */
  1911. 12315 /****************************************************************/
  1912. 12316
  1913. 12317 #include <curses.h>
  1914. 12318 #include "curspriv.h"
  1915. 12319
  1916. 12320 /****************************************************************/
  1917. 12321 /* Wtabsize(win,ts) sets the tabsize of window 'win' to 'ts',   */
  1918. 12322 /* And returns the original value.                              */
  1919. 12323 /****************************************************************/
  1920. 12324
  1921. 12325 int wtabsize(win, ts)
  1922. 12326 WINDOW *win;
  1923. 12327 int ts;
  1924. 12328 {
  1925. 12329   int origval;
  1926. 12330
  1927. 12331   origval = win->_tabsize;
  1928. 12332   win->_tabsize = ts;
  1929. 12333   return(origval);
  1930. 12334 }                               /* wtabsize */
  1931. 12335
  1932. 12336 /****************************************************************/
  1933. 12337 /* Tabsize(ts) sets the tabsize of stdscr to 'ts', and returns  */
  1934. 12338 /* The original value.                                          */
  1935. 12339 /****************************************************************/
  1936. 12340
  1937. 12341 int tabsize(ts)
  1938. 12342 int ts;
  1939. 12343 {
  1940. 12344   int origval;
  1941. 12345
  1942. 12346   origval = stdscr->_tabsize;
  1943. 12347   stdscr->_tabsize = ts;
  1944. 12348   return(origval);
  1945. 12349 }                               /* tabsize */
  1946. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1947. src/lib/curses/termmisc.c    
  1948. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1949. 12400 #include <curses.h>
  1950. 12401 #include "curspriv.h"
  1951. 12402
  1952. 12403 /* Static variables or saving terminal modes */
  1953. 12404
  1954. 12405 int fixterm()
  1955. 12406 {
  1956. 12407   return(OK);
  1957. 12408 }                               /* fixterm */
  1958. 12409
  1959. 12410 int resetterm()
  1960. 12411 {
  1961. 12412   return(OK);
  1962. 12413 }
  1963. 12415 int saveoldterm()
  1964. 12416 {
  1965. 12417   return(OK);
  1966. 12418 }                               /* saveoldterm */
  1967. 12419
  1968. 12420 int saveterm()
  1969. 12421 {
  1970. 12422   return(OK);
  1971. 12423 }                               /* saveterm */
  1972. 12424
  1973. 12425 int baudrate()
  1974. 12426 {
  1975. 12427   return(19200);
  1976. 12428 }                               /* baudrate */
  1977. 12429
  1978. 12430 /****************************************************************/
  1979. 12431 /* Erasechar(), killchar() returns std MSDOS erase chars.       */
  1980. 12432 /****************************************************************/
  1981. 12433
  1982. 12434 int erasechar()
  1983. 12435 {
  1984. 12436   return(_DCCHAR);              /* character delete char */
  1985. 12437 }                               /* erasechar */
  1986. 12438
  1987. 12439 int killchar()
  1988. 12440 {
  1989. 12441   return(_DLCHAR);              /* line delete char */
  1990. 12442 }                               /* killchar */
  1991. 12443
  1992. 12444 /****************************************************************/
  1993. 12445 /* Savetty() and resetty() saves and restores the terminal I/O  */
  1994. 12446 /* Settings.                                                    */
  1995. 12447 /****************************************************************/
  1996. 12448
  1997. 12449 int savetty()
  1998. 12450 {
  1999. 12451   return(OK);
  2000. 12452 }                               /* savetty */
  2001. 12453
  2002. 12454 /****************************************************************/
  2003. 12455 /* Setupterm() sets up the terminal. On a PC, it is always suc- */
  2004. 12456 /* Cessful, and returns 1.                                      */
  2005. 12457 /****************************************************************/
  2006. 12458
  2007. 12459 int setupterm()
  2008. 12460 {
  2009. 12461   return(1);
  2010. 12462 }                               /* setupterm */
  2011. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2012. src/lib/curses/unctrl.c    
  2013. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2014. 12500 /****************************************************************/
  2015. 12501 /* Unctrl() routines of the PCcurses package                    */
  2016. 12502 /*                                                              */
  2017. 12503 /****************************************************************/
  2018. 12504 /* This version of curses is based on ncurses, a curses version */
  2019. 12505 /* Originally written by Pavel Curtis at Cornell University.    */
  2020. 12506 /* I have made substantial changes to make it run on IBM PC's,  */
  2021. 12507 /* And therefore consider myself free to make it public domain. */
  2022. 12508 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  2023. 12509 /****************************************************************/
  2024. 12510 /* 1.0: Release:                                        870515  */
  2025. 12511 /****************************************************************/
  2026. 12512 /* Modified to run under the MINIX operating system by Don Cope */
  2027. 12513 /* These changes are also released into the public domain.      */
  2028. 12514 /*                                                      900906  */
  2029. 12515 /****************************************************************/
  2030. 12516
  2031. 12517 #include <curses.h>
  2032. 12518 #include "curspriv.h"
  2033. 12519
  2034. 12520 static char strbuf[3] = {0, 0, 0};
  2035. 12521
  2036. 12522 /****************************************************************/
  2037. 12523 /* Unctrl() returns a char pointer to a string corresponding to */
  2038. 12524 /* Argument character 'c'.                                      */
  2039. 12525 /****************************************************************/
  2040. 12526
  2041. 12527 char *unctrl(c)
  2042. 12528 char c;
  2043. 12529 {
  2044. 12530   int ic = c;
  2045. 12531   ic &= 0xff;
  2046. 12532
  2047. 12533   if ((ic >= ' ') && (ic != 0x7f)) {    /* normal characters */
  2048. 12534         strbuf[0] = ic;
  2049. 12535         strbuf[1] = '';
  2050. 12536         return(strbuf);
  2051. 12537   }                             /* if */
  2052. 12538   strbuf[0] = '^';              /* '^' prefix */
  2053. 12539   if (c == 0x7f)                /* DEL */
  2054. 12540         strbuf[1] = '?';
  2055. 12541   else                          /* other control */
  2056. 12542         strbuf[1] = ic + '@';
  2057. 12543   return(strbuf);
  2058. 12544 }                               /* unctrl */
  2059. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2060. src/lib/curses/update.c    
  2061. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2062. 12600 #include <curses.h>
  2063. 12601 #include "curspriv.h"
  2064. 12602 #include <termcap.h>
  2065. 12603
  2066. 12604 static WINDOW *twin;            /* used by many routines */
  2067. 12605
  2068. 12606 /****************************************************************/
  2069. 12607 /* Gotoxy() moves the physical cursor to the desired address on */
  2070. 12608 /* The screen. We don't optimize here - on a PC, it takes more  */
  2071. 12609 /* Time to optimize than to do things directly.                 */
  2072. 12610 /****************************************************************/
  2073. 12611
  2074. 12612 _PROTOTYPE(static void gotoxy, (int row, int col ));
  2075. 12613 _PROTOTYPE(static void newattr, (int ch ));
  2076. 12614 _PROTOTYPE(static void Putchar, (int ch ));
  2077. 12615 _PROTOTYPE(static void clrupdate, (WINDOW *scr ));
  2078. 12616 _PROTOTYPE(static void transformline, (int lineno ));
  2079. 12617
  2080. 12618 static void gotoxy(row, col)
  2081. 12619 int row, col;
  2082. 12620 {
  2083. 12621   poscur(row, col);
  2084. 12622   _cursvar.cursrow = row;
  2085. 12623   _cursvar.curscol = col;
  2086. 12624 }
  2087. 12626 /* Update attributes */
  2088. 12627 static void newattr(ch)
  2089. 12628 int ch;
  2090. 12629 {
  2091. 12630   extern char *me, *as, *ae, *mb, *md, *mr, *so, *us;
  2092. 12631   static int lastattr = 0;
  2093. 12632
  2094. 12633   if (lastattr != (ch &= ATR_MSK)) {
  2095. 12634         lastattr = ch;
  2096. 12635
  2097. 12636         tputs(me, 1, outc);
  2098. 12637         if (ae) tputs(ae, 1, outc);
  2099. 12638
  2100. 12639         if (ch & A_ALTCHARSET)
  2101. 12640                 if (as) tputs(as, 1, outc);
  2102. 12641         if (ch & A_BLINK) tputs(mb, 1, outc);
  2103. 12642         if (ch & A_BOLD) tputs(md, 1, outc);
  2104. 12643         if (ch & A_REVERSE) tputs(mr, 1, outc);
  2105. 12644         if (ch & A_STANDOUT) tputs(so, 1, outc);
  2106. 12645         if (ch & A_UNDERLINE) tputs(us, 1, outc);
  2107. 12646   }
  2108. 12647 }
  2109. 12649 /* Putchar() writes a character, with attributes, to the physical
  2110. 12650    screen, but avoids writing to the lower right screen position.
  2111. 12651    Should it care about am?
  2112. 12652 */
  2113. 12653
  2114. 12654 /* Output char with attribute */
  2115. 12655 static void Putchar(ch)
  2116. 12656 int ch;
  2117. 12657 {
  2118. 12658   if ((_cursvar.cursrow < LINES) || (_cursvar.curscol < COLS)) {
  2119. 12659         newattr(ch);
  2120. 12660         putchar(ch);
  2121. 12661   }
  2122. 12662 }
  2123. 12664 /****************************************************************/
  2124. 12665 /* Clrupdate(scr) updates the screen by clearing it and then    */
  2125. 12666 /* Redraw it in it's entirety.                                  */
  2126. 12667 /****************************************************************/
  2127. 12668
  2128. 12669 static void clrupdate(scr)
  2129. 12670 WINDOW *scr;
  2130. 12671 {
  2131. 12672   register int *src;
  2132. 12673   register int *dst;
  2133. 12674   register int i;
  2134. 12675   register int j;
  2135. 12676   WINDOW *w;
  2136. 12677
  2137. 12678   w = curscr;
  2138. 12679
  2139. 12680   if (scr != w) {               /* copy scr to curscr */
  2140. 12681         for (i = 0; i < LINES; i++) {
  2141. 12682                 src = scr->_line[i];
  2142. 12683                 dst = w->_line[i];
  2143. 12684                 for (j = 0; j < COLS; j++) *dst++ = *src++;
  2144. 12685         }                       /* for */
  2145. 12686   }                             /* if */
  2146. 12687   newattr(scr->_attrs);
  2147. 12688   clrscr();
  2148. 12689   scr->_clear = FALSE;
  2149. 12690   for (i = 0; i < LINES; i++) { /* update physical screen */
  2150. 12691         src = w->_line[i];
  2151. 12692         j = 0;
  2152. 12693         while (j < COLS) {
  2153. 12694                 if (*src != (' ' | ATR_NRM)) {
  2154. 12695                         gotoxy(i, j);
  2155. 12696                         while (j < COLS && (*src != (' ' | ATR_NRM))) {
  2156. 12697                                 Putchar(*src++);
  2157. 12698                                 j++;
  2158. 12699                         }
  2159. 12700                 } else {
  2160. 12701                         src++;
  2161. 12702                         j++;
  2162. 12703                 }
  2163. 12704         }                       /* for */
  2164. 12705   }                             /* for */
  2165. 12706   fflush(stdout);
  2166. 12707 }                               /* clrupdate */
  2167. 12708
  2168. 12709 /****************************************************************/
  2169. 12710 /* Transformline() updates the given physical line to look      */
  2170. 12711 /* Like the corresponding line in _cursvar.tmpwin.              */
  2171. 12712 /****************************************************************/
  2172. 12713
  2173. 12714 static void transformline(lineno)
  2174. 12715 register int lineno;
  2175. 12716 {
  2176. 12717   register int *dstp;
  2177. 12718   register int *srcp;
  2178. 12719   register int dstc;
  2179. 12720   register int srcc;
  2180. 12721   int x;
  2181. 12722   int endx;
  2182. 12723
  2183. 12724   x = twin->_minchng[lineno];
  2184. 12725   endx = twin->_maxchng[lineno];
  2185. 12726   dstp = curscr->_line[lineno] + x;
  2186. 12727   srcp = twin->_line[lineno] + x;
  2187. 12728
  2188. 12729   while (x <= endx) {
  2189. 12730         if ((*dstp != *srcp) || (dstc != srcc)) {
  2190. 12731                 gotoxy(lineno, x);
  2191. 12732                 while (x <= endx && ((*dstp != *srcp) || (dstc != srcc))) {
  2192. 12733                         Putchar(*srcp);
  2193. 12734                         *dstp++ = *srcp++;
  2194. 12735                         x++;
  2195. 12736                 }
  2196. 12737         } else {
  2197. 12738                 *dstp++ = *srcp++;
  2198. 12739                 x++;
  2199. 12740         }
  2200. 12741   }                             /* for */
  2201. 12742   twin->_minchng[lineno] = _NO_CHANGE;
  2202. 12743   twin->_maxchng[lineno] = _NO_CHANGE;
  2203. 12744 }                               /* transformline */
  2204. 12745
  2205. 12746 /****************************************************************/
  2206. 12747 /* Doupdate() updates the physical screen to look like _curs-   */
  2207. 12748 /* Var.tmpwin if curscr is not 'Clear-marked'. Otherwise it     */
  2208. 12749 /* Updates the screen to look like curscr.                      */
  2209. 12750 /****************************************************************/
  2210. 12751
  2211. 12752 void doupdate()
  2212. 12753 {
  2213. 12754   int i;
  2214. 12755
  2215. 12756   twin = _cursvar.tmpwin;
  2216. 12757   if (curscr->_clear)
  2217. 12758         clrupdate(curscr);
  2218. 12759   else {
  2219. 12760         if (twin->_clear)
  2220. 12761                 clrupdate(twin);
  2221. 12762         else {
  2222. 12763                 for (i = 0; i < LINES; i++)
  2223. 12764                         if (twin->_minchng[i] != _NO_CHANGE)
  2224. 12765                                 transformline(i);
  2225. 12766         }
  2226. 12767   }
  2227. 12768   curscr->_curx = twin->_curx;
  2228. 12769   curscr->_cury = twin->_cury;
  2229. 12770   gotoxy(curscr->_cury, curscr->_curx);
  2230. 12771   fflush(stdout);
  2231. 12772 }                               /* doupdate */
  2232. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2233. src/lib/curses/waddch.c    
  2234. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2235. 12800 #include <curses.h>
  2236. 12801 #include "curspriv.h"
  2237. 12802
  2238. 12803 /****************************************************************/
  2239. 12804 /* Newline() does line advance and returns the new cursor line. */
  2240. 12805 /* If error, return -1.                                         */
  2241. 12806 /****************************************************************/
  2242. 12807
  2243. 12808 _PROTOTYPE( static short newline, (WINDOW *win, int lin));
  2244. 12809
  2245. 12810 static short newline(win, lin)
  2246. 12811 WINDOW *win;
  2247. 12812 int lin;
  2248. 12813 {
  2249. 12814   if (++lin > win->_regbottom) {
  2250. 12815         lin--;
  2251. 12816         if (win->_scroll)
  2252. 12817                 scroll(win);
  2253. 12818         else
  2254. 12819                 return(-1);
  2255. 12820   }                             /* if */
  2256. 12821   return(lin);
  2257. 12822 }                               /* newline */
  2258. 12823
  2259. 12824 /****************************************************************/
  2260. 12825 /* Waddch() inserts character 'c' at the current cursor posi-   */
  2261. 12826 /* Tion in window 'win', and takes any actions as dictated by   */
  2262. 12827 /* The character.                                               */
  2263. 12828 /****************************************************************/
  2264. 12829
  2265. 12830 int waddch(win, c)
  2266. 12831 WINDOW *win;
  2267. 12832 int c;
  2268. 12833 {
  2269. 12834   int x = win->_curx;
  2270. 12835   int y = win->_cury;
  2271. 12836   int newx;
  2272. 12837   int ch = c;
  2273. 12838   int ts = win->_tabsize;
  2274. 12839
  2275. 12840   ch &= (A_ALTCHARSET | 0xff);
  2276. 12841   if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR);
  2277. 12842   switch (ch) {
  2278. 12843       case 't':
  2279. 12844         for (newx = ((x / ts) + 1) * ts; x < newx; x++) {
  2280. 12845                 if (waddch(win, ' ') == ERR) return(ERR);
  2281. 12846                 if (win->_curx == 0)    /* if tab to next line */
  2282. 12847                         return(OK);     /* exit the loop */
  2283. 12848         }
  2284. 12849         return(OK);
  2285. 12850
  2286. 12851       case 'n':
  2287. 12852         if (NONL) x = 0;
  2288. 12853         if ((y = newline(win, y)) < 0) return (ERR);
  2289. 12854         break;
  2290. 12855
  2291. 12856       case 'r':        x = 0;  break;
  2292. 12857
  2293. 12858       case 'b':
  2294. 12859         if (--x < 0)            /* no back over left margin */
  2295. 12860                 x = 0;
  2296. 12861         break;
  2297. 12862
  2298. 12863       case 0x7f:
  2299. 12864         {
  2300. 12865                 if (waddch(win, '^') == ERR) return(ERR);
  2301. 12866                 return(waddch(win, '?'));
  2302. 12867         }
  2303. 12868
  2304. 12869       default:
  2305. 12870         if (ch < ' ') {         /* handle control chars */
  2306. 12871                 if (waddch(win, '^') == ERR) return(ERR);
  2307. 12872                 return(waddch(win, c + '@'));
  2308. 12873         }
  2309. 12874         ch |= (win->_attrs & ATR_MSK);
  2310. 12875         if (win->_line[y][x] != ch) {   /* only if data change */
  2311. 12876                 if (win->_minchng[y] == _NO_CHANGE)
  2312. 12877                         win->_minchng[y] = win->_maxchng[y] = x;
  2313. 12878                 else if (x < win->_minchng[y])
  2314. 12879                         win->_minchng[y] = x;
  2315. 12880                 else if (x > win->_maxchng[y])
  2316. 12881                         win->_maxchng[y] = x;
  2317. 12882         }                       /* if */
  2318. 12883         win->_line[y][x++] = ch;
  2319. 12884         if (x > win->_maxx) {   /* wrap around test */
  2320. 12885                 x = 0;
  2321. 12886                 if ((y = newline(win, y)) < 0) return(ERR);
  2322. 12887         }
  2323. 12888         break;
  2324. 12889
  2325. 12890   }                             /* switch */
  2326. 12891   win->_curx = x;
  2327. 12892   win->_cury = y;
  2328. 12893   return(OK);
  2329. 12894 }
  2330. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2331. src/lib/curses/waddstr.c    
  2332. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2333. 12900 #include <curses.h>
  2334. 12901 #include "curspriv.h"
  2335. 12902
  2336. 12903 /****************************************************************/
  2337. 12904 /* Waddstr() inserts string 'str' at the current cursor posi-   */
  2338. 12905 /* Tion in window 'win', and takes any actions as dictated by   */
  2339. 12906 /* The characters.                                              */
  2340. 12907 /****************************************************************/
  2341. 12908
  2342. 12909 int waddstr(win, str)
  2343. 12910 WINDOW *win;
  2344. 12911 char *str;
  2345. 12912 {
  2346. 12913   while (*str) {
  2347. 12914         if (waddch(win, *str++) == ERR) return(ERR);
  2348. 12915   }
  2349. 12916   return(OK);
  2350. 12917 }
  2351. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2352. src/lib/curses/wbox.c    
  2353. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2354. 13000 #include <curses.h>
  2355. 13001 #include "curspriv.h"
  2356. 13002
  2357. 13003 /****************************************************************/
  2358. 13004 /* Wbox(win,ymin,xmin,ymax,xmax,v,h) draws a box in window      */
  2359. 13005 /* 'win', enclosing the area xmin-xmax and ymin-xmax. If        */
  2360. 13006 /* Xmax and/or ymax is 0, the window max value is used. 'v' and */
  2361. 13007 /* 'h' are the vertical and horizontal characters to use. If    */
  2362. 13008 /* 'v' and 'h' are 0, wbox will use the alternate character set */
  2363. 13009 /* In a pretty way.                                             */
  2364. 13010 /****************************************************************/
  2365. 13011
  2366. 13012 int wbox(win, ymin, xmin, ymax, xmax, v, h)
  2367. 13013 WINDOW *win;
  2368. 13014 int ymin, xmin, ymax, xmax;
  2369. 13015 unsigned int v;
  2370. 13016 unsigned int h;
  2371. 13017 {
  2372. 13018   unsigned int vc, hc, ulc, urc, llc, lrc;      /* corner chars */
  2373. 13019   int i;
  2374. 13020
  2375. 13021   if (ymax == 0) ymax = win->_maxy;
  2376. 13022   if (xmax == 0) xmax = win->_maxx;
  2377. 13023
  2378. 13024   if (ymin >= win->_maxy || ymax > win->_maxy ||
  2379. 13025       xmin >= win->_maxx || xmax > win->_maxx ||
  2380. 13026       ymin >= ymax || xmin >= xmax)
  2381. 13027         return(ERR);
  2382. 13028
  2383. 13029   vc = v;
  2384. 13030   hc = h;
  2385. 13031   ulc = urc = llc = lrc = vc;   /* default same as vertical */
  2386. 13032
  2387. 13033   if (v == 0 && h == 0) {
  2388. 13034         ulc = ACS_ULCORNER;
  2389. 13035         urc = ACS_URCORNER;
  2390. 13036         llc = ACS_LLCORNER;
  2391. 13037         lrc = ACS_LRCORNER;
  2392. 13038         hc = ACS_HLINE;
  2393. 13039         vc = ACS_VLINE;
  2394. 13040   }
  2395. 13041   for (i = xmin + 1; i <= xmax - 1; i++) {
  2396. 13042         win->_line[ymin][i] = hc | win->_attrs;
  2397. 13043         win->_line[ymax][i] = hc | win->_attrs;
  2398. 13044   }
  2399. 13045   for (i = ymin + 1; i <= ymax - 1; i++) {
  2400. 13046         win->_line[i][xmin] = vc | win->_attrs;
  2401. 13047         win->_line[i][xmax] = vc | win->_attrs;
  2402. 13048   }
  2403. 13049   win->_line[ymin][xmin] = ulc | win->_attrs;
  2404. 13050   win->_line[ymin][xmax] = urc | win->_attrs;
  2405. 13051   win->_line[ymax][xmin] = llc | win->_attrs;
  2406. 13052   win->_line[ymax][xmax] = lrc | win->_attrs;
  2407. 13053
  2408. 13054   for (i = ymin; i <= ymax; i++) {
  2409. 13055         if (win->_minchng[i] == _NO_CHANGE) {
  2410. 13056                 win->_minchng[i] = xmin;
  2411. 13057                 win->_maxchng[i] = xmax;
  2412. 13058         } else {
  2413. 13059                 win->_minchng[i] = min(win->_minchng[i], xmin);
  2414. 13060                 win->_maxchng[i] = max(win->_maxchng[i], xmax);
  2415. 13061         }
  2416. 13062   }
  2417. 13063   return(OK);
  2418. 13064 }
  2419. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2420. src/lib/curses/wclear.c    
  2421. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2422. 13100 #include <curses.h>
  2423. 13101 #include "curspriv.h"
  2424. 13102
  2425. 13103 /****************************************************************/
  2426. 13104 /* Wclear() fills all lines of window 'win' with blanks, and    */
  2427. 13105 /* Marks the window to be cleared at next refresh operation.    */
  2428. 13106 /****************************************************************/
  2429. 13107
  2430. 13108 void wclear(win)
  2431. 13109 WINDOW *win;
  2432. 13110 {
  2433. 13111   werase(win);
  2434. 13112   win->_clear = TRUE;
  2435. 13113 }                               /* wclear */
  2436. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2437. src/lib/curses/wclrtobot.c    
  2438. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2439. 13200 #include <curses.h>
  2440. 13201 #include "curspriv.h"
  2441. 13202
  2442. 13203 /****************************************************************/
  2443. 13204 /* Wclrtobot() fills the right half of the cursor line of       */
  2444. 13205 /* Window 'win', and all lines below it with blanks.            */
  2445. 13206 /****************************************************************/
  2446. 13207
  2447. 13208 int wclrtobot(win)
  2448. 13209 WINDOW *win;
  2449. 13210 {
  2450. 13211   int y, minx, startx, *ptr, *end, *maxx, blank;
  2451. 13212
  2452. 13213   blank = ' ' | (win->_attrs & ATR_MSK);
  2453. 13214   startx = win->_curx;
  2454. 13215   for (y = win->_cury; y <= win->_regbottom; y++) {
  2455. 13216         minx = _NO_CHANGE;
  2456. 13217         end = &win->_line[y][win->_maxx];
  2457. 13218         for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) {
  2458. 13219                 if (*ptr != blank) {
  2459. 13220                         maxx = ptr;
  2460. 13221                         if (minx == _NO_CHANGE) minx = ptr - win->_line[y];
  2461. 13222                         *ptr = blank;
  2462. 13223                 }               /* if */
  2463. 13224         }                       /* for */
  2464. 13225         if (minx != _NO_CHANGE) {
  2465. 13226                 if ((win->_minchng[y] > minx) || (win->_minchng[y] == _NO_CHANGE))
  2466. 13227                         win->_minchng[y] = minx;
  2467. 13228                 if (win->_maxchng[y] < maxx - win->_line[y])
  2468. 13229                         win->_maxchng[y] = maxx - win->_line[y];
  2469. 13230         }                       /* if */
  2470. 13231         startx = 0;
  2471. 13232   }
  2472. 13233   return(OK);
  2473. 13234 }
  2474. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2475. src/lib/curses/wclrtoeol.c    
  2476. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2477. 13300 #include <curses.h>
  2478. 13301 #include "curspriv.h"
  2479. 13302
  2480. 13303 /****************************************************************/
  2481. 13304 /* Wclrtoeol() fills the half of the cursor line to the right   */
  2482. 13305 /* Of the cursor in window 'win' with blanks.                   */
  2483. 13306 /****************************************************************/
  2484. 13307
  2485. 13308 int wclrtoeol(win)
  2486. 13309 WINDOW *win;
  2487. 13310 {
  2488. 13311   int *maxx, *ptr, *end, y, x, minx, blank;
  2489. 13312
  2490. 13313   y = win->_cury;
  2491. 13314   x = win->_curx;
  2492. 13315   blank = ' ' | (win->_attrs & ATR_MSK);
  2493. 13316
  2494. 13317   end = &win->_line[y][win->_maxx];
  2495. 13318   minx = _NO_CHANGE;
  2496. 13319   maxx = &win->_line[y][x];
  2497. 13320   for (ptr = maxx; ptr <= end; ptr++) {
  2498. 13321         if (*ptr != blank) {
  2499. 13322                 maxx = ptr;
  2500. 13323                 if (minx == _NO_CHANGE) minx = ptr - win->_line[y];
  2501. 13324                 *ptr = blank;
  2502. 13325         }                       /* if */
  2503. 13326   }                             /* for */
  2504. 13327
  2505. 13328   if (minx != _NO_CHANGE) {
  2506. 13329         if (win->_minchng[y] > minx || win->_minchng[y] == _NO_CHANGE)
  2507. 13330                 win->_minchng[y] = minx;
  2508. 13331         if (win->_maxchng[y] < maxx - win->_line[y])
  2509. 13332                 win->_maxchng[y] = maxx - win->_line[y];
  2510. 13333   }
  2511. 13334   return(OK);
  2512. 13335 }
  2513. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2514. src/lib/curses/wdelch.c    
  2515. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2516. 13400 #include <curses.h>
  2517. 13401 #include "curspriv.h"
  2518. 13402
  2519. 13403 /* Wdelch() deletes the character at the window cursor, and the
  2520. 13404    characters to the right of it are shifted left, inserting a
  2521. 13405    space at the last position of the line.
  2522. 13406 */
  2523. 13407
  2524. 13408 int wdelch(win)
  2525. 13409 WINDOW *win;
  2526. 13410 {
  2527. 13411   int *temp1;
  2528. 13412   int *temp2;
  2529. 13413   int *end;
  2530. 13414   int y = win->_cury;
  2531. 13415   int x = win->_curx;
  2532. 13416   int maxx = win->_maxx;
  2533. 13417
  2534. 13418   end = &win->_line[y][maxx];
  2535. 13419   temp1 = &win->_line[y][x];
  2536. 13420   temp2 = temp1 + 1;
  2537. 13421   while (temp1 < end) *temp1++ = *temp2++;
  2538. 13422   *temp1 = ' ' | (win->_attrs & ATR_MSK);
  2539. 13423   win->_maxchng[y] = maxx;
  2540. 13424   if (win->_minchng[y] == _NO_CHANGE || win->_minchng[y] > x)
  2541. 13425         win->_minchng[y] = x;
  2542. 13426   return(OK);
  2543. 13427 }
  2544. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2545. src/lib/curses/wdeleteln.c    
  2546. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2547. 13500 #include <curses.h>
  2548. 13501 #include "curspriv.h"
  2549. 13502
  2550. 13503 /****************************************************************/
  2551. 13504 /* Wdeleteln() deletes the line at the window cursor, and the   */
  2552. 13505 /* Lines below it are shifted up, inserting a blank line at     */
  2553. 13506 /* The bottom of the window.                                    */
  2554. 13507 /****************************************************************/
  2555. 13508
  2556. 13509 int wdeleteln(win)
  2557. 13510 WINDOW *win;
  2558. 13511 {
  2559. 13512   int *end, *temp, y, blank;
  2560. 13513
  2561. 13514   blank = ' ' | (win->_attrs & ATR_MSK);
  2562. 13515
  2563. 13516   temp = win->_line[win->_cury];
  2564. 13517   for (y = win->_cury; y < win->_regbottom; y++) {
  2565. 13518         win->_line[y] = win->_line[y + 1];
  2566. 13519         win->_minchng[y] = 0;
  2567. 13520         win->_maxchng[y] = win->_maxx;
  2568. 13521   }
  2569. 13522   win->_minchng[y] = 0;
  2570. 13523   win->_maxchng[y] = win->_maxx;
  2571. 13524   win->_line[win->_regbottom] = temp;
  2572. 13525   for (end = &(temp[win->_maxx]); temp <= end;) *temp++ = blank;
  2573. 13526   return(OK);
  2574. 13527 }
  2575. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2576. src/lib/curses/werase.c    
  2577. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2578. 13600 #include <curses.h>
  2579. 13601 #include "curspriv.h"
  2580. 13602
  2581. 13603 /****************************************************************/
  2582. 13604 /* Werase() fills all lines of window 'win' with blanks and po- */
  2583. 13605 /* Sitions the cursor at home in the scroll region.             */
  2584. 13606 /****************************************************************/
  2585. 13607
  2586. 13608 void werase(win)
  2587. 13609 WINDOW *win;
  2588. 13610 {
  2589. 13611   int *end, *start, y, blank;
  2590. 13612
  2591. 13613   blank = ' ' | (win->_attrs & ATR_MSK);
  2592. 13614
  2593. 13615   for (y = win->_regtop; y <= win->_regbottom; y++) {   /* clear all lines */
  2594. 13616         start = win->_line[y];
  2595. 13617         end = &start[win->_maxx];
  2596. 13618         while (start <= end)    /* clear all line */
  2597. 13619                 *start++ = blank;
  2598. 13620         win->_minchng[y] = 0;
  2599. 13621         win->_maxchng[y] = win->_maxx;
  2600. 13622   }
  2601. 13623   win->_cury = win->_regtop;    /* cursor home */
  2602. 13624   win->_curx = 0;
  2603. 13625 }
  2604. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2605. src/lib/curses/wgetch.c    
  2606. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2607. 13700 #include <curses.h>
  2608. 13701 #include <stdio.h>
  2609. 13702 #include "curspriv.h"
  2610. 13703
  2611. 13704 int wgetch(win)
  2612. 13705 WINDOW *win;
  2613. 13706 {
  2614. 13707   bool weset = FALSE;
  2615. 13708   char inp;
  2616. 13709
  2617. 13710   if (!win->_scroll && (win->_flags & _FULLWIN)
  2618. 13711       && win->_curx == win->_maxx - 1 && win->_cury == win->_maxy - 1)
  2619. 13712         return ERR;
  2620. 13713   if (_cursvar.echoit && !_cursvar.rawmode) {
  2621. 13714         cbreak();
  2622. 13715         weset++;
  2623. 13716   }
  2624. 13717   inp = getchar();
  2625. 13718   if (_cursvar.echoit) {
  2626. 13719         mvwaddch(curscr, win->_cury + win->_begy,
  2627. 13720                  win->_curx + win->_begx, inp);
  2628. 13721         waddch(win, inp);
  2629. 13722   }
  2630. 13723   if (weset) nocbreak();
  2631. 13724   return inp;
  2632. 13725 }
  2633. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2634. src/lib/curses/wgetstr.c    
  2635. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2636. 13800 #include <curses.h>
  2637. 13801 #include "curspriv.h"
  2638. 13802
  2639. 13803 /****************************************************************/
  2640. 13804 /* Wgetstr(win,str) reads in a string (terminated by n or r)  */
  2641. 13805 /* To the buffer pointed to by 'str', and displays the input    */
  2642. 13806 /* In window 'win'. The user's erase and kill characters are    */
  2643. 13807 /* Active.                                                      */
  2644. 13808 /****************************************************************/
  2645. 13809
  2646. 13810 int wgetstr(win, str)
  2647. 13811 WINDOW *win;
  2648. 13812 char *str;
  2649. 13813 {
  2650. 13814   while ((*str = wgetch(win)) != ERR && *str != 'n') str++;
  2651. 13815   if (*str == ERR) {
  2652. 13816         *str = '';
  2653. 13817         return ERR;
  2654. 13818   }
  2655. 13819   *str = '';
  2656. 13820   return OK;
  2657. 13821 }
  2658. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2659. src/lib/curses/windel.c    
  2660. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2661. 13900 /****************************************************************/
  2662. 13901 /* Delwin() routine of the PCcurses package.                    */
  2663. 13902 /*                                                              */
  2664. 13903 /****************************************************************/
  2665. 13904 /* This version of curses is based on ncurses, a curses version */
  2666. 13905 /* Originally written by Pavel Curtis at Cornell University.    */
  2667. 13906 /* I have made substantial changes to make it run on IBM PC's,  */
  2668. 13907 /* And therefore consider myself free to make it public domain. */
  2669. 13908 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  2670. 13909 /****************************************************************/
  2671. 13910 /* 1.0: Release:                                        870515  */
  2672. 13911 /****************************************************************/
  2673. 13912 /* Modified to run under the MINIX operating system by Don Cope */
  2674. 13913 /* These changes are also released into the public domain.      */
  2675. 13914 /*                                                      900906  */
  2676. 13915 /****************************************************************/
  2677. 13916
  2678. 13917 #include <stdlib.h>
  2679. 13918 #include <curses.h>
  2680. 13919 #include "curspriv.h"
  2681. 13920
  2682. 13921 /****************************************************************/
  2683. 13922 /* Delwin() deallocates all data allocated by 'win'. If 'win'   */
  2684. 13923 /* Is a subwindow, it uses the original window's lines for sto- */
  2685. 13924 /* Rage, and thus the line arrays are not deallocated.          */
  2686. 13925 /****************************************************************/
  2687. 13926
  2688. 13927 void delwin(win)
  2689. 13928 WINDOW *win;
  2690. 13929 {
  2691. 13930   int i;
  2692. 13931
  2693. 13932   if (!(win->_flags & _SUBWIN)) {       /* subwindow uses 'parent's' lines */
  2694. 13933         for (i = 0; i <= win->_maxy && win->_line[i]; i++)
  2695. 13934                 free(win->_line[i]);
  2696. 13935   }
  2697. 13936   free(win->_minchng);
  2698. 13937   free(win->_maxchng);
  2699. 13938   free(win->_line);
  2700. 13939   free(win);
  2701. 13940 }                               /* delwin */
  2702. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2703. src/lib/curses/winmove.c    
  2704. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2705. 14000 /****************************************************************/
  2706. 14001 /* Mvwin() routine of the PCcurses package                      */
  2707. 14002 /*                                                              */
  2708. 14003 /****************************************************************/
  2709. 14004 /* This version of curses is based on ncurses, a curses version */
  2710. 14005 /* Originally written by Pavel Curtis at Cornell University.    */
  2711. 14006 /* I have made substantial changes to make it run on IBM PC's,  */
  2712. 14007 /* And therefore consider myself free to make it public domain. */
  2713. 14008 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  2714. 14009 /****************************************************************/
  2715. 14010 /* 1.0: Release:                                        870515  */
  2716. 14011 /****************************************************************/
  2717. 14012 /* Modified to run under the MINIX operating system by Don Cope */
  2718. 14013 /* These changes are also released into the public domain.      */
  2719. 14014 /*                                                      900906  */
  2720. 14015 /****************************************************************/
  2721. 14016
  2722. 14017 #include <curses.h>
  2723. 14018 #include "curspriv.h"
  2724. 14019
  2725. 14020 /****************************************************************/
  2726. 14021 /* Mvwin() moves window 'win' to position (begx, begy) on the   */
  2727. 14022 /* Screen.                                                      */
  2728. 14023 /****************************************************************/
  2729. 14024
  2730. 14025 int mvwin(win, begy, begx)
  2731. 14026 WINDOW *win;
  2732. 14027 int begy, begx;
  2733. 14028 {
  2734. 14029   if ((begy + win->_maxy) > (LINES - 1) || (begx + win->_maxx) > (COLS - 1))
  2735. 14030         return(ERR);
  2736. 14031   win->_begy = begy;
  2737. 14032   win->_begx = begx;
  2738. 14033   touchwin(win);
  2739. 14034   return(OK);
  2740. 14035 }                               /* mvwin */
  2741. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2742. src/lib/curses/winsch.c    
  2743. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2744. 14100 #include <curses.h>
  2745. 14101 #include "curspriv.h"
  2746. 14102
  2747. 14103 /* Winsch() inserts character 'c' at the cursor position in
  2748. 14104    window 'win'. The cursor is advanced.
  2749. 14105 */
  2750. 14106
  2751. 14107 int winsch(win, c)
  2752. 14108 WINDOW *win;
  2753. 14109 char c;
  2754. 14110 {
  2755. 14111   int *temp1;
  2756. 14112   int *temp2;
  2757. 14113   int *end;
  2758. 14114   int x = win->_curx;
  2759. 14115   int y = win->_cury;
  2760. 14116   int maxx = win->_maxx;
  2761. 14117
  2762. 14118   if ((c < ' ') && (c == 'n' || c == 'r' || c == 't' || c == 'b'))
  2763. 14119         return(waddch(win, c));
  2764. 14120   end = &win->_line[y][x];
  2765. 14121   temp1 = &win->_line[y][maxx];
  2766. 14122   temp2 = temp1 - 1;
  2767. 14123   if (c < ' ')                  /* if CTRL-char make space for 2 */
  2768. 14124         temp2--;
  2769. 14125   while (temp1 > end) *temp1-- = *temp2--;
  2770. 14126   win->_maxchng[y] = maxx;
  2771. 14127   if ((win->_minchng[y] == _NO_CHANGE) || (win->_minchng[y] > x))
  2772. 14128         win->_minchng[y] = x;
  2773. 14129   return(waddch(win, c));       /* fixes CTRL-chars too */
  2774. 14130 }                               /* winsch */
  2775. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2776. src/lib/curses/winscrol.c    
  2777. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2778. 14200 /****************************************************************/
  2779. 14201 /* Scroll() routine of the PCcurses package                     */
  2780. 14202 /*                                                              */
  2781. 14203 /****************************************************************/
  2782. 14204 /* This version of curses is based on ncurses, a curses version */
  2783. 14205 /* Originally written by Pavel Curtis at Cornell University.    */
  2784. 14206 /* I have made substantial changes to make it run on IBM PC's,  */
  2785. 14207 /* And therefore consider myself free to make it public domain. */
  2786. 14208 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  2787. 14209 /****************************************************************/
  2788. 14210 /* 1.0: Release:                                        870515  */
  2789. 14211 /****************************************************************/
  2790. 14212 /* Modified to run under the MINIX operating system by Don Cope */
  2791. 14213 /* These changes are also released into the public domain.      */
  2792. 14214 /*                                                      900906  */
  2793. 14215 /****************************************************************/
  2794. 14216
  2795. 14217 #include <curses.h>
  2796. 14218 #include "curspriv.h"
  2797. 14219
  2798. 14220 /****************************************************************/
  2799. 14221 /* Scroll() scrolls the scrolling region of 'win', but only if  */
  2800. 14222 /* Scrolling is allowed and if the cursor is inside the scrol-  */
  2801. 14223 /* Ling region.                                                 */
  2802. 14224 /****************************************************************/
  2803. 14225
  2804. 14226 void scroll(win)
  2805. 14227 WINDOW *win;
  2806. 14228 {
  2807. 14229   int i;
  2808. 14230   int *ptr;
  2809. 14231   int *temp;
  2810. 14232   static int blank;
  2811. 14233
  2812. 14234   blank = ' ' | (win->_attrs & ATR_MSK);
  2813. 14235   if ((!win->_scroll)           /* check if window scrolls */
  2814. 14236       ||(win->_cury < win->_regtop)     /* and cursor in region */
  2815. 14237       ||(win->_cury > win->_regbottom)
  2816. 14238         )
  2817. 14239         return;
  2818. 14240
  2819. 14241   temp = win->_line[win->_regtop];
  2820. 14242   for (i = win->_regtop; i < win->_regbottom; i++) {
  2821. 14243         win->_line[i] = win->_line[i + 1];      /* re-arrange line pointers */
  2822. 14244         win->_minchng[i] = 0;
  2823. 14245         win->_maxchng[i] = win->_maxx;
  2824. 14246   }
  2825. 14247   for (ptr = temp; ptr - temp <= win->_maxx; ptr++)
  2826. 14248         *ptr = blank;           /* make a blank line */
  2827. 14249   win->_line[win->_regbottom] = temp;
  2828. 14250   if (win->_cury > win->_regtop)/* if not on top line */
  2829. 14251         win->_cury--;           /* cursor scrolls too */
  2830. 14252   win->_minchng[win->_regbottom] = 0;
  2831. 14253   win->_maxchng[win->_regbottom] = win->_maxx;
  2832. 14254 }                               /* scroll */
  2833. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2834. src/lib/curses/winsertln.c    
  2835. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2836. 14300 #include <curses.h>
  2837. 14301 #include "curspriv.h"
  2838. 14302
  2839. 14303 /****************************************************************/
  2840. 14304 /* Winsertln() inserts a blank line instead of the cursor line  */
  2841. 14305 /* In window 'win' and pushes other lines down.                 */
  2842. 14306 /****************************************************************/
  2843. 14307
  2844. 14308 int winsertln(win)
  2845. 14309 WINDOW *win;
  2846. 14310 {
  2847. 14311   int *temp, *end, y, blank;
  2848. 14312
  2849. 14313   blank = ' ' | (win->_attrs & ATR_MSK);
  2850. 14314   temp = win->_line[win->_regbottom];
  2851. 14315   for (y = win->_regbottom; y > win->_cury; y--) {
  2852. 14316         win->_line[y] = win->_line[y - 1];
  2853. 14317         win->_minchng[y] = 0;
  2854. 14318         win->_maxchng[y] = win->_maxx;
  2855. 14319   }
  2856. 14320   win->_line[win->_cury] = temp;
  2857. 14321   for (end = &temp[win->_maxx]; temp <= end; temp++) *temp = blank;
  2858. 14322   win->_minchng[win->_cury] = 0;
  2859. 14323   win->_maxchng[win->_cury] = win->_maxx;
  2860. 14324   return(OK);
  2861. 14325 }
  2862. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2863. src/lib/curses/wintouch.c    
  2864. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2865. 14400 /****************************************************************/
  2866. 14401 /* Touchwin() routine of the PCcurses package                   */
  2867. 14402 /*                                                              */
  2868. 14403 /****************************************************************/
  2869. 14404 /* This version of curses is based on ncurses, a curses version */
  2870. 14405 /* Originally written by Pavel Curtis at Cornell University.    */
  2871. 14406 /* I have made substantial changes to make it run on IBM PC's,  */
  2872. 14407 /* And therefore consider myself free to make it public domain. */
  2873. 14408 /*              Bjorn Larsson (...mcvax!enea!infovax!bl)        */
  2874. 14409 /****************************************************************/
  2875. 14410 /* 1.0: Release:                                        870515  */
  2876. 14411 /****************************************************************/
  2877. 14412 /* Modified to run under the MINIX operating system by Don Cope */
  2878. 14413 /* These changes are also released into the public domain.      */
  2879. 14414 /*                                                      900906  */
  2880. 14415 /****************************************************************/
  2881. 14416
  2882. 14417 #include <curses.h>
  2883. 14418 #include "curspriv.h"
  2884. 14419
  2885. 14420 /****************************************************************/
  2886. 14421 /* Touchwin() marks all lines of window 'win' as changed, from  */
  2887. 14422 /* The first to the last character on the line.                 */
  2888. 14423 /****************************************************************/
  2889. 14424
  2890. 14425 void touchwin(win)
  2891. 14426 WINDOW *win;
  2892. 14427 {
  2893. 14428   int y;
  2894. 14429   int maxy;
  2895. 14430   int maxx;
  2896. 14431
  2897. 14432   maxy = win->_maxy;
  2898. 14433   maxx = win->_maxx;
  2899. 14434
  2900. 14435   for (y = 0; y <= maxy; y++) {
  2901. 14436         win->_minchng[y] = 0;
  2902. 14437         win->_maxchng[y] = maxx;
  2903. 14438   }                             /* for */
  2904. 14439 }                               /* touchwin */
  2905. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2906. src/lib/editline/editline.h    
  2907. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2908. 14500 /*  $Revision: 1.3 $
  2909. 14501 **
  2910. 14502 **  Internal header file for editline library.
  2911. 14503 */
  2912. 14504 #include <stdio.h>
  2913. 14505 #if     defined(HAVE_STDLIB)
  2914. 14506 #include <stdlib.h>
  2915. 14507 #include <string.h>
  2916. 14508 #endif  /* defined(HAVE_STDLIB) */
  2917. 14509 #if     defined(SYS_UNIX)
  2918. 14510 #include "unix.h"
  2919. 14511 #endif  /* defined(SYS_UNIX) */
  2920. 14512 #if     defined(SYS_OS9)
  2921. 14513 #include "os9.h"
  2922. 14514 #endif  /* defined(SYS_OS9) */
  2923. 14515
  2924. 14516 #if     !defined(SIZE_T)
  2925. 14517 #define SIZE_T  unsigned int
  2926. 14518 #endif  /* !defined(SIZE_T) */
  2927. 14519
  2928. 14520 typedef unsigned char   CHAR;
  2929. 14521
  2930. 14522 #if     defined(HIDE)
  2931. 14523 #define STATIC  static
  2932. 14524 #else
  2933. 14525 #define STATIC  /* NULL */
  2934. 14526 #endif  /* !defined(HIDE) */
  2935. 14527
  2936. 14528 #if     !defined(CONST)
  2937. 14529 #if     defined(__STDC__)
  2938. 14530 #define CONST   const
  2939. 14531 #else
  2940. 14532 #define CONST
  2941. 14533 #endif  /* defined(__STDC__) */
  2942. 14534 #endif  /* !defined(CONST) */
  2943. 14535
  2944. 14536
  2945. 14537 #define MEM_INC         64
  2946. 14538 #define SCREEN_INC      256
  2947. 14539
  2948. 14540 #define DISPOSE(p)      free((char *)(p))
  2949. 14541 #define NEW(T, c)       
  2950. 14542         ((T *)malloc((unsigned int)(sizeof (T) * (c))))
  2951. 14543 #define RENEW(p, T, c)  
  2952. 14544         (p = (T *)realloc((char *)(p), (unsigned int)(sizeof (T) * (c))))
  2953. 14545 #define COPYFROMTO(new, p, len) 
  2954. 14546         (void)memcpy((char *)(new), (char *)(p), (int)(len))
  2955. 14547
  2956. 14548
  2957. 14549 /*
  2958. 14550 **  Variables and routines internal to this package.
  2959. 14551 */
  2960. 14552 extern int      rl_eof;
  2961. 14553 extern int      rl_erase;
  2962. 14554 extern int      rl_intr;
  2963. 14555 extern int      rl_kill;
  2964. 14556 extern int      rl_quit;
  2965. 14557 extern char     *rl_complete();
  2966. 14558 extern int      rl_list_possib();
  2967. 14559 extern void     rl_ttyset();
  2968. 14560 extern void     rl_add_slash();
  2969. 14561
  2970. 14562 #if     !defined(HAVE_STDLIB)
  2971. 14563 extern char     *getenv();
  2972. 14564 extern char     *malloc();
  2973. 14565 extern char     *realloc();
  2974. 14566 extern char     *memcpy();
  2975. 14567 extern char     *strcat();
  2976. 14568 extern char     *strchr();
  2977. 14569 extern char     *strrchr();
  2978. 14570 extern char     *strcpy();
  2979. 14571 extern int      strcmp();
  2980. 14572 extern int      strlen();
  2981. 14573 extern int      strncmp();
  2982. 14574 #endif  /* !defined(HAVE_STDLIB) */
  2983. 14575
  2984. 14576 #if     defined(NEED_STRDUP)
  2985. 14577 extern char     *strdup();
  2986. 14578 #endif
  2987. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2988. src/lib/editline/os9.h    
  2989. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2990. 14600 /*  $Revision: 1.1 $
  2991. 14601 **
  2992. 14602 **  Editline system header file for OS-9 (on 68k).
  2993. 14603 */
  2994. 14604
  2995. 14605 #define CRLF            "rl"
  2996. 14606 #define FORWARD         extern
  2997. 14607
  2998. 14608 #include <dir.h>
  2999. 14609 typedef struct direct   DIRENTRY;
  3000. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3001. src/lib/editline/unix.h    
  3002. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3003. 14700 /*  $Revision: 1.1 $
  3004. 14701 **
  3005. 14702 **  Editline system header file for Unix.
  3006. 14703 */
  3007. 14704
  3008. 14705 #define CRLF            "rn"
  3009. 14706 #define FORWARD         STATIC
  3010. 14707
  3011. 14708 #include <sys/types.h>
  3012. 14709 #include <sys/stat.h>
  3013. 14710
  3014. 14711 #if     defined(USE_DIRENT)
  3015. 14712 #include <dirent.h>
  3016. 14713 typedef struct dirent   DIRENTRY;
  3017. 14714 #else
  3018. 14715 #include <sys/dir.h>
  3019. 14716 typedef struct direct   DIRENTRY;
  3020. 14717 #endif  /* defined(USE_DIRENT) */
  3021. 14718
  3022. 14719 #if     !defined(S_ISDIR)
  3023. 14720 #define S_ISDIR(m)              (((m) & S_IFMT) == S_IFDIR)
  3024. 14721 #endif  /* !defined(S_ISDIR) */
  3025. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3026. src/lib/editline/complete.c    
  3027. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3028. 14800 /*  $Revision: 1.4 $
  3029. 14801 **
  3030. 14802 **  History and file completion functions for editline library.
  3031. 14803 */
  3032. 14804 #include "editline.h"
  3033. 14805
  3034. 14806
  3035. 14807 #if     defined(NEED_STRDUP)
  3036. 14808 /*
  3037. 14809 **  Return an allocated copy of a string.
  3038. 14810 */
  3039. 14811 char *
  3040. 14812 strdup(p)
  3041. 14813     char        *p;
  3042. 14814 {
  3043. 14815     char        *new;
  3044. 14816
  3045. 14817     if ((new = NEW(char, strlen(p) + 1)) != NULL)
  3046. 14818         (void)strcpy(new, p);
  3047. 14819     return new;
  3048. 14820 }
  3049. 14821 #endif  /* defined(NEED_STRDUP) */
  3050. 14822
  3051. 14823 /*
  3052. 14824 **  strcmp-like sorting predicate for qsort.
  3053. 14825 */
  3054. 14826 STATIC int
  3055. 14827 compare(p1, p2)
  3056. 14828     CONST void  *p1;
  3057. 14829     CONST void  *p2;
  3058. 14830 {
  3059. 14831     CONST char  **v1;
  3060. 14832     CONST char  **v2;
  3061. 14833
  3062. 14834     v1 = (CONST char **)p1;
  3063. 14835     v2 = (CONST char **)p2;
  3064. 14836     return strcmp(*v1, *v2);
  3065. 14837 }
  3066. 14839 /*
  3067. 14840 **  Fill in *avp with an array of names that match file, up to its length.
  3068. 14841 **  Ignore . and .. .
  3069. 14842 */
  3070. 14843 STATIC int
  3071. 14844 FindMatches(dir, file, avp)
  3072. 14845     char        *dir;
  3073. 14846     char        *file;
  3074. 14847     char        ***avp;
  3075. 14848 {
  3076. 14849     char        **av;
  3077. 14850     char        **new;
  3078. 14851     char        *p;
  3079. 14852     DIR         *dp;
  3080. 14853     DIRENTRY    *ep;
  3081. 14854     SIZE_T      ac;
  3082. 14855     SIZE_T      len;
  3083. 14856     SIZE_T      choices;
  3084. 14857     SIZE_T      total;
  3085. 14858
  3086. 14859     if ((dp = opendir(dir)) == NULL)
  3087. 14860         return 0;
  3088. 14861
  3089. 14862     av = NULL;
  3090. 14863     ac = 0;
  3091. 14864     len = strlen(file);
  3092. 14865     choices = 0;
  3093. 14866     total = 0;
  3094. 14867     while ((ep = readdir(dp)) != NULL) {
  3095. 14868         p = ep->d_name;
  3096. 14869         if (p[0] == '.' && (p[1] == '' || (p[1] == '.' && p[2] == '')))
  3097. 14870             continue;
  3098. 14871         if (len && strncmp(p, file, len) != 0)
  3099. 14872             continue;
  3100. 14873
  3101. 14874         choices++;
  3102. 14875         if ((total += strlen(p)) > 1024) {
  3103. 14876             /* This is a bit too much. */
  3104. 14877             while (ac > 0) DISPOSE(av[--ac]);
  3105. 14878             continue;
  3106. 14879         }
  3107. 14880
  3108. 14881         if ((ac % MEM_INC) == 0) {
  3109. 14882             if ((new = NEW(char*, ac + MEM_INC)) == NULL) {
  3110. 14883                 total = 0;
  3111. 14884                 break;
  3112. 14885             }
  3113. 14886             if (ac) {
  3114. 14887                 COPYFROMTO(new, av, ac * sizeof (char **));
  3115. 14888                 DISPOSE(av);
  3116. 14889             }
  3117. 14890             *avp = av = new;
  3118. 14891         }
  3119. 14892
  3120. 14893         if ((av[ac] = strdup(p)) == NULL) {
  3121. 14894             if (ac == 0)
  3122. 14895                 DISPOSE(av);
  3123. 14896             total = 0;
  3124. 14897             break;
  3125. 14898         }
  3126. 14899         ac++;
  3127. 14900     }
  3128. 14901
  3129. 14902     /* Clean up and return. */
  3130. 14903     (void)closedir(dp);
  3131. 14904     if (total > 1024) {
  3132. 14905         char many[sizeof(total) * 3];
  3133. 14906         p = many + sizeof(many);
  3134. 14907         *--p = '';
  3135. 14908         while (choices > 0) {
  3136. 14909            *--p = '0' + choices % 10;
  3137. 14910            choices /= 10;
  3138. 14911         }
  3139. 14912         while (p > many + sizeof(many) - 8) *--p = ' ';
  3140. 14913         if ((p = strdup(p)) != NULL) av[ac++] = p;
  3141. 14914         if ((p = strdup("choices")) != NULL) av[ac++] = p;
  3142. 14915     } else {
  3143. 14916         if (ac)
  3144. 14917             qsort(av, ac, sizeof (char **), compare);
  3145. 14918     }
  3146. 14919     return ac;
  3147. 14920 }
  3148. 14922 /*
  3149. 14923 **  Split a pathname into allocated directory and trailing filename parts.
  3150. 14924 */
  3151. 14925 STATIC int
  3152. 14926 SplitPath(path, dirpart, filepart)
  3153. 14927     char        *path;
  3154. 14928     char        **dirpart;
  3155. 14929     char        **filepart;
  3156. 14930 {
  3157. 14931     static char DOT[] = ".";
  3158. 14932     char        *dpart;
  3159. 14933     char        *fpart;
  3160. 14934
  3161. 14935     if ((fpart = strrchr(path, '/')) == NULL) {
  3162. 14936         if ((dpart = strdup(DOT)) == NULL)
  3163. 14937             return -1;
  3164. 14938         if ((fpart = strdup(path)) == NULL) {
  3165. 14939             DISPOSE(dpart);
  3166. 14940             return -1;
  3167. 14941         }
  3168. 14942     }
  3169. 14943     else {
  3170. 14944         if ((dpart = strdup(path)) == NULL)
  3171. 14945             return -1;
  3172. 14946         dpart[fpart - path + 1] = '';
  3173. 14947         if ((fpart = strdup(++fpart)) == NULL) {
  3174. 14948             DISPOSE(dpart);
  3175. 14949             return -1;
  3176. 14950         }
  3177. 14951     }
  3178. 14952     *dirpart = dpart;
  3179. 14953     *filepart = fpart;
  3180. 14954     return 0;
  3181. 14955 }
  3182. 14957 /*
  3183. 14958 **  Attempt to complete the pathname, returning an allocated copy.
  3184. 14959 **  Fill in *unique if we completed it, or set it to 0 if ambiguous.
  3185. 14960 */
  3186. 14961 char *
  3187. 14962 rl_complete(pathname, unique)
  3188. 14963     char        *pathname;
  3189. 14964     int         *unique;
  3190. 14965 {
  3191. 14966     char        **av;
  3192. 14967     char        *dir;
  3193. 14968     char        *file;
  3194. 14969     char        *new;
  3195. 14970     char        *p;
  3196. 14971     SIZE_T      ac;
  3197. 14972     SIZE_T      end;
  3198. 14973     SIZE_T      i;
  3199. 14974     SIZE_T      j;
  3200. 14975     SIZE_T      len;
  3201. 14976
  3202. 14977     if (SplitPath(pathname, &dir, &file) < 0)
  3203. 14978         return NULL;
  3204. 14979     if ((ac = FindMatches(dir, file, &av)) == 0) {
  3205. 14980         DISPOSE(dir);
  3206. 14981         DISPOSE(file);
  3207. 14982         return NULL;
  3208. 14983     }
  3209. 14984
  3210. 14985     p = NULL;
  3211. 14986     len = strlen(file);
  3212. 14987     if (ac == 1) {
  3213. 14988         /* Exactly one match -- finish it off. */
  3214. 14989         *unique = 1;
  3215. 14990         j = strlen(av[0]) - len + 2;
  3216. 14991         if ((p = NEW(char, j + 1)) != NULL) {
  3217. 14992             COPYFROMTO(p, av[0] + len, j);
  3218. 14993             if ((new = NEW(char, strlen(dir) + strlen(av[0]) + 2)) != NULL) {
  3219. 14994                 (void)strcpy(new, dir);
  3220. 14995                 (void)strcat(new, "/");
  3221. 14996                 (void)strcat(new, av[0]);
  3222. 14997                 rl_add_slash(new, p);
  3223. 14998                 DISPOSE(new);
  3224. 14999             }
  3225. 15000         }
  3226. 15001     }
  3227. 15002     else {
  3228. 15003         *unique = 0;
  3229. 15004         if (len) {
  3230. 15005             /* Find largest matching substring. */
  3231. 15006             for (i = len, end = strlen(av[0]); i < end; i++)
  3232. 15007                 for (j = 1; j < ac; j++)
  3233. 15008                     if (av[0][i] != av[j][i])
  3234. 15009                         goto breakout;
  3235. 15010   breakout:
  3236. 15011             if (i > len) {
  3237. 15012                 j = i - len + 1;
  3238. 15013                 if ((p = NEW(char, j)) != NULL) {
  3239. 15014                     COPYFROMTO(p, av[0] + len, j);
  3240. 15015                     p[j - 1] = '';
  3241. 15016                 }
  3242. 15017             }
  3243. 15018         }
  3244. 15019     }
  3245. 15020
  3246. 15021     /* Clean up and return. */
  3247. 15022     DISPOSE(dir);
  3248. 15023     DISPOSE(file);
  3249. 15024     for (i = 0; i < ac; i++)
  3250. 15025         DISPOSE(av[i]);
  3251. 15026     DISPOSE(av);
  3252. 15027     return p;
  3253. 15028 }
  3254. 15030 /*
  3255. 15031 **  Return all possible completions.
  3256. 15032 */
  3257. 15033 int
  3258. 15034 rl_list_possib(pathname, avp)
  3259. 15035     char        *pathname;
  3260. 15036     char        ***avp;
  3261. 15037 {
  3262. 15038     char        *dir;
  3263. 15039     char        *file;
  3264. 15040     int         ac;
  3265. 15041
  3266. 15042     if (SplitPath(pathname, &dir, &file) < 0)
  3267. 15043         return 0;
  3268. 15044     ac = FindMatches(dir, file, avp);
  3269. 15045     DISPOSE(dir);
  3270. 15046     DISPOSE(file);
  3271. 15047     return ac;
  3272. 15048 }
  3273. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3274. src/lib/editline/editline.c    
  3275. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3276. 15100 /*  $Revision: 1.7 $
  3277. 15101 **
  3278. 15102 **  Main editing routines for editline library.
  3279. 15103 */
  3280. 15104 #include "editline.h"
  3281. 15105 #include <signal.h>
  3282. 15106 #include <ctype.h>
  3283. 15107
  3284. 15108 /*
  3285. 15109 **  Manifest constants.
  3286. 15110 */
  3287. 15111 #define SCREEN_WIDTH    80
  3288. 15112 #define SCREEN_ROWS     24
  3289. 15113 #define NO_ARG          (-1)
  3290. 15114 #define DEL             127
  3291. 15115 #define CTL(x)          ((x) & 0x1F)
  3292. 15116 #define ISCTL(x)        ((x) && (x) < ' ')
  3293. 15117 #define UNCTL(x)        ((x) + 64)
  3294. 15118 #define META(x)         ((x) | 0x80)
  3295. 15119 #define ISMETA(x)       ((x) & 0x80)
  3296. 15120 #define UNMETA(x)       ((x) & 0x7F)
  3297. 15121 #if     !defined(HIST_SIZE)
  3298. 15122 #define HIST_SIZE       20
  3299. 15123 #endif  /* !defined(HIST_SIZE) */
  3300. 15124
  3301. 15125 /*
  3302. 15126 **  Command status codes.
  3303. 15127 */
  3304. 15128 typedef enum _STATUS {
  3305. 15129     CSdone, CSeof, CSmove, CSdispatch, CSstay, CSsignal
  3306. 15130 } STATUS;
  3307. 15131
  3308. 15132 /*
  3309. 15133 **  The type of case-changing to perform.
  3310. 15134 */
  3311. 15135 typedef enum _CASE {
  3312. 15136     TOupper, TOlower
  3313. 15137 } CASE;
  3314. 15138
  3315. 15139 /*
  3316. 15140 **  Key to command mapping.
  3317. 15141 */
  3318. 15142 typedef struct _KEYMAP {
  3319. 15143     CHAR        Key;
  3320. 15144     STATUS      (*Function)();
  3321. 15145 } KEYMAP;
  3322. 15146
  3323. 15147 /*
  3324. 15148 **  Command history structure.
  3325. 15149 */
  3326. 15150 typedef struct _HISTORY {
  3327. 15151     int         Size;
  3328. 15152     int         Pos;
  3329. 15153     CHAR        *Lines[HIST_SIZE];
  3330. 15154 } HISTORY;
  3331. 15155
  3332. 15156 /*
  3333. 15157 **  Globals.
  3334. 15158 */
  3335. 15159 int             rl_eof;
  3336. 15160 int             rl_erase;
  3337. 15161 int             rl_intr;
  3338. 15162 int             rl_kill;
  3339. 15163 int             rl_quit;