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

操作系统开发

开发平台:

WINDOWS

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