home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 11345 < prev    next >
Internet Message Format  |  1994-10-16  |  23KB

  1. Path: wupost!howland.reston.ans.net!EU.net!sunic!news.funet.fi!news.csc.fi!news.helsinki.fi!not-for-mail
  2. From: hurtta@cc.Helsinki.FI (Kari Hurtta)
  3. Newsgroups: alt.sources.patch,alt.sources
  4. Subject: kehpager V1.2 to kehpager V1.21 (part 2/2)
  5. Followup-To: alt.sources.d
  6. Date: 16 Oct 1994 16:12:59 +0200
  7. Organization: University of Helsinki
  8. Lines: 780
  9. Message-ID: <37rcdb$bq8@kruuna.Helsinki.FI>
  10. Reply-To: "Kari E. Hurtta" <Kari.Hurtta@Helsinki.FI>
  11. NNTP-Posting-Host: kruuna.helsinki.fi
  12. Mime-Version: 1.0
  13. Content-Type: text/plain; charset=ISO-8859-1
  14. Content-Transfer-Encoding: 8bit
  15.  
  16. Title: kehpager V1.21 - Charset aware pager for VTxxx terminals
  17. Patch-To: kehpager V1.2
  18. Archive-Name: kehpager0120/patch1.2
  19. Author: Kari E. Hurtta <Kari.Hurtta@Helsinki.FI>
  20. Part: 2/2
  21. Environment: Ansi C, SunOS 4.1.2 (OS/MP 4.1B), 4.1.3, 5.2, 5.3, 
  22.     HP-UX A.09.01 (?), IRIX 4.0.5 (?), IRIX 5.2, FreeBSD (?), 
  23.     NetBSD(?), 386BSD(?), VTxxx
  24.  
  25. #!/bin/sh
  26. # this is part 2 of a multipart archive
  27. # do not concatenate these parts, unpack them in order with /bin/sh
  28. # file patch1.diff continued
  29. #
  30. CurArch=2
  31. if test ! -r s2_seq_.tmp
  32. then echo "Please unpack part 1 first!"
  33.      exit 1; fi
  34. ( read Scheck
  35.   if test "$Scheck" != $CurArch
  36.   then echo "Please unpack part $Scheck next!"
  37.        exit 1;
  38.   else exit 0; fi
  39. ) < s2_seq_.tmp || exit 1
  40. sed 's/^X//' << 'SHAR_EOF' >> patch1.diff
  41. X      make_default(&key_flush,tty_state.c_cc[VFLUSHO]);
  42. X  #else
  43. X--- 799,806 ----
  44. X    make_default(&key_flush,tty_state.c_cc[VDISCARD]);
  45. X  #else
  46. X  #ifdef VFLUSHO
  47. X! /* In Irix 4 termios and termio have same structure, but not in Irix 5 */
  48. X! #if defined (__sgi) && !defined(_SVR4_SOURCE)
  49. X    if (tty_state.c_line == LDISC1)
  50. X      make_default(&key_flush,tty_state.c_cc[VFLUSHO]);
  51. X  #else
  52. X***************
  53. X*** 807,813 ****
  54. X  #endif
  55. X  #endif
  56. X    make_default(&key_abort,tty_state.c_cc[VQUIT]);  
  57. X! #ifdef __sgi
  58. X    if (tty_state.c_line == LDISC1) {
  59. X      make_default(&key_res1,tty_state.c_cc[VSTART]);  
  60. X      make_default(&key_res2,tty_state.c_cc[VSTOP]);
  61. X--- 809,816 ----
  62. X  #endif
  63. X  #endif
  64. X    make_default(&key_abort,tty_state.c_cc[VQUIT]);  
  65. X! /* In Irix 4 termios and termio have same structure, but not in Irix 5 */
  66. X! #if defined (__sgi) && !defined(_SVR4_SOURCE)
  67. X    if (tty_state.c_line == LDISC1) {
  68. X      make_default(&key_res1,tty_state.c_cc[VSTART]);  
  69. X      make_default(&key_res2,tty_state.c_cc[VSTOP]);
  70. X***************
  71. X*** 821,827 ****
  72. X    make_default(&key_redraw,tty_state.c_cc[VREPRINT]);
  73. X  #else
  74. X  #ifdef VRPRNT
  75. X! #ifdef __sgi
  76. X    if (tty_state.c_line == LDISC1)
  77. X      make_default(&key_redraw,tty_state.c_cc[VRPRNT]);
  78. X  #else
  79. X--- 824,831 ----
  80. X    make_default(&key_redraw,tty_state.c_cc[VREPRINT]);
  81. X  #else
  82. X  #ifdef VRPRNT
  83. X! /* In Irix 4 termios and termio have same structure, but not in Irix 5 */
  84. X! #if defined (__sgi) && !defined(_SVR4_SOURCE)
  85. X    if (tty_state.c_line == LDISC1)
  86. X      make_default(&key_redraw,tty_state.c_cc[VRPRNT]);
  87. X  #else
  88. X***************
  89. X*** 833,839 ****
  90. X    make_default(&key_edel,tty_state.c_cc[VERASE]);
  91. X  
  92. X  
  93. X! #ifdef __sgi
  94. X    if (tty_state.c_line != LDISC1) {
  95. X      tty_state.c_line = LDISC1;      /* BSD line discipline */
  96. X      tty_state.c_cc[VLNEXT] = 'V'&31;
  97. X--- 837,844 ----
  98. X    make_default(&key_edel,tty_state.c_cc[VERASE]);
  99. X  
  100. X  
  101. X! /* In Irix 4 termios and termio have same structure, but not in Irix 5 */
  102. X! #if defined (__sgi) && !defined(_SVR4_SOURCE)
  103. X    if (tty_state.c_line != LDISC1) {
  104. X      tty_state.c_line = LDISC1;      /* BSD line discipline */
  105. X      tty_state.c_cc[VLNEXT] = 'V'&31;
  106. X***************
  107. X*** 845,851 ****
  108. X      make_default(&key_flush,tty_state.c_cc[VFLUSHO]);
  109. X      tty_state.c_cc[VSTOP] = 'S'&31;
  110. X      make_default(&key_res2,tty_state.c_cc[VSTOP]);
  111. X!     tty_state.c_cc[VSTART] = 'O'%31;
  112. X      make_default(&key_res1,tty_state.c_cc[VSTART]);  
  113. X    }
  114. X  #endif
  115. X--- 850,856 ----
  116. X      make_default(&key_flush,tty_state.c_cc[VFLUSHO]);
  117. X      tty_state.c_cc[VSTOP] = 'S'&31;
  118. X      make_default(&key_res2,tty_state.c_cc[VSTOP]);
  119. X!     tty_state.c_cc[VSTART] = 'O'&31;
  120. X      make_default(&key_res1,tty_state.c_cc[VSTART]);  
  121. X    }
  122. X  #endif
  123. X***************
  124. X*** 921,929 ****
  125. X    tty_state.c_oflag &= ~OCRNL;     /* No CR -> LF mapping on output */
  126. X  #endif
  127. X  #ifdef OLCUC
  128. X!   tty_state.c_oflag &= ~OLCUC;     /* No lower-case -> upper-case mappin on 
  129. X                        output */
  130. X  #endif
  131. X  #if (defined(TABDLY) && (defined(XTABS)) || defined(TAB3)) || defined(OXTABS)
  132. X  #if defined(TABDLY) && defined(XTABS)
  133. X  /* SunOS */
  134. X--- 926,938 ----
  135. X    tty_state.c_oflag &= ~OCRNL;     /* No CR -> LF mapping on output */
  136. X  #endif
  137. X  #ifdef OLCUC
  138. X!   tty_state.c_oflag &= ~OLCUC;     /* No lower-case -> upper-case mapping on 
  139. X                        output */
  140. X  #endif
  141. X+ #ifdef ONOCR
  142. X+   tty_state.c_oflag &= ~ONOCR;      /* Transmit CR also in column 0 */
  143. X+ #endif
  144. X+ 
  145. X  #if (defined(TABDLY) && (defined(XTABS)) || defined(TAB3)) || defined(OXTABS)
  146. X  #if defined(TABDLY) && defined(XTABS)
  147. X  /* SunOS */
  148. X***************
  149. X*** 1030,1036 ****
  150. X      print_error(errno,"Error restoring of SIGHUP (sigaction)");
  151. X  
  152. X    if (-1 == close(terminal))
  153. X! #ifdef __sgi
  154. X      if (ENODEV != errno)   /* I don't know from where this error comes ! */
  155. X  #endif
  156. X        print_error(errno,"Error when closing terminal");
  157. X--- 1039,1045 ----
  158. X      print_error(errno,"Error restoring of SIGHUP (sigaction)");
  159. X  
  160. X    if (-1 == close(terminal))
  161. X! #ifdef CLOSEBUG
  162. X      if (ENODEV != errno)   /* I don't know from where this error comes ! */
  163. X  #endif
  164. X        print_error(errno,"Error when closing terminal");
  165. X***************
  166. X*** 1155,1163 ****
  167. X  
  168. X    /* hopeless */
  169. X    if (terminal_have_lost) {
  170. X-     /* We should not be here ... */
  171. X-     print_notify("(%s) read_from_terminal/terminal_have_lost = 1, aborting...",
  172. X-          prog);
  173. X      
  174. X      reset_terminal_state();    /* give original terminal characters */
  175. X      set_caller_ttystate();
  176. X--- 1164,1169 ----
  177. X***************
  178. X*** 1164,1170 ****
  179. X      
  180. X      close_files();
  181. X      close_terminal();
  182. X!     
  183. X      abort();
  184. X    }
  185. X    if (!tty_state_set) set_pager_ttystate();
  186. X--- 1170,1181 ----
  187. X      
  188. X      close_files();
  189. X      close_terminal();
  190. X! 
  191. X!     /* We should not be here ... */
  192. X!     print_notify("(%s) read_from_terminal/terminal_have_lost = 1, aborting...",
  193. X!          prog);
  194. X! 
  195. X!     flush_error_buffer();
  196. X      abort();
  197. X    }
  198. X    if (!tty_state_set) set_pager_ttystate();
  199. SHAR_EOF
  200. chmod 0644 patch1.diff || echo "restore of patch1.diff fails"
  201. sed 's/^X//' << 'SHAR_EOF' > patch1.kehpagerrc &&
  202. X# Init file for kehpager ($HOME/.kehpagerrc)
  203. X
  204. X# In this file are default values of fields (this is for information only)
  205. X# If tou want change some value put that field to
  206. X#                   $HOME/.kehpagerrc            (per user file)
  207. X#             or to .../kehpager.init            (global file)
  208. X
  209. X# Input file options ---------------------------------------------------------
  210. X
  211. X# Charset of input file(s)
  212. X# Values:               Ascii             (option -A)
  213. X#                       Latin/1           (option -L)
  214. X#                       Latin/2           (option -L2)
  215. X#                       Latin/3           (option -L3)
  216. X#                       Latin/4           (option -L4)
  217. X#                       Latin/5           (option -L5)
  218. X#                       Multinational     (option -M)
  219. X#                       Finnish           (option -F)
  220. X#                       UK-ASCII          (option -UK)
  221. X#                       Norwegian         (option -NR)
  222. X#            Swedish           (option -SW)    
  223. X#                       French Canadian   (option -CA)
  224. X#                       French/Belgian    (option -FR)
  225. X#                       German            (option -GR)
  226. X#                       Spanish           (option -SP)
  227. X#                       Italian           (option -IT)
  228. X#                       MS-DOS CP437      (option -PC)
  229. X#                       Macintosh         (option -MAC)
  230. X  input.charset:            Latin/1
  231. X# What charset will use if with -CS option have used null name
  232. X  input.charset.null:       Ascii
  233. X
  234. X# Content-type of input file(s)
  235. X# Values:               Terminal          (option -tr)
  236. X#                       Text/Plain        (option -pl)
  237. X#                       Text/Enriched     (option -er)
  238. X#                       Text/Richtext     (option -rt)
  239. X  input.content_type:       Terminal
  240. X
  241. X# Should kehpager interpret TAB,SHY,NBSP -characters in input files
  242. X  input.interpret_tab:      Enabled        # (options: -t -t+)
  243. X
  244. X# Should kehpager wrap words in end of line
  245. X  input.wordwrap:           Enabled        # (options: -w -w+)
  246. X
  247. X# Should enriched (and richtext) text be fully justified by default.
  248. X# Enabled: <FlushBoth> is default. Disabled: <FlushLeft> is default.
  249. X  input.full_justify:       Disabled        # (options: -j -j+)
  250. X
  251. X# Should hekpager eat some spaces
  252. X  input.eat_spaces:         Enabled        # (options: -sp -sp+)
  253. X
  254. X# Should kehpager uses prompt
  255. X  use.prompt:               Enabled        # (options: -p -p+)
  256. X  
  257. X# Should kehpager shows time in prompt
  258. X  use.prompt.time:          Enabled        # (options: -st -st+)
  259. X
  260. X# Should kehpager scrolling screen when going next or previous page in file
  261. X  use.scrolling:            Enabled        # (options: -s -s+)
  262. X
  263. X# Should waits that user press quit key (normally q, when it reaches last page
  264. X# in (last) file
  265. X  use.wait_quit:            Enabled        # (options: -wt -wt+)
  266. X
  267. X# Default lines of terminal
  268. X  use.terminal.lines:       24           # (***)
  269. X
  270. X# Default columns of terminal
  271. X  use.terminal.columns:     80               # (***)
  272. X
  273. X# (***) Environment variables $LINES and $COLUMNS is used as default size of
  274. X# terminal if available and following is set:
  275. X  env.size:            True
  276. X
  277. X# Values used when kehpager exits --------------------------------------------
  278. X
  279. X# Should kehpager personality to 8bit when it exits
  280. X# exit.personality_8bit:    Disabled                             # (*)
  281. X
  282. X# Should kehpager turn Multinational mode (8bit -mode) when it exits
  283. X# exit.multinational:       Enabled                              # (*)
  284. X
  285. X# Should kehpager turn autowrap on when it exits
  286. X  exit.autowrap:            Enabled                              # (*)
  287. X
  288. X# Should cursor keys send application mode codes 
  289. X  exit.application_cursor_keys:    Disabled                      # (*)
  290. X
  291. X# Should keys uses rigth legend characters 
  292. X#      Enabled = right legend
  293. X#      Disbaled = left legend
  294. X  exit.data_processing_keys:       Disabled                      # (*)
  295. X
  296. X# Should terminal acs with LF as CR LF and sould RETURN produce CR LF
  297. X  exit.newline:                    Disabled                      # (*)
  298. X
  299. X# Should terminal uses in Multinational mode Latin/1 -font instead of 
  300. X#    Multinational -font
  301. X# This apply to all terminals which supports Latin/1 (not only VT300 series)
  302. X  exit.vt300.8bit_latin1:   Disabled
  303. X
  304. X# Values used when kehpager starts -------------------------------------------
  305. X
  306. X# Keyboard language - needed for correct font in national mode
  307. X# Supported values:                                     (option: -N )
  308. X#      1 = North American (ASCII)
  309. X#      2 = British (UK-ASCII)
  310. X#      3 = Flemish / 14 = French/Belgian
  311. X#      4 = French Canadian
  312. X#      5 = Danish / 13 = Norwegian
  313. X#      6 = Finnish
  314. X#      7 = German
  315. X#      9 = Italian
  316. X#      12 = Swedish
  317. X#      15 = Spanish
  318. X# If this values is incorrect, kehpager works incorrectly !!!
  319. X# use.keyboard_language:    6                                    # (*)
  320. X
  321. X# Should kehpager use G2 (and posibbly G3) in vt100 
  322. X  use.vt100.G2_available:   Disabled
  323. X
  324. X# Should kehpager limit queries to known with particular terminal type
  325. X  use.limited.queries:      Disabled           # (options: -q, -q+)
  326. X
  327. X# Force National/Multinational mode
  328. X#                 Values:   None
  329. X#                           National             (option: -7)
  330. X#                           Multinational        (option: -8)
  331. X  force.mode:               None
  332. X
  333. X# Force Latin/1 without 8bit test on Xterm. Terminal is considired
  334. X# to be xterm if $TERM is xterm (or $DISPLAY is defined (**))
  335. X  force.xterm.latin1:       Enabled            # (options: -X, -X+)
  336. X# In xterm this should be enabled or 
  337. X#    use.keyboard_language: 1
  338. X# Without that xterm works incorrectly 
  339. X# (**) $DISPLAY is looked only if following is enabled:
  340. X     env.display:           Disabled
  341. X# In our environment DISPLAY is always assigned to value of last X-session
  342. X# so it isn't realiable test 
  343. X
  344. X# (*) Value in this file is only used, if terminal don't report value for that
  345. X#     field
  346. X
  347. X# Following entries can force kehpager to think that terminal have or haven't
  348. X# some feature.
  349. X#  Possible features:    None            (resets field)
  350. X#            Ins/Del characters/lines
  351. X#            Banks G2 & G3 (changeable)
  352. X#            Latin/1 charset
  353. X#            Multinational charset
  354. X#            Technical charset        
  355. X#            C1 control characters
  356. X#            National charset
  357. X#            Shoft characters            # not used
  358. X#            132 columns                # not used
  359. X#            Selective erase                # not used
  360. X#            User defined keys            # not used
  361. X#            Horizontal scrolling            # not used
  362. X#            ReGIS graphic                # not used
  363. X#            SIXEL graphic                # not used
  364. X#            Printer port                # not used
  365. X#            Terminal interrogation commands
  366. X
  367. X# Forces to kehpager think that terminal have some feature even if it haven't.
  368. X# force.feature.enabled:    None
  369. X
  370. X# Forces to kehpager think that terminal haven't some feature even that 
  371. X# terminal reports existence of feature.
  372. X# force.feature.disabled:   None
  373. X
  374. X# If terminal have Technical charset, then use it.
  375. X# You want disbale this if you want that kehpager uses Latin/1 and 
  376. X# Multinational in same time (kehpager can't use same time Latin/1, 
  377. X# Multinational and Technical -charset). You need Technical -charset only
  378. X# if you want show files with have MSDOS (CP 437) charset.
  379. X# use.technical:            Enabled
  380. X
  381. X# Timer values ---------------------------------------------------------------
  382. X# Resulation of timers have 0.1 seconds
  383. X
  384. X  timer.per_char:           0.1
  385. X  timer.identification:     5.0
  386. X  timer.test_8bit:          5.0
  387. X  timer.states_first:       3.0
  388. X  timer.states_interval:    1.0
  389. SHAR_EOF
  390. chmod 0444 patch1.kehpagerrc || echo "restore of patch1.kehpagerrc fails"
  391. sed 's/^X//' << 'SHAR_EOF' > patch1.schedule.c &&
  392. X/*  file: schedule.c
  393. X *
  394. X *  kehpager, Charset aware pager, Kari E. Hurtta
  395. X *
  396. X *  Copyright (c) 1994 Kari E. Hurtta
  397. X *
  398. X *  Redistribution and use in source and binary forms are permitted
  399. X *  provided that the above copyright notice and this paragraph are
  400. X *  duplicated in all such forms. This software is provided 'as is'
  401. X *  and without any warranty. 
  402. X */
  403. X
  404. X#include <stddef.h>
  405. X#include <string.h>
  406. X#include <stdio.h>
  407. X#include <stdlib.h>
  408. X#include <ctype.h>
  409. X/* #include <signal.h> terminal.h includes this */
  410. X
  411. X#include <sys/types.h>
  412. X#include <sys/time.h>
  413. X#include <fcntl.h>
  414. X#if defined(SUNOS4) || defined(SUNOS5)
  415. X#include <sys/filio.h>
  416. X#else
  417. X#include <sys/ioctl.h>
  418. X#endif
  419. X#include <unistd.h>
  420. X
  421. X#include <time.h>
  422. X
  423. X
  424. X#include <errno.h>
  425. Xextern int errno;
  426. X
  427. X#include "kehpager.h"
  428. X#include "memory.h"
  429. X#include "charset.h"
  430. X
  431. X#include "schedule.h"
  432. X
  433. X#include "terminal.h"
  434. X
  435. X#include "control.h"
  436. X#include "esc.h"
  437. X#include "window.h"
  438. X#include "keyboard.h"
  439. X
  440. Xint cancel = 0;
  441. X
  442. Xvoid real_schedule(int *FP, int *EOF_IN_FILE, int *NOT_SELECTABLE,
  443. X          void (*file_handler)(void),
  444. X          int (*timeout_callback)(long *value),
  445. X          void (*timeout_handler)(int key),
  446. X          int *ready, int (* callback_before)(void),
  447. X          void (* callback_after)(void),
  448. X          int call_parser
  449. X          ) {
  450. X#ifdef _HPUX_SOURCE
  451. X  int readfs,writefs;
  452. X#else
  453. X  fd_set readfs,writefs;
  454. X#endif
  455. X  struct timeval *timeout,Timeout;
  456. X  long atime;
  457. X  int res;
  458. X  int i;
  459. X
  460. X  int tmp_ready=0;
  461. X  if (!ready)
  462. X    ready = &tmp_ready;
  463. X
  464. X  while (!(*ready) || (!tmp_ready && !quitflag)) {
  465. X    int skip = 0, was_input = 0;
  466. X    int biggest = terminal;
  467. X    int have_file;
  468. X    int timeout_key = 0;
  469. X
  470. X    tmp_ready = 1;
  471. X    
  472. X    skip = (* callback_before)();
  473. X
  474. X    /* check pointers */
  475. X    have_file = FP && EOF_IN_FILE && NOT_SELECTABLE;
  476. X
  477. X#ifdef _HPUX_SOURCE
  478. X    readfs = 1 << terminal;    
  479. X    writefs = 0;
  480. X#else
  481. X    FD_ZERO(&readfs);
  482. X    FD_SET(terminal,&readfs);
  483. X    FD_ZERO(&writefs);
  484. X#endif
  485. X
  486. X    if (need_line_flush() || need_flush_buffer()) {
  487. X#ifdef _HPUX_SOURCE
  488. X      writefs |= 1 << terminal;
  489. X#else
  490. X      FD_SET(terminal,&writefs);
  491. X#endif
  492. X    }
  493. X
  494. X    
  495. X    if (have_file && -1 != (*FP) && !(*EOF_IN_FILE)) {
  496. X      if (!(*NOT_SELECTABLE)) {
  497. X#ifdef _HPUX_SOURCE
  498. X    readfs |= 1 << (*FP);
  499. X#else
  500. X    FD_SET((*FP),&readfs);
  501. X#endif
  502. X    if ((*FP) > biggest) biggest = (*FP);
  503. X      } else skip = 1;
  504. X    }
  505. X
  506. X    if (skip) {
  507. X      tmp_ready = 0;
  508. X      timeout = &Timeout;
  509. X      Timeout.tv_sec = 0;
  510. X      Timeout.tv_usec = 0;
  511. X    } else if (0 != (timeout_key=timeout_callback(&atime))) {
  512. X      timeout = &Timeout;
  513. X      Timeout.tv_sec = atime / 10L;
  514. X      Timeout.tv_usec = ( atime % 10L) * 100000L;
  515. X    } else timeout = NULL;
  516. X
  517. X    if (DEBUG_FILIO || DEBUG_TERM || DEBUG_BUFFER) {
  518. X      print_debug("Doing select: max fd=%d, %s (skip=%d)",
  519. X          biggest, timeout ? "timeout" : "no timeout",
  520. X          skip);
  521. X    }
  522. X
  523. X#ifdef _HPUX_SOURCE
  524. X    res = select(biggest+1,&readfs,&writefs,(int *)NULL,
  525. X             timeout);
  526. X#else
  527. X    res = select(biggest+1,&readfs,&writefs,(fd_set *)NULL,
  528. X             timeout);
  529. X#endif
  530. X
  531. X    if (-1 == res) {
  532. X      int code = errno;
  533. X      if (DEBUG_FILIO) {
  534. X    print_debug("Got errno=%d from select",
  535. X            code);
  536. X      }
  537. X      if (EINTR == code) {
  538. X    tmp_ready = 0;
  539. X    continue;
  540. X      }
  541. X      if (have_file && ENXIO == code && !(*NOT_SELECTABLE)) {
  542. X    not_selectable(FP);
  543. X    tmp_ready = 0;
  544. X    continue;
  545. X      }
  546. X      print_error(code,
  547. X          "(%s) Error when waiting response of terminal from /dev/tty",
  548. X          prog);
  549. X      quitflag = 1;
  550. X      *ready = 1;
  551. X      continue;
  552. X    }
  553. X
  554. X    if (0 == res && !skip) 
  555. X      (*timeout_handler)(timeout_key);
  556. X
  557. X    if (
  558. X#ifdef _HPUX_SOURCE
  559. X    readfs & (1 << terminal)
  560. X#else
  561. X    FD_ISSET(terminal,&readfs)
  562. X#endif
  563. X    )
  564. X      {    
  565. X    CHAR input_buffer[INPUT_BUFFER_SIZE+1];
  566. X    int len = read_from_terminal(input_buffer);
  567. X    if (len > 0) parse_input(input_buffer, len); 
  568. X    was_input = 1;
  569. X      }
  570. X    
  571. X    cancel = 0;
  572. X
  573. X    for (i = 0; command_len > i;) {
  574. X      CHAR *name;
  575. X      if (DEBUG_TERM) {
  576. X    CHAR *R1=printable_command(i);
  577. X    print_debug("Command(%d): %s",i,R1);
  578. X    FREE(R1);
  579. X      }
  580. X      if (do_escape(i)) {
  581. X    rem_command(i);
  582. X    if (DEBUG_TERM) {
  583. X      print_debug("Command(%d) - handled by module control\n"
  584. X              "            : REMOVED from buffer",i);
  585. X    }
  586. X      } else if(call_parser) {
  587. X    if (cancel || do_keyboard(i,&cancel)) {
  588. X      if (DEBUG_TERM) {
  589. X        print_debug("Command(%d) - handled (or canceled) "
  590. X            "by module keyboard",i);
  591. X      }
  592. X    } else if (0 != (name = key_name(i))) {
  593. X      char *buffer1 = "Key ", *buffer3 = " haven't action";
  594. X      int bl1 = strlen(buffer1), bl3 = strlen(buffer3);
  595. X      int bl2 = strlen(Cs(name));
  596. X      CHAR_IDX buffer[50];
  597. X      map_input(MAP_ASCII,bl1,rCs(buffer1),buffer);
  598. X      map_input(MAP_ASCII,bl2,name,buffer+bl1);
  599. X      map_input(MAP_ASCII,bl3,rCs(buffer3),buffer+bl1+bl2);
  600. X      message_to_error(bl1+bl2+bl3,buffer);
  601. X    } else {
  602. X      CHAR *R1=printable_sequence(i);
  603. X      print_notify("Unexpected escape sequence: %s",R1);
  604. X      free(R1);
  605. X    }
  606. X    rem_command(i);
  607. X    if (DEBUG_TERM) {
  608. X      print_debug("Command(%d) : REMOVED form buffer",i);
  609. X    }
  610. X      } else {
  611. X    if (DEBUG_TERM) {
  612. X      print_debug("Command(%d) : SKIPPED",i);
  613. X    }
  614. X    i++;
  615. X      }
  616. X    }
  617. X
  618. X    (*callback_after)();
  619. X
  620. X
  621. X    if (have_file && -1 != (*FP) && !(*EOF_IN_FILE) &&     
  622. X    ((*NOT_SELECTABLE) ||
  623. X#ifdef _HPUX_SOURCE
  624. X     (readfs & (1 << (*FP)))
  625. X#else
  626. X     FD_ISSET((*FP),&readfs)
  627. X#endif
  628. X    ))
  629. X      {
  630. X    (*file_handler)();
  631. X      }
  632. X
  633. X    if (
  634. X#ifdef _HPUX_SOURCE
  635. X    writefs & (1 << terminal)
  636. X#else
  637. X    FD_ISSET(terminal,&writefs)
  638. X#endif
  639. X    )
  640. X      { 
  641. X    int val = need_line_flush();
  642. X    tmp_ready = 0;
  643. X    if (was_input && 2 != val) {
  644. X      if (DEBUG_BUFFER || DEBUG_LBUFFER) 
  645. X        print_debug("BUFFER: was_input=%d, "
  646. X            "need_line_flush()=%d - no flush",
  647. X            was_input,val);
  648. X    } else {
  649. X      if (DEBUG_BUFFER || DEBUG_LBUFFER) 
  650. X        print_debug("BUFFER: was_input=%d, "
  651. X            "need_line_flush()=%d - flushing...",
  652. X            was_input,val);
  653. X      if (!flush_some_lines())
  654. X        flush_buffer(0);
  655. X    }
  656. X      }
  657. X    
  658. X  }
  659. X
  660. X}
  661. X
  662. Xstatic int init_ready = 0;
  663. X
  664. Xstatic void init_do_timeout(int key) {
  665. X  do_timeout();
  666. X}
  667. X
  668. Xstatic int init_callback_before(void) {
  669. X  int skip = 0;
  670. X  int tail_ptr;
  671. X
  672. X  if (got_from_TAIL(&tail_ptr)) {
  673. X    print_errors(tail_ptr);
  674. X    skip = 1; 
  675. X  }
  676. X
  677. X  if (pager_state || quitflag) {
  678. X    init_ready = 1;
  679. X    skip = 1;
  680. X  }
  681. X  
  682. X  return skip;
  683. X}
  684. X
  685. Xstatic void init_callback_after(void) {
  686. X
  687. X  if (pager_state || quitflag) {
  688. X    init_ready = 1;
  689. X  }
  690. X}
  691. X
  692. Xint init_schedule(void) {
  693. X  init_ready = 0;
  694. X
  695. X  real_schedule(NULL,NULL,NULL,
  696. X        NULL,
  697. X        &ask_timeout,&init_do_timeout,
  698. X        &init_ready,&init_callback_before,
  699. X        &init_callback_after,0);
  700. X
  701. X  return pager_state;
  702. X
  703. X}
  704. SHAR_EOF
  705. chmod 0644 patch1.schedule.c || echo "restore of patch1.schedule.c fails"
  706. sed 's/^X//' << 'SHAR_EOF' > patch1.schedule.h &&
  707. X/*  file: schedule.h
  708. X *
  709. X *  kehpager, Charset aware pager, Kari E. Hurtta
  710. X *
  711. X *  Copyright (c) 1994 Kari E. Hurtta
  712. X *
  713. X *  Redistribution and use in source and binary forms are permitted
  714. X *  provided that the above copyright notice and this paragraph are
  715. X *  duplicated in all such forms. This software is provided 'as is'
  716. X *  and without any warranty. 
  717. X */
  718. X
  719. Xextern int cancel; /* Ctrl-G pressed */
  720. X
  721. Xextern void real_schedule(int *FP, int *EOF_IN_FILE, int *NOT_SELECTABLE,
  722. X             void (*file_handler)(void),
  723. X             int (*timeout_callback)(long *value),
  724. X             void (*timeout_handler)(int key),
  725. X             int *ready, int (* callback_before)(void),
  726. X             void (* callback_after)(void),
  727. X             int call_parser
  728. X             );
  729. X
  730. Xextern int init_schedule(void);
  731. X
  732. X/* Uses, but not define: */
  733. Xextern void not_selectable(int *fp);
  734. Xextern int do_keyboard(int cmd, int *cancel);
  735. Xextern void message_to_error(int len, CHAR_IDX *buffer);
  736. Xextern int got_from_TAIL(int *ptr);
  737. Xextern void print_errors(int ptr);
  738. SHAR_EOF
  739. chmod 0644 patch1.schedule.h || echo "restore of patch1.schedule.h fails"
  740. sed 's/^X//' << 'SHAR_EOF' > patch1.sh &&
  741. X#!/bin/sh
  742. X
  743. Xif [ ! -r VERSION ] ; then
  744. X    echo "$0: No VERSION file! "
  745. X    exit 1
  746. Xfi
  747. Xversion="`cat VERSION`"
  748. Xif [ "$version" != "kehpager V1.2" ] ; then
  749. X    echo "This patch must run agaist kehpager V1.2!"
  750. X    echo "This source is: $version"
  751. X    exit 1
  752. Xfi
  753. Xecho "Creating file schedule.c ..."
  754. Xif cp patch1.schedule.c schedule.c ; then
  755. X    echo "OK"
  756. Xelse
  757. X    exit 1
  758. Xfi
  759. Xecho "Creating file schedule.h ..."
  760. Xif cp patch1.schedule.h schedule.h ; then
  761. X    echo "OK"
  762. Xelse
  763. X    exit 1
  764. Xfi
  765. Xif [ ! -r kehpagerrc ] ; then
  766. X    echo "Creating file kehpagerrc ..."
  767. X    if cp patch1.kehpagerrc kehpagerrc ; then
  768. X        echo "OK"
  769. X    else
  770. X        exit 1
  771. X    fi
  772. Xelse
  773. X    echo "kehpagerrc exists -- not created"
  774. Xfi
  775. Xif [ ! -r COPYRIGHT ] ; then
  776. X    echo "Creating file COPYRIGHT ..."
  777. X    if cp patch1.COPYRIGHT COPYRIGHT ; then
  778. X        echo "OK"
  779. X    else
  780. X        exit 1
  781. X    fi
  782. Xfi
  783. Xecho "Patching rest of source..."
  784. Xif patch -c -N <patch1.diff ; then
  785. X    echo "Patching OK"
  786. Xelse
  787. X    exit 1
  788. Xfi
  789. Xecho "Kehpager is updated to version 1.21"
  790. Xexit 0
  791. SHAR_EOF
  792. chmod 0644 patch1.sh || echo "restore of patch1.sh fails"
  793. rm -f s2_seq_.tmp
  794. echo "You have unpacked the last part"
  795. exit 0
  796.