aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/sam/cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/sam/cmd.c')
-rw-r--r--src/cmd/sam/cmd.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/cmd/sam/cmd.c b/src/cmd/sam/cmd.c
index a5b636af..cdf00b9b 100644
--- a/src/cmd/sam/cmd.c
+++ b/src/cmd/sam/cmd.c
@@ -50,10 +50,12 @@ Rune termline[BLOCKSIZE];
Rune *linep = line;
Rune *terminp = termline;
Rune *termoutp = termline;
-List cmdlist;
-List addrlist;
-List relist;
-List stringlist;
+
+List cmdlist = { 'p' };
+List addrlist = { 'p' };
+List relist = { 'p' };
+List stringlist = { 'p' };
+
int eof;
void
@@ -108,15 +110,26 @@ inputc(void)
int
inputline(void)
{
- int i, c;
-
- linep = line;
- i = 0;
+ int i, c, start;
+
+ /*
+ * Could set linep = line and i = 0 here and just
+ * error(Etoolong) below, but this way we keep
+ * old input buffer history around for a while.
+ * This is useful only for debugging.
+ */
+ i = linep - line;
do{
if((c = inputc())<=0)
return -1;
- if(i == (sizeof line)/RUNESIZE-1)
- error(Etoolong);
+ if(i == nelem(line)-1){
+ if(linep == line)
+ error(Etoolong);
+ start = linep - line;
+ runemove(line, linep, i-start);
+ i -= start;
+ linep = line;
+ }
}while((line[i++]=c) != '\n');
line[i] = 0;
return 1;
@@ -275,9 +288,9 @@ freecmd(void)
int i;
while(cmdlist.nused > 0)
- free(cmdlist.ucharpptr[--cmdlist.nused]);
+ free(cmdlist.voidpptr[--cmdlist.nused]);
while(addrlist.nused > 0)
- free(addrlist.ucharpptr[--addrlist.nused]);
+ free(addrlist.voidpptr[--addrlist.nused]);
while(relist.nused > 0){
i = --relist.nused;
Strclose(relist.stringpptr[i]);