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>