da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * read [-ACprs] [-d delim] [-u filenum] [-t timeout] [-n n] [-N n] [name...]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <error.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "variables.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "lexstates.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "io.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "name.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "builtins.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "history.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "terminal.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "edit.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define R_FLAG 1 /* raw mode */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_FLAG 2 /* save in history file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define A_FLAG 4 /* read into array */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define N_FLAG 8 /* fixed size read at most */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NN_FLAG 0x10 /* fixed size read exact */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define V_FLAG 0x20 /* use default value */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define C_FLAG 0x40 /* read into compound variable */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define D_FLAG 8 /* must be number of bits for all flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstruct read_save
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char **argv;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin char *prompt;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin short fd;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin short plen;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int flags;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin long timeout;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin};
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint b_read(int argc,char *argv[], void *extra)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfdouble_t sec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int r, flags=0, fd=0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Shell_t *shp = ((Shbltin_t*)extra)->shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long timeout = 1000*shp->st.tmout;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int save_prompt, fixargs=((Shbltin_t*)extra)->invariant;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin struct read_save *rp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char default_prompt[3] = {ESC,ESC};
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz rp = (struct read_save*)(((Shbltin_t*)extra)->data);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(argc==0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(rp)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz free((void*)rp);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(0);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(rp)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin flags = rp->flags;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin timeout = rp->timeout;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fd = rp->fd;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin argv = rp->argv;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name = rp->prompt;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin r = rp->plen;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin goto bypass;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((r = optget(argv,sh_optread))) switch(r)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'A':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= A_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case 'C':
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin flags |= C_FLAG;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 't':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sec = sh_strnum(opt_info.arg, (char**)0,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timeout = sec ? 1000*sec : 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'd':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(opt_info.arg && *opt_info.arg!='\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp = opt_info.arg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~((1<<D_FLAG)-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= (mbchar(cp)<< D_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'p':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((fd = shp->cpipe[0])<=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_exit(1),e_query);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'n': case 'N':
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin flags &= ((1<<D_FLAG)-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= (r=='n'?N_FLAG:NN_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin r = (int)opt_info.num;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((unsigned)r > (1<<((8*sizeof(int))-D_FLAG))-1)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_exit(1),e_overlimit,opt_info.name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= (r<< D_FLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'r':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= R_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 's':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save in history file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= S_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'u':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fd = (int)opt_info.num;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_inuse(fd))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fd = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'v':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= V_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin argv += opt_info.index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(error_info.errors)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_usage(2), "%s", optusage((char*)0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!((r=shp->fdstatus[fd])&IOREAD) || !(r&(IOSEEK|IONOSEEK)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin r = sh_iocheckfd(shp,fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fd<0 || !(r&IOREAD))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(1),e_file+4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* look for prompt */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((name = *argv) && (name=strchr(name,'?')) && (r&IOTTY))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin r = strlen(name++);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin r = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(argc==fixargs && (rp=newof(NIL(struct read_save*),struct read_save,1,0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ((Shbltin_t*)extra)->data = (void*)rp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rp->fd = fd;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rp->flags = flags;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rp->timeout = timeout;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rp->argv = argv;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rp->prompt = name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rp->plen = r;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbypass:
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner shp->prompt = default_prompt;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(r && (shp->prompt=(char*)sfreserve(sfstderr,r,SF_LOCKR)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy(shp->prompt,name,r);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfwrite(sfstderr,shp->prompt,r-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->timeout = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin save_prompt = shp->nextprompt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->nextprompt = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin r=sh_readline(shp,argv,fd,flags,timeout);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->nextprompt = save_prompt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(r==0 && (r=(sfeof(shp->sftable[fd])||sferror(shp->sftable[fd]))))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fd == shp->cpipe[0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_pclose(shp->cpipe);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrerr(shp->sftable[fd]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(r);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * here for read timeout
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void timedout(void *handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrlock((Sfio_t*)handle);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_exit(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This is the code to read a line and to split it into tokens
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * <names> is an array of variable names
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * <fd> is the file descriptor
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * <flags> is union of -A, -r, -s, and contains delimiter if not '\n'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * <timeout> is number of milli-seconds until timeout
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_readline(register Shell_t *shp,char **names, int fd, int flags,long timeout)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz register ssize_t c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Namval_t *np;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *name, *val;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Sfio_t *iop;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Namfun_t *nfp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *ifs;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char *cpmax;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char *del;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char was_escape = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char use_stak = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin volatile char was_write = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin volatile char was_share = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int rel, wrd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long array_index = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void *timeslot=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int delim = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int jmpval=0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ssize_t size = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int binary;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct checkpt buff;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!(iop=shp->sftable[fd]) && !(iop=sh_iostream(shp,fd)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_stats(STAT_READS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(names && (name = *names))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Namval_t *mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val= strchr(name,'?'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *val = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin np = nv_open(name,shp->var_tree,NV_NOASSIGN|NV_VARNAME);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(np && nv_isarray(np) && (mp=nv_opensub(np)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz np = mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((flags&V_FLAG) && shp->ed_context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ((struct edit*)shp->ed_context)->e_default = np;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&A_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~A_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin array_index = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_unset(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putsub(np,NIL(char*),0L);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(flags&C_FLAG)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin delim = -1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_unset(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setvtree(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = *++names;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *val = '?';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(dtvnext(shp->var_tree) || shp->namespace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = nv_open(nv_name(REPLYNOD),shp->var_tree,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = REPLYNOD;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags>>D_FLAG) /* delimiter not new-line or fixed size read */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&(N_FLAG|NN_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size = ((unsigned)flags)>>D_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin delim = ((unsigned)flags)>>D_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->fdstatus[fd]&IOTTY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tty_raw(fd,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin binary = nv_isattr(np,NV_BINARY);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!binary && !(flags&(N_FLAG|NN_FLAG)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Namval_t *mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set up state table based on IFS */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ifs = nv_getval(mp=sh_scoped(shp,IFSNOD));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((flags&R_FLAG) && shp->ifstable['\\']==S_ESC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable['\\'] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(!(flags&R_FLAG) && shp->ifstable['\\']==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable['\\'] = S_ESC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable[delim] = S_NL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(delim!='\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable['\n'] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(mp, ifs, NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ifstable[0] = S_EOF;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrerr(iop);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(nfp=np->nvfun; nfp; nfp = nfp->next)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(nfp->disc && nfp->disc->readf)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((c=(*nfp->disc->readf)(np,iop,delim,nfp))>=0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return(c);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(binary && !(flags&(N_FLAG|NN_FLAG)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin flags |= NN_FLAG;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin size = nv_size(np);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_write = (sfset(iop,SF_WRITE,0)&SF_WRITE)!=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fd==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_share = (sfset(iop,SF_SHARE,1)&SF_SHARE)!=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(timeout || (shp->fdstatus[fd]&(IOTTY|IONOSEEK)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_pushcontext(&buff,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin jmpval = sigsetjmp(buff.buff,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(jmpval)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(timeout)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timeslot = (void*)sh_timeradd(timeout,0,timedout,(void*)iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&(N_FLAG|NN_FLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz char buf[256],*var=buf,*cur,*end,*up,*v;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* reserved buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((c=size)>=sizeof(buf))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(var = (char*)malloc(c+1)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_exit(1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin end = var + c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin end = var + sizeof(buf) - 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin up = cur = var;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((sfset(iop,SF_SHARE,1)&SF_SHARE) && fd!=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_share = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(size==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = sfreserve(iop,0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ssize_t m;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int f;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner c = size;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cp = sfreserve(iop,c,SF_LOCKR);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin f = 1;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(cp)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz m = sfvalue(iop);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if(flags&NN_FLAG)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner c = size;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner m = (cp = sfreserve(iop,c,0)) ? sfvalue(iop) : 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz f = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner c = sfvalue(iop);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner m = (cp = sfreserve(iop,c,SF_LOCKR)) ? sfvalue(iop) : 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(m>0 && (flags&N_FLAG) && !binary && (v=memchr(cp,'\n',m)))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *v++ = 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz m = v-(char*)cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((c=m)>size)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin c = size;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(c>0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(c > (end-cur))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ssize_t cx = cur - var, ux = up - var;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz m = (end - var) + (c - (end - cur));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (var == buf)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin v = (char*)malloc(m+1);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz var = memcpy(v, var, cur - var);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz var = newof(var, char, m, 1);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz end = var + m;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz cur = var + cx;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz up = var + ux;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((void*)cur,cp,c);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(f)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfread(iop,cp,c);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cur += c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_MULTIBYTE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!binary && mbwide())
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int x;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int z;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mbinit();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cur = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x = z = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (up < cur && (z = mbsize(up)) > 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin up += z;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if((size -= x) > 0 && (up >= cur || z < 0) && ((flags & NN_FLAG) || z < 0 || m > c))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if SHOPT_MULTIBYTE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!binary && mbwide() && (up == var || (flags & NN_FLAG) && size))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cur = var;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *cur = 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(c>=size || (flags&N_FLAG) || m==0)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if(m)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner sfclrerr(iop);
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner break;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner size -= c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(timeslot)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timerdel(timeslot);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(binary && !((size=nv_size(np)) && nv_isarray(np) && c!=size))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if((c==size) && np->nvalue.cp && !nv_isarray(np))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin memcpy((char*)np->nvalue.cp,var,c);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz Namval_t *mp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(var==buf)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner var = memdup(var,c+1);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_putval(np,var,NV_RAW);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nv_setsize(np,c);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if(!nv_isattr(np,NV_IMPORT|NV_EXPORT) && (mp=(Namval_t*)np->nvenv))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz nv_setsize(mp,c);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(np,var,0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(var!=buf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free((void*)var);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(cp = (unsigned char*)sfgetr(iop,delim,0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = sfvalue(iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(cp = (unsigned char*)sfgetr(iop,delim,-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = sfvalue(iop)+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(timeslot)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin timerdel(timeslot);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((flags&S_FLAG) && !shp->hist_ptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_histinit((void*)shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!shp->hist_ptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~S_FLAG;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cpmax = cp + c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_CRNL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(delim=='\n' && c>=2 && cpmax[-2]=='\r')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cpmax--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_CRNL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(cpmax-1) != delim)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(cpmax-1) = delim;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&S_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfwrite(shp->hist_ptr->histfp,(char*)cp,c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = shp->ifstable[*cp++];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!name && (flags&R_FLAG)) /* special case single argument */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over leading blanks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(c==S_SPACE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = shp->ifstable[*cp++];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* strip trailing delimiters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cpmax[-1] == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cpmax--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cpmax>cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((c=shp->ifstable[*--cpmax])==S_DELIM || c==S_SPACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cpmax[1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *cpmax =0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isattr(np, NV_RDONLY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_warn(0),e_readonly, nv_name(np));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin jmpval = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(np,(char*)cp-1,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* !SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = S_NL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->nextprompt = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rel= staktell();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* val==0 at the start of a field */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin del = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch(c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_MBYTE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = (char*)(cp-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_strchr(ifs,(char*)cp-1)>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = mbsize((char*)cp-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp[-1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c>1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp += (c-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = S_DELIM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /*SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_ESC:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* process escape character */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((c = shp->ifstable[*cp++]) == S_NL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_escape = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin use_stak = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_escape = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *val = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_EOF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for end of buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val && *val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin use_stak = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp>=cpmax)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = S_NL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* eliminate null bytes */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = shp->ifstable[*cp++];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!name && val && (c==S_SPACE||c==S_DELIM||c==S_MBYTE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_NL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(was_escape)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_escape = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp = (unsigned char*)sfgetr(iop,delim,0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = sfvalue(iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(cp=(unsigned char*)sfgetr(iop,delim,-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = sfvalue(iop)+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(cp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&S_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfwrite(shp->hist_ptr->histfp,(char*)cp,c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cpmax = cp + c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = shp->ifstable[*cp++];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!name && (c==S_SPACE || c==S_DELIM || c==S_MBYTE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = S_NL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_SPACE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over blanks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((c=shp->ifstable[*cp++])==S_SPACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_MULTIBYTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c==S_MBYTE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_strchr(ifs,(char*)cp-1)>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((c = mbsize((char*)cp-1))>1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp += (c-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = S_DELIM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_MULTIBYTE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!=S_DELIM)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* FALL THRU */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_DELIM:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!del)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin del = cp - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over trailing blanks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((c=shp->ifstable[*cp++])==S_SPACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* FALL THRU */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 0:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(val==0 || was_escape)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = (char*)(cp-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin was_escape = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over word characters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin wrd = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((c=shp->ifstable[*cp++])==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!wrd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin wrd = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!del&&c==S_DELIM)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin del = cp - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name || c==S_NL || c==S_ESC || c==S_EOF || c==S_MBYTE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(wrd<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin wrd = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(wrd>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin del = (unsigned char*)"";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!=S_MBYTE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp[-1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* assign value and advance to next variable */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = "";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(use_stak)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputs(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakputc(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = stakptr(rel);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!name && *val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* strip off trailing space delimiters */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char *vp = (unsigned char*)val + strlen(val);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(shp->ifstable[*--vp]==S_SPACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vp==del)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(vp==(unsigned char*)val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vp--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(shp->ifstable[*--vp]==S_SPACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vp[1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isattr(np, NV_RDONLY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_warn(0),e_readonly, nv_name(np));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin jmpval = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(np,val,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin val = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin del = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(use_stak)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(rel);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin use_stak = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(array_index)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putsub(np, NIL(char*), array_index++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!=S_NL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = *++names;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_ALLEXPORT)&&!strchr(nv_name(np),'.') && !nv_isattr(np,NV_EXPORT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_onattr(np,NV_EXPORT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_envput(sh.env,np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_close(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = nv_open(name,shp->var_tree,NV_NOASSIGN|NV_VARNAME);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = *++names;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin np = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c!=S_NL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!np)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isattr(np, NV_RDONLY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_warn(0),e_readonly, nv_name(np));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin jmpval = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(np, "", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(timeout || (shp->fdstatus[fd]&(IOTTY|IONOSEEK)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_popcontext(&buff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(was_write)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfset(iop,SF_WRITE,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!was_share)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfset(iop,SF_SHARE,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_close(np);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((flags>>D_FLAG) && (shp->fdstatus[fd]&IOTTY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tty_cooked(fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(flags&S_FLAG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_flush(shp->hist_ptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(jmpval > 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin siglongjmp(*shp->jmplist,jmpval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(jmpval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin