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 extern int read_data(int tout_in_100ms, char *buf, int size); 46 47 RETSIGTYPE 48 zreadline_alarm_handler(int dummy LRZSZ_ATTRIB_UNUSED) 49 { 50 /* doesn't need to do anything */ 51 } 52 53 /* 54 * This version of readline is reasonably well suited for 55 * reading many characters. 56 * 57 * timeout is in tenths of seconds 58 */ 59 int 60 readline_internal(unsigned int timeout) 61 { 62 unsigned int n=0; 63 64 if (!no_timeout) 65 { 66 n = timeout/10; 67 if (n < 2 && timeout!=1) 68 n = 3; 69 else if (n==0) 70 n=1; 71 if (Verbose > 5) 72 vstringf("Calling read: alarm=%d Readnum=%d ", 73 n, (u32)readline_readnum); 74 //signal(SIGALRM, zreadline_alarm_handler); 75 //alarm(n); 76 } 77 else if (Verbose > 5) 78 vstringf("Calling read: Readnum=%d ", 79 (u32)readline_readnum); 80 81 readline_ptr=readline_buffer; 82 readline_left=read_data(n*10, readline_ptr, readline_readnum); 83 if (!no_timeout) 84 ;//alarm(0); 85 if (readline_left>0 && bytes_per_error) { 86 static long ct=0; 87 static int mod=1; 88 ct+=readline_left; 89 while (ct>bytes_per_error) { 90 readline_ptr[ct % bytes_per_error]^=mod; 91 ct-=bytes_per_error; 92 mod++; 93 if (mod==256) 94 mod=1; 95 } 96 } 97 if (Verbose > 5) { 98 vstringf("Read returned %d bytes\n", readline_left); 99 //if (readline_left==-1) 100 // vstringf("errno=%d:%s\n", errno,strerror(errno)); 101 if (Verbose > 9 && readline_left>0) { 102 int i,j; 103 j=readline_left > 48 ? 48 : readline_left; 104 vstring(" "); 105 for (i=0;i<j;i++) { 106 if (i%24==0 && i) 107 vstring("\n "); 108 vstringf("%02x ", readline_ptr[i] & 0377); 109 } 110 vstringf("\n"); 111 } 112 } 113 if (readline_left < 1) 114 return TIMEOUT; 115 --readline_left; 116 return (*readline_ptr++ & 0377); 117 } 118 119 120 121 void 122 readline_setup(int fd, size_t readnum, size_t bufsize) 123 { 124 readline_fd=fd; 125 readline_readnum=readnum; 126 readline_buffer=malloc(bufsize > readnum ? bufsize : readnum); 127 //if (!readline_buffer) 128 // error(1,0,_("out of memory")); 129 } 130 131 void 132 readline_purge(void) 133 { 134 readline_left=0; 135 return; 136 } 137 138