Annotation of embedaddon/lrzsz/src/zreadline.c, revision 1.1.1.1
1.1 misho 1: /*
2: zreadline.c - line reading stuff for lrzsz
3: Copyright (C) until 1998 Chuck Forsberg (OMEN Technology Inc)
4: Copyright (C) 1994 Matt Porter
5: Copyright (C) 1996, 1997 Uwe Ohse
6:
7: This program is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2, or (at your option)
10: any later version.
11:
12: This program is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with this program; if not, write to the Free Software
19: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20: 02111-1307, USA.
21:
22: originally written by Chuck Forsberg
23: */
24: /* once part of lrz.c, taken out to be useful to lsz.c too */
25:
26: #include "zglobal.h"
27:
28: #include <stdlib.h>
29: #include <stdio.h>
30: #include <signal.h>
31: #include <ctype.h>
32: #include <errno.h>
33:
34: #include "error.h"
35:
36:
37: /* Ward Christensen / CP/M parameters - Don't change these! */
38: #define TIMEOUT (-2)
39:
40: static size_t readline_readnum;
41: static int readline_fd;
42: static char *readline_buffer;
43: int readline_left=0;
44: char *readline_ptr;
45:
46: static RETSIGTYPE
47: zreadline_alarm_handler(int dummy LRZSZ_ATTRIB_UNUSED)
48: {
49: /* doesn't need to do anything */
50: }
51:
52: /*
53: * This version of readline is reasonably well suited for
54: * reading many characters.
55: *
56: * timeout is in tenths of seconds
57: */
58: int
59: readline_internal(unsigned int timeout)
60: {
61:
62: if (!no_timeout)
63: {
64: unsigned int n;
65: n = timeout/10;
66: if (n < 2 && timeout!=1)
67: n = 3;
68: else if (n==0)
69: n=1;
70: if (Verbose > 5)
71: vstringf("Calling read: alarm=%d Readnum=%d ",
72: n, readline_readnum);
73: signal(SIGALRM, zreadline_alarm_handler);
74: alarm(n);
75: }
76: else if (Verbose > 5)
77: vstringf("Calling read: Readnum=%d ",
78: readline_readnum);
79:
80: readline_ptr=readline_buffer;
81: readline_left=read(readline_fd, readline_ptr, readline_readnum);
82: if (!no_timeout)
83: alarm(0);
84: if (readline_left>0 && bytes_per_error) {
85: static long ct=0;
86: static int mod=1;
87: ct+=readline_left;
88: while (ct>bytes_per_error) {
89: readline_ptr[ct % bytes_per_error]^=mod;
90: ct-=bytes_per_error;
91: mod++;
92: if (mod==256)
93: mod=1;
94: }
95: }
96: if (Verbose > 5) {
97: vstringf("Read returned %d bytes\n", readline_left);
98: if (readline_left==-1)
99: vstringf("errno=%d:%s\n", errno,strerror(errno));
100: if (Verbose > 9 && readline_left>0) {
101: int i,j;
102: j=readline_left > 48 ? 48 : readline_left;
103: vstring(" ");
104: for (i=0;i<j;i++) {
105: if (i%24==0 && i)
106: vstring("\n ");
107: vstringf("%02x ", readline_ptr[i] & 0377);
108: }
109: vstringf("\n");
110: }
111: }
112: if (readline_left < 1)
113: return TIMEOUT;
114: --readline_left;
115: return (*readline_ptr++ & 0377);
116: }
117:
118:
119:
120: void
121: readline_setup(int fd, size_t readnum, size_t bufsize)
122: {
123: readline_fd=fd;
124: readline_readnum=readnum;
125: readline_buffer=malloc(bufsize > readnum ? bufsize : readnum);
126: if (!readline_buffer)
127: error(1,0,_("out of memory"));
128: }
129:
130: void
131: readline_purge(void)
132: {
133: readline_left=0;
134: return;
135: }
136:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>