summaryrefslogtreecommitdiffstats
path: root/main/common/edit.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/common/edit.c')
-rw-r--r--main/common/edit.c1220
1 files changed, 629 insertions, 591 deletions
diff --git a/main/common/edit.c b/main/common/edit.c
index 3fb8b54..aec8060 100644
--- a/main/common/edit.c
+++ b/main/common/edit.c
@@ -1,7 +1,7 @@
/**************************************************************************
*
* Copyright (c) 2013 Alcatel-Lucent
- *
+ *
* Alcatel Lucent licenses this file to You under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. A copy of the License is contained the
@@ -37,686 +37,724 @@
#include "cli.h"
extern char *file_line_edit(char *);
-static int rmCR(char *,int);
-static int gotoline(char *,char *,char **,char *,int);
-static int searchfor(char *,char *,char **,char *);
-static int whatlineisthis(char *,char *);
-static int getrange(char *,int *,int *,char *,char *,char *);
-static void lnprbuf(char *,char *,char *);
-static void prbuf(char *,char *);
+static int rmCR(char *,int);
+static int gotoline(char *,char *,char **,char *,int);
+static int searchfor(char *,char *,char **,char *);
+static int whatlineisthis(char *,char *);
+static int getrange(char *,int *,int *,char *,char *,char *);
+static void lnprbuf(char *,char *,char *);
+static void prbuf(char *,char *);
static void prlno(int,int);
static void deletelines(char *,int,char *,char **,char **);
-static char *prline(char *,char *);
+static char *prline(char *,char *);
static char *skipwhite(char *);
-#define BREAK 1
-#define CONTINUE 2
-#define FALLTHROUGH 3
-#define INSERT 4
-#define COMMAND 5
-#define ESCAPE 0x1b
+#define BREAK 1
+#define CONTINUE 2
+#define FALLTHROUGH 3
+#define INSERT 4
+#define COMMAND 5
+#define ESCAPE 0x1b
-#define ILCMAX 8
+#define ILCMAX 8
void
efree(int size, char *buffer)
{
- if (size != 0)
- free(buffer);
+ if(size != 0) {
+ free(buffer);
+ }
}
/* Help text while in the editor: */
char *edithelp[] = {
- "Editor commands:",
- "d{LRNG} delete line",
+ "Editor commands:",
+ "d{LRNG} delete line",
#if INCLUDE_LINEEDIT
- "e# edit line # (uses 'ksh/vi-like' command line editing)",
+ "e# edit line # (uses 'ksh/vi-like' command line editing)",
#endif
- "i enter insert mode (use '.' to exit insert mode)",
- "a enter append mode (use '.' to exit append mode)",
- "j# join line '#' with line '#+1'",
- "P[LRNG] print buffer with line numbers",
- "p print buffer",
- "q[fname] quit edit, write file",
- "s[srchstr] goto line containing search string",
- "x exit edit, do not write file",
- "# goto line # (use '$' to go to last line)",
- ".+/-# goto line relative to current position",
- "",
- "Where...",
- "# represents a decimal number;",
- "LRNG represents a line number or inclusive line range (# or #-#);",
- 0,
+ "i enter insert mode (use '.' to exit insert mode)",
+ "a enter append mode (use '.' to exit append mode)",
+ "j# join line '#' with line '#+1'",
+ "P[LRNG] print buffer with line numbers",
+ "p print buffer",
+ "q[fname] quit edit, write file",
+ "s[srchstr] goto line containing search string",
+ "x exit edit, do not write file",
+ "# goto line # (use '$' to go to last line)",
+ ".+/-# goto line relative to current position",
+ "",
+ "Where...",
+ "# represents a decimal number;",
+ "LRNG represents a line number or inclusive line range (# or #-#);",
+ 0,
};
/* Help text outside the editor: */
char *EditHelp[] = {
- "Edit file or buffer",
- "-[b:c:f:i:m:rs:t] [filename]",
+ "Edit file or buffer",
+ "-[b:c:f:i:m:rs:t] [filename]",
#if INCLUDE_VERBOSEHELP
- " -b {adr} specify buffer base address",
- " -c {cmd} in-line command",
- " -f {flgs} file flags (see tfs)",
- " -i {info} file info (see tfs)",
- " -m {size} specify allocation size for buffer",
- " -r do not automatically remove carriage returns from file",
- " -s {size} size of buffer",
- " -t convert tabs to spaces",
+ " -b {adr} specify buffer base address",
+ " -c {cmd} in-line command",
+ " -f {flgs} file flags (see tfs)",
+ " -i {info} file info (see tfs)",
+ " -m {size} specify allocation size for buffer",
+ " -r do not automatically remove carriage returns from file",
+ " -s {size} size of buffer",
+ " -t convert tabs to spaces",
#endif
- 0,
+ 0,
};
int
Edit(int argc,char *argv[])
{
- int i, opt, tfd, quit, mode, bsize;
- char ln[CMDLINESIZE], *lp, *cp, *cp1, *filename, *flags, *info;
- char *buffer, *bp; /* Buffer and pointer into buffer. */
- char *eob; /* Current EOF pointer (max distance between */
- /* bp and buffer). */
- char *inlinecmd[ILCMAX]; /* If non-NULL, it points to a list of */
- /* commands to be executed prior to going */
- /* into interactive mode. */
- int ilcidx; /* Index into in-line command table. */
- int len; /* Length of the incoming line. */
- int size; /* Size of buffer specified on command line. */
- int cmdtot; /* Running total of incoming lines. */
- int delcnt; /* Used by :d when a range is specified. */
- int noCR; /* Set by -r option to remove Carriage Returns */
- TFILE tstruct, *tfp;
-
- tfp = (TFILE *)0;
- size = bsize = 0;
- flags = filename = (char*)0;
- buffer = (char *)getAppRamStart();
- info = (char *)0;
- noCR = 1;
- ilcidx = 0;
- for(i=0;i<8;i++)
- inlinecmd[i] = (char *)0;
-
- while ((opt = getopt(argc, argv, "b:c:f:i:m:rs:")) != -1) {
- switch (opt) {
- case 'b':
- buffer = (char *)strtol(optarg,(char **)0,0);
- break;
- case 'c':
- if (ilcidx < ILCMAX-1)
- inlinecmd[ilcidx++] = optarg;
- break;
- case 'f':
- flags = optarg;
- break;
- case 'i':
- info = optarg;
- break;
- case 'm':
- bsize = strtol(optarg,0,0);
- break;
- case 'r':
- noCR = 0;
- break;
- case 's':
- size = (int)strtol(optarg,(char **)0,0);
- break;
- default:
- return (CMD_PARAM_ERROR);
- }
- }
-
- if (bsize != 0) {
- buffer = malloc(bsize);
- if (!buffer)
- return(CMD_FAILURE);
- }
-
- if (argc == optind+1) {
- filename = argv[optind];
- if (tfsfstat(filename,&tstruct) != -1) {
- tfp = &tstruct;
- size = TFS_SIZE(tfp);
- if ((bsize > 0) && (size > bsize)) {
- printf("Allocation too small\n");
- efree(bsize,buffer);
- return(CMD_FAILURE);
- }
- tfd = tfsopen(filename,TFS_RDONLY,0);
- if (tfd < 0) {
- printf("%s: %s\n",filename,(char *)tfsctrl(TFS_ERRMSG,tfd,0));
- efree(bsize,buffer);
- return(CMD_FAILURE);
- }
- else {
- tfsread(tfd,buffer,size);
- tfsclose(tfd,0);
- }
- }
- }
-
- if ((noCR) && (size != 0)) {
- if ((buffer[size-1] != 0x0d) && (buffer[size-1] != 0x0a)) {
- printf("EOF linefeed inserted.\n");
- buffer[size++] = 0x0a;
- buffer[size] = 0;
- }
- size -= rmCR(buffer,size);
- }
-
- bp = buffer;
- eob = buffer + size;
-
- if (!ilcidx)
- printf("Edit buffer = 0x%lx.\nType '?' for help\n",(ulong)buffer);
-
- quit = 0;
- cmdtot = 0;
- mode = COMMAND;
- while(!quit) {
- lp = ln;
- if (ilcidx > cmdtot)
- strcpy(ln,inlinecmd[cmdtot]);
- else if (ilcidx) { /* If ILC command set doesn't terminate */
- /* the edit session, force it here. */
- efree(bsize,buffer);
- return(CMD_SUCCESS);
- }
- else
- getline(ln,CMDLINESIZE,0);
- cmdtot++;
- if (mode == INSERT) {
- if (!strcmp(lp,"."))
- mode = COMMAND;
- else {
- len = strlen(lp) + 1;
- cp1 = eob + len;
- cp = eob;
- while(cp > bp) *--cp1 = *--cp;
- while(*lp) *bp++ = *lp++;
- *bp++ = '\n';
- eob += len;
- }
- continue;
- }
- if (!strcmp(ln,"x")) { /* Exit editor now. */
- efree(bsize,buffer);
- return(CMD_SUCCESS);
- }
- else if (!strcmp(ln,"?")) { /* Display help info. */
- char **eh;
-
- eh = edithelp;
- while(*eh)
- printf("%s\n",*eh++);
- }
- else if (!strcmp(ln,"p")) /* Print buffer. */
- prbuf(buffer,eob);
- else if (!strcmp(ln,"P")) /* Print buffer with lines. */
- lnprbuf(buffer,bp,eob);
- else if (!strcmp(ln,"i")) /* Enter insert mode. */
- mode = INSERT;
- else if (!strcmp(ln,"a")) { /* Enter insert mode at */
- mode = INSERT; /* next line */
- gotoline(".+1",buffer,&bp,eob,0);
- }
- else if (!strcmp(ln,"$")) { /* Goto last line. */
- gotoline(ln,buffer,&bp,eob,0);
- gotoline(".-1",buffer,&bp,eob,1);
- }
- else if (isdigit(ln[0]) || (ln[0]=='.')) /* Goto line. */
- gotoline(ln,buffer,&bp,eob,1);
- else if (ln[0] == 's') { /* Go to line containing string. */
- char *str;
- str = skipwhite(&ln[1]);
- if (!*str)
- gotoline(".+1",buffer,&bp,eob,0);
- searchfor(str,buffer,&bp,eob);
- }
+ int i, opt, tfd, quit, mode, bsize;
+ char ln[CMDLINESIZE], *lp, *cp, *cp1, *filename, *flags, *info;
+ char *buffer, *bp; /* Buffer and pointer into buffer. */
+ char *eob; /* Current EOF pointer (max distance between */
+ /* bp and buffer). */
+ char *inlinecmd[ILCMAX]; /* If non-NULL, it points to a list of */
+ /* commands to be executed prior to going */
+ /* into interactive mode. */
+ int ilcidx; /* Index into in-line command table. */
+ int len; /* Length of the incoming line. */
+ int size; /* Size of buffer specified on command line. */
+ int cmdtot; /* Running total of incoming lines. */
+ int delcnt; /* Used by :d when a range is specified. */
+ int noCR; /* Set by -r option to remove Carriage Returns */
+ TFILE tstruct, *tfp;
+
+ tfp = (TFILE *)0;
+ size = bsize = 0;
+ flags = filename = (char *)0;
+ buffer = (char *)getAppRamStart();
+ info = (char *)0;
+ noCR = 1;
+ ilcidx = 0;
+ for(i=0; i<8; i++) {
+ inlinecmd[i] = (char *)0;
+ }
+
+ while((opt = getopt(argc, argv, "b:c:f:i:m:rs:")) != -1) {
+ switch(opt) {
+ case 'b':
+ buffer = (char *)strtol(optarg,(char **)0,0);
+ break;
+ case 'c':
+ if(ilcidx < ILCMAX-1) {
+ inlinecmd[ilcidx++] = optarg;
+ }
+ break;
+ case 'f':
+ flags = optarg;
+ break;
+ case 'i':
+ info = optarg;
+ break;
+ case 'm':
+ bsize = strtol(optarg,0,0);
+ break;
+ case 'r':
+ noCR = 0;
+ break;
+ case 's':
+ size = (int)strtol(optarg,(char **)0,0);
+ break;
+ default:
+ return (CMD_PARAM_ERROR);
+ }
+ }
+
+ if(bsize != 0) {
+ buffer = malloc(bsize);
+ if(!buffer) {
+ return(CMD_FAILURE);
+ }
+ }
+
+ if(argc == optind+1) {
+ filename = argv[optind];
+ if(tfsfstat(filename,&tstruct) != -1) {
+ tfp = &tstruct;
+ size = TFS_SIZE(tfp);
+ if((bsize > 0) && (size > bsize)) {
+ printf("Allocation too small\n");
+ efree(bsize,buffer);
+ return(CMD_FAILURE);
+ }
+ tfd = tfsopen(filename,TFS_RDONLY,0);
+ if(tfd < 0) {
+ printf("%s: %s\n",filename,(char *)tfsctrl(TFS_ERRMSG,tfd,0));
+ efree(bsize,buffer);
+ return(CMD_FAILURE);
+ } else {
+ tfsread(tfd,buffer,size);
+ tfsclose(tfd,0);
+ }
+ }
+ }
+
+ if((noCR) && (size != 0)) {
+ if((buffer[size-1] != 0x0d) && (buffer[size-1] != 0x0a)) {
+ printf("EOF linefeed inserted.\n");
+ buffer[size++] = 0x0a;
+ buffer[size] = 0;
+ }
+ size -= rmCR(buffer,size);
+ }
+
+ bp = buffer;
+ eob = buffer + size;
+
+ if(!ilcidx) {
+ printf("Edit buffer = 0x%lx.\nType '?' for help\n",(ulong)buffer);
+ }
+
+ quit = 0;
+ cmdtot = 0;
+ mode = COMMAND;
+ while(!quit) {
+ lp = ln;
+ if(ilcidx > cmdtot) {
+ strcpy(ln,inlinecmd[cmdtot]);
+ } else if(ilcidx) { /* If ILC command set doesn't terminate */
+ /* the edit session, force it here. */
+ efree(bsize,buffer);
+ return(CMD_SUCCESS);
+ } else {
+ getline(ln,CMDLINESIZE,0);
+ }
+ cmdtot++;
+ if(mode == INSERT) {
+ if(!strcmp(lp,".")) {
+ mode = COMMAND;
+ } else {
+ len = strlen(lp) + 1;
+ cp1 = eob + len;
+ cp = eob;
+ while(cp > bp) {
+ *--cp1 = *--cp;
+ }
+ while(*lp) {
+ *bp++ = *lp++;
+ }
+ *bp++ = '\n';
+ eob += len;
+ }
+ continue;
+ }
+ if(!strcmp(ln,"x")) { /* Exit editor now. */
+ efree(bsize,buffer);
+ return(CMD_SUCCESS);
+ } else if(!strcmp(ln,"?")) { /* Display help info. */
+ char **eh;
+
+ eh = edithelp;
+ while(*eh) {
+ printf("%s\n",*eh++);
+ }
+ } else if(!strcmp(ln,"p")) { /* Print buffer. */
+ prbuf(buffer,eob);
+ } else if(!strcmp(ln,"P")) { /* Print buffer with lines. */
+ lnprbuf(buffer,bp,eob);
+ } else if(!strcmp(ln,"i")) { /* Enter insert mode. */
+ mode = INSERT;
+ } else if(!strcmp(ln,"a")) { /* Enter insert mode at */
+ mode = INSERT; /* next line */
+ gotoline(".+1",buffer,&bp,eob,0);
+ } else if(!strcmp(ln,"$")) { /* Goto last line. */
+ gotoline(ln,buffer,&bp,eob,0);
+ gotoline(".-1",buffer,&bp,eob,1);
+ } else if(isdigit(ln[0]) || (ln[0]=='.')) { /* Goto line. */
+ gotoline(ln,buffer,&bp,eob,1);
+ } else if(ln[0] == 's') { /* Go to line containing string. */
+ char *str;
+ str = skipwhite(&ln[1]);
+ if(!*str) {
+ gotoline(".+1",buffer,&bp,eob,0);
+ }
+ searchfor(str,buffer,&bp,eob);
+ }
#if INCLUDE_LINEEDIT
- else if (ln[0] == 'e') {
- char *copy, *eoc, *cp2, crlf[2];
- int oldlnsize, newlnsize, toendsize;
-
- if (gotoline(&ln[1],buffer,&bp,eob,0) == -1)
- continue;
- copy = malloc(CMDLINESIZE);
- if (!copy)
- continue;
- eoc = copy + CMDLINESIZE - 3;
- cp = bp;
- cp1 = copy;
- oldlnsize = 0;
- while ((*cp != 0x0a) && (*cp != 0x0d) && (cp1 != eoc)) {
- if (*cp == '\t') /* Tabs are replaced with spaces to */
- *cp = ' '; /* eliminate whitespace confusion in */
- putchar(*cp); /* the line editor. */
- *cp1++ = *cp++;
- oldlnsize++;
- }
- crlf[0] = *cp;
- if (*cp != *(cp+1)) {
- crlf[1] = *(cp+1);
- if (*(cp+1) == 0x0a || *(cp+1) == 0x0d)
- oldlnsize++;
- }
- else {
- crlf[1] = 0;
- }
- oldlnsize++;
- *cp1++ = ESCAPE;
- *cp1 = 0;
- if (file_line_edit(copy) != (char *)0) {
- newlnsize = strlen(copy);
- toendsize = eob - (bp+oldlnsize);
- copy[newlnsize++] = crlf[0];
- if (crlf[1] == 0x0d || crlf[1] == 0x0a)
- copy[newlnsize++] = crlf[1];
- copy[newlnsize] = 0;
- if (oldlnsize == newlnsize) {
- memcpy(bp,copy,newlnsize);
- }
- else if (oldlnsize > newlnsize) {
- strcpy(bp,copy);
- memcpy(bp+newlnsize,cp+1,toendsize);
- }
- else {
- cp1 = eob-1;
- cp2 = (char *)(eob+(newlnsize-oldlnsize)-1);
- for(i=0;i<toendsize;i++)
- *cp2-- = *cp1--;
- memcpy(bp,copy,newlnsize);
- }
- eob -= oldlnsize;
- eob += newlnsize;
- }
- free(copy);
- }
+ else if(ln[0] == 'e') {
+ char *copy, *eoc, *cp2, crlf[2];
+ int oldlnsize, newlnsize, toendsize;
+
+ if(gotoline(&ln[1],buffer,&bp,eob,0) == -1) {
+ continue;
+ }
+ copy = malloc(CMDLINESIZE);
+ if(!copy) {
+ continue;
+ }
+ eoc = copy + CMDLINESIZE - 3;
+ cp = bp;
+ cp1 = copy;
+ oldlnsize = 0;
+ while((*cp != 0x0a) && (*cp != 0x0d) && (cp1 != eoc)) {
+ if(*cp == '\t') { /* Tabs are replaced with spaces to */
+ *cp = ' '; /* eliminate whitespace confusion in */
+ }
+ putchar(*cp); /* the line editor. */
+ *cp1++ = *cp++;
+ oldlnsize++;
+ }
+ crlf[0] = *cp;
+ if(*cp != *(cp+1)) {
+ crlf[1] = *(cp+1);
+ if(*(cp+1) == 0x0a || *(cp+1) == 0x0d) {
+ oldlnsize++;
+ }
+ } else {
+ crlf[1] = 0;
+ }
+ oldlnsize++;
+ *cp1++ = ESCAPE;
+ *cp1 = 0;
+ if(file_line_edit(copy) != (char *)0) {
+ newlnsize = strlen(copy);
+ toendsize = eob - (bp+oldlnsize);
+ copy[newlnsize++] = crlf[0];
+ if(crlf[1] == 0x0d || crlf[1] == 0x0a) {
+ copy[newlnsize++] = crlf[1];
+ }
+ copy[newlnsize] = 0;
+ if(oldlnsize == newlnsize) {
+ memcpy(bp,copy,newlnsize);
+ } else if(oldlnsize > newlnsize) {
+ strcpy(bp,copy);
+ memcpy(bp+newlnsize,cp+1,toendsize);
+ } else {
+ cp1 = eob-1;
+ cp2 = (char *)(eob+(newlnsize-oldlnsize)-1);
+ for(i=0; i<toendsize; i++) {
+ *cp2-- = *cp1--;
+ }
+ memcpy(bp,copy,newlnsize);
+ }
+ eob -= oldlnsize;
+ eob += newlnsize;
+ }
+ free(copy);
+ }
#endif
- else if (ln[0] == 'P') {
- int range, first, last, currentline;
-
- range = getrange(&ln[1],&first,&last,buffer,bp,eob);
- if (range > 0) {
- char *bpcpy;
-
- bpcpy = bp;
- gotoline(".",buffer,&bpcpy,eob,0);
- currentline = whatlineisthis(buffer,bpcpy);
- if (gotoline(&ln[1],buffer,&bpcpy,eob,0) == -1)
- continue;
- for(i=first;i<=last;i++) {
- prlno(i,currentline);
- bpcpy = prline(bpcpy,eob);
- }
- }
- }
- else if (ln[0] == 'j') { /* Join line specified with next line */
- char *tmpeob;
-
- if (gotoline(&ln[1],buffer,&bp,eob,0) == -1)
- continue;
- tmpeob=eob-1;
- while(bp < tmpeob) {
- if (*bp == '\n') {
- memcpy(bp,bp+1,eob-bp);
- eob--;
- break;
- }
- bp++;
- }
- }
- else if (ln[0] == 'd') { /* Delete line (or range of lines) */
- delcnt = getrange(&ln[1],0,0,buffer,bp,eob);
- deletelines(&ln[1],delcnt,buffer,&bp,&eob);
- }
- else if (ln[0] == 'q') { /* Quit edit, if filename is present */
- lp = &ln[1]; /* use it. */
- lp = skipwhite(lp);
- if (*lp)
- filename = lp;
- quit = 1;
- }
- else {
- printf("huh?\n");
- }
- }
-
- if (filename) {
- int err;
- char buf[16];
-
- if (tfp) {
- int link;
-
- /* If filename and TFS_NAME(tfp) differ, then we are editing
- * a file through a symbolic link. If it is a link, then we
- * use the info/flags/filename from the source file (using the
- * file pointer and ignoring user input stuff).
- */
- link = strcmp(filename,TFS_NAME(tfp));
-
- if ((!flags) || (link))
- flags = (char *)tfsctrl(TFS_FBTOA,TFS_FLAGS(tfp),(long)buf);
- if ((!info) || (link))
- info = TFS_INFO(tfp);
- if (link) {
- printf("Updating source file '%s' thru link '%s'\n",
- TFS_NAME(tfp),filename);
- filename = TFS_NAME(tfp);
- }
- }
- if (!flags)
- flags = (char *)0;
- if (!info)
- info = (char *)0;
- err = tfsadd(filename,info,flags,(unsigned char *)buffer,eob-buffer);
- if (err != TFS_OKAY)
- printf("%s: %s\n",filename,(char *)tfsctrl(TFS_ERRMSG,err,0));
- }
- efree(bsize,buffer);
- return(CMD_SUCCESS);
+ else if(ln[0] == 'P') {
+ int range, first, last, currentline;
+
+ range = getrange(&ln[1],&first,&last,buffer,bp,eob);
+ if(range > 0) {
+ char *bpcpy;
+
+ bpcpy = bp;
+ gotoline(".",buffer,&bpcpy,eob,0);
+ currentline = whatlineisthis(buffer,bpcpy);
+ if(gotoline(&ln[1],buffer,&bpcpy,eob,0) == -1) {
+ continue;
+ }
+ for(i=first; i<=last; i++) {
+ prlno(i,currentline);
+ bpcpy = prline(bpcpy,eob);
+ }
+ }
+ } else if(ln[0] == 'j') { /* Join line specified with next line */
+ char *tmpeob;
+
+ if(gotoline(&ln[1],buffer,&bp,eob,0) == -1) {
+ continue;
+ }
+ tmpeob=eob-1;
+ while(bp < tmpeob) {
+ if(*bp == '\n') {
+ memcpy(bp,bp+1,eob-bp);
+ eob--;
+ break;
+ }
+ bp++;
+ }
+ } else if(ln[0] == 'd') { /* Delete line (or range of lines) */
+ delcnt = getrange(&ln[1],0,0,buffer,bp,eob);
+ deletelines(&ln[1],delcnt,buffer,&bp,&eob);
+ } else if(ln[0] == 'q') { /* Quit edit, if filename is present */
+ lp = &ln[1]; /* use it. */
+ lp = skipwhite(lp);
+ if(*lp) {
+ filename = lp;
+ }
+ quit = 1;
+ } else {
+ printf("huh?\n");
+ }
+ }
+
+ if(filename) {
+ int err;
+ char buf[16];
+
+ if(tfp) {
+ int link;
+
+ /* If filename and TFS_NAME(tfp) differ, then we are editing
+ * a file through a symbolic link. If it is a link, then we
+ * use the info/flags/filename from the source file (using the
+ * file pointer and ignoring user input stuff).
+ */
+ link = strcmp(filename,TFS_NAME(tfp));
+
+ if((!flags) || (link)) {
+ flags = (char *)tfsctrl(TFS_FBTOA,TFS_FLAGS(tfp),(long)buf);
+ }
+ if((!info) || (link)) {
+ info = TFS_INFO(tfp);
+ }
+ if(link) {
+ printf("Updating source file '%s' thru link '%s'\n",
+ TFS_NAME(tfp),filename);
+ filename = TFS_NAME(tfp);
+ }
+ }
+ if(!flags) {
+ flags = (char *)0;
+ }
+ if(!info) {
+ info = (char *)0;
+ }
+ err = tfsadd(filename,info,flags,(unsigned char *)buffer,eob-buffer);
+ if(err != TFS_OKAY) {
+ printf("%s: %s\n",filename,(char *)tfsctrl(TFS_ERRMSG,err,0));
+ }
+ }
+ efree(bsize,buffer);
+ return(CMD_SUCCESS);
}
static void
lnprbuf(char *buffer,char *bp,char *eob)
{
- int lno, currentline;
-
- if (buffer == eob)
- return;
-
- lno = 1;
- currentline = whatlineisthis(buffer,bp);
- prlno(lno++,currentline);
- while(buffer < eob) {
- putchar(*buffer);
- if ((*buffer == '\n') && ((buffer + 1) != eob))
- prlno(lno++,currentline);
- buffer++;
- }
+ int lno, currentline;
+
+ if(buffer == eob) {
+ return;
+ }
+
+ lno = 1;
+ currentline = whatlineisthis(buffer,bp);
+ prlno(lno++,currentline);
+ while(buffer < eob) {
+ putchar(*buffer);
+ if((*buffer == '\n') && ((buffer + 1) != eob)) {
+ prlno(lno++,currentline);
+ }
+ buffer++;
+ }
}
static void
prlno(int lno,int currentline)
{
- char *fmt;
-
- if (lno == currentline)
- fmt = ">%2d: ";
- else
- fmt = "%3d: ";
- printf(fmt,lno);
+ char *fmt;
+
+ if(lno == currentline) {
+ fmt = ">%2d: ";
+ } else {
+ fmt = "%3d: ";
+ }
+ printf(fmt,lno);
}
static void
prbuf(char *bp,char *eob)
{
- while(bp < eob)
- putchar(*bp++);
+ while(bp < eob) {
+ putchar(*bp++);
+ }
}
char *
prline(char *bp,char *eob)
{
- while(bp < eob) {
- putchar(*bp);
- if (*bp == '\n')
- break;
- bp++;
- }
- return(bp+1);
+ while(bp < eob) {
+ putchar(*bp);
+ if(*bp == '\n') {
+ break;
+ }
+ bp++;
+ }
+ return(bp+1);
}
/* searchfor():
- * Step through the buffer starting at 'bp' and search for a memory match
- * with the incoming string pointed to by 'srch'. If not found, simply
- * return after the entire buffer has been searched (wrap to start if
- * necessary). If found, then adjust '*bp' to point to the beginning of
- * of the line that contains the match.
+ * Step through the buffer starting at 'bp' and search for a memory match
+ * with the incoming string pointed to by 'srch'. If not found, simply
+ * return after the entire buffer has been searched (wrap to start if
+ * necessary). If found, then adjust '*bp' to point to the beginning of
+ * of the line that contains the match.
*/
static int
searchfor(char *srch,char *buffer,char **bp,char *eob)
{
- static char *lastsrchstring;
- char *startedhere, *tbp;
- int len;
-
- tbp = *bp;
- if (tbp < eob)
- startedhere = *bp;
- else
- tbp = startedhere = buffer;
-
- if (*srch) {
- len = strlen(srch);
- if (lastsrchstring)
- free(lastsrchstring);
- lastsrchstring = malloc(len+1);
- if (lastsrchstring)
- strcpy(lastsrchstring,srch);
- }
- else if (lastsrchstring) {
- len = strlen(lastsrchstring);
- srch = lastsrchstring;
- }
- else
- return(-1);
- do {
- if ((tbp + len) > eob) {
- tbp = buffer;
- }
- else {
- if (!memcmp(tbp,srch,len)) {
- while(1) {
- if (tbp <= buffer) {
- *bp = buffer;
- break;
- }
- if (*tbp == '\n') {
- *bp = tbp+1;
- break;
- }
- tbp--;
- }
- prline(*bp,eob);
- return(0);
- }
- else
- tbp++;
- }
- } while(tbp != startedhere);
- printf("'%s' not found\n",srch);
- return(-1);
+ static char *lastsrchstring;
+ char *startedhere, *tbp;
+ int len;
+
+ tbp = *bp;
+ if(tbp < eob) {
+ startedhere = *bp;
+ } else {
+ tbp = startedhere = buffer;
+ }
+
+ if(*srch) {
+ len = strlen(srch);
+ if(lastsrchstring) {
+ free(lastsrchstring);
+ }
+ lastsrchstring = malloc(len+1);
+ if(lastsrchstring) {
+ strcpy(lastsrchstring,srch);
+ }
+ } else if(lastsrchstring) {
+ len = strlen(lastsrchstring);
+ srch = lastsrchstring;
+ } else {
+ return(-1);
+ }
+ do {
+ if((tbp + len) > eob) {
+ tbp = buffer;
+ } else {
+ if(!memcmp(tbp,srch,len)) {
+ while(1) {
+ if(tbp <= buffer) {
+ *bp = buffer;
+ break;
+ }
+ if(*tbp == '\n') {
+ *bp = tbp+1;
+ break;
+ }
+ tbp--;
+ }
+ prline(*bp,eob);
+ return(0);
+ } else {
+ tbp++;
+ }
+ }
+ } while(tbp != startedhere);
+ printf("'%s' not found\n",srch);
+ return(-1);
}
static int
gotoline(char *ln,char *buffer,char **bp,char *eob,int verbose)
{
- int lno, i, moveforward;
- char *tbp, *base;
-
- base = buffer;
- moveforward = 1;
-
- /* If destination line number is '.', assume you're already there.
- * If the '.' is followed by a '+' or '-' then the following number
- * is considered an offset from the current line instead of from the
- * start of the buffer.
- */
- if (ln[0] == '.') {
- base = *bp;
- if (ln[1] == '+')
- lno = atoi(&ln[2]) + 1;
- else if (ln[1] == '-') {
- lno = atoi(&ln[2]) + 2;
- moveforward = 0;
- }
- else
- goto end;
- }
- else if (ln[0] == '$') {
- lno = 99999999;
- }
- else
- lno = atoi(ln);
-
- if (lno < 1) {
- printf("Invalid line\n");
- return(-1);
- }
-
- if (moveforward) {
- for(tbp=base,i=1;i<lno&&tbp<eob;tbp++)
- if (*tbp == '\n') i++;
- if (tbp == eob) {
- if (verbose)
- printf("Pointer set to end of buffer.\n");
- /* If out of range, set pointer to end of buffer. */
- *bp = eob;
- return(-1);
- }
- }
- else {
- for(tbp=base,i=1;i<lno&&tbp>=buffer;tbp--)
- if (*tbp == '\n') i++;
- if (tbp < buffer) {
- if (verbose)
- printf("Pointer set to start of buffer.\n");
- /* If out of range, set pointer to beginning of buffer. */
- *bp = buffer;
- return(-1);
- }
- tbp+=2;
- }
- *bp = tbp;
+ int lno, i, moveforward;
+ char *tbp, *base;
+
+ base = buffer;
+ moveforward = 1;
+
+ /* If destination line number is '.', assume you're already there.
+ * If the '.' is followed by a '+' or '-' then the following number
+ * is considered an offset from the current line instead of from the
+ * start of the buffer.
+ */
+ if(ln[0] == '.') {
+ base = *bp;
+ if(ln[1] == '+') {
+ lno = atoi(&ln[2]) + 1;
+ } else if(ln[1] == '-') {
+ lno = atoi(&ln[2]) + 2;
+ moveforward = 0;
+ } else {
+ goto end;
+ }
+ } else if(ln[0] == '$') {
+ lno = 99999999;
+ } else {
+ lno = atoi(ln);
+ }
+
+ if(lno < 1) {
+ printf("Invalid line\n");
+ return(-1);
+ }
+
+ if(moveforward) {
+ for(tbp=base,i=1; i<lno&&tbp<eob; tbp++)
+ if(*tbp == '\n') {
+ i++;
+ }
+ if(tbp == eob) {
+ if(verbose) {
+ printf("Pointer set to end of buffer.\n");
+ }
+ /* If out of range, set pointer to end of buffer. */
+ *bp = eob;
+ return(-1);
+ }
+ } else {
+ for(tbp=base,i=1; i<lno&&tbp>=buffer; tbp--)
+ if(*tbp == '\n') {
+ i++;
+ }
+ if(tbp < buffer) {
+ if(verbose) {
+ printf("Pointer set to start of buffer.\n");
+ }
+ /* If out of range, set pointer to beginning of buffer. */
+ *bp = buffer;
+ return(-1);
+ }
+ tbp+=2;
+ }
+ *bp = tbp;
end:
- if (verbose) {
- printf("%3d: ",whatlineisthis(buffer,*bp));
- prline(*bp,eob);
- }
- return(0);
+ if(verbose) {
+ printf("%3d: ",whatlineisthis(buffer,*bp));
+ prline(*bp,eob);
+ }
+ return(0);
}
static int
whatlineisthis(char *buffer,char *bp)
{
- int lno;
- char *cp;
- cp = buffer;
-
- lno = 1;
- while(cp < bp) {
- if (*cp == '\n')
- lno++;
- cp++;
- }
- return(lno);
+ int lno;
+ char *cp;
+ cp = buffer;
+
+ lno = 1;
+ while(cp < bp) {
+ if(*cp == '\n') {
+ lno++;
+ }
+ cp++;
+ }
+ return(lno);
}
static int
getrange(char *cp,int *begin,int *end,char *buffer,char *bp,char *eob)
{
- char *dash;
- int b, e, lastline, thisline;
-
- if (!*cp)
- return(0);
-
- lastline = whatlineisthis(buffer,eob) - 1;
- thisline = whatlineisthis(buffer,bp);
-
- if (*cp == '.')
- b = thisline;
- else
- b = atoi(cp);
- dash = strchr(cp,'-');
- if (dash) {
- if (*(dash+1) == '$')
- e = lastline;
- else if (*(dash+1) == '.')
- e = thisline;
- else
- e = atoi(dash+1);
- }
- else
- e = b;
-
- if (e > lastline)
- e = lastline;
- if (begin)
- *begin = b;
- if (end)
- *end = e;
- if ((e <= 0) || (b <=0) || (e < b))
- printf("Bad range\n");
- return(e - b + 1);
+ char *dash;
+ int b, e, lastline, thisline;
+
+ if(!*cp) {
+ return(0);
+ }
+
+ lastline = whatlineisthis(buffer,eob) - 1;
+ thisline = whatlineisthis(buffer,bp);
+
+ if(*cp == '.') {
+ b = thisline;
+ } else {
+ b = atoi(cp);
+ }
+ dash = strchr(cp,'-');
+ if(dash) {
+ if(*(dash+1) == '$') {
+ e = lastline;
+ } else if(*(dash+1) == '.') {
+ e = thisline;
+ } else {
+ e = atoi(dash+1);
+ }
+ } else {
+ e = b;
+ }
+
+ if(e > lastline) {
+ e = lastline;
+ }
+ if(begin) {
+ *begin = b;
+ }
+ if(end) {
+ *end = e;
+ }
+ if((e <= 0) || (b <=0) || (e < b)) {
+ printf("Bad range\n");
+ }
+ return(e - b + 1);
}
static void
deletelines(char *lp,int lcnt,char *buffer,char **bp,char **eob)
{
- char *cp, *cp1, *t_bp, *t_eob;
-
- if (lcnt <= 0)
- return;
-
- t_bp = *bp;
- t_eob = *eob;
-
- if (gotoline(lp,buffer,&t_bp,t_eob,0) == -1)
- return;
- cp = cp1 = t_bp;
- while(lcnt>0) {
- if (cp >= t_eob) {
- printf("Pointer set to end of buffer.\n");
- break;
- }
- if (*cp == '\n')
- lcnt--;
- cp++;
- }
- while(cp != t_eob)
- *cp1++ = *cp++;
-
- *eob = cp1;
- *bp = t_bp;
+ char *cp, *cp1, *t_bp, *t_eob;
+
+ if(lcnt <= 0) {
+ return;
+ }
+
+ t_bp = *bp;
+ t_eob = *eob;
+
+ if(gotoline(lp,buffer,&t_bp,t_eob,0) == -1) {
+ return;
+ }
+ cp = cp1 = t_bp;
+ while(lcnt>0) {
+ if(cp >= t_eob) {
+ printf("Pointer set to end of buffer.\n");
+ break;
+ }
+ if(*cp == '\n') {
+ lcnt--;
+ }
+ cp++;
+ }
+ while(cp != t_eob) {
+ *cp1++ = *cp++;
+ }
+
+ *eob = cp1;
+ *bp = t_bp;
}
static char *
skipwhite(char *cp)
{
- while((*cp == ' ') || (*cp == '\t'))
- cp++;
- return(cp);
+ while((*cp == ' ') || (*cp == '\t')) {
+ cp++;
+ }
+ return(cp);
}
/* rmCR():
- * Given the source and size of the buffer, remove all instances of 0x0d
- * (carriage return) from the buffer. Return the number of CRs removed.
+ * Given the source and size of the buffer, remove all instances of 0x0d
+ * (carriage return) from the buffer. Return the number of CRs removed.
*/
static int
rmCR(char *src,int size)
{
- int i; /* Index into src array. */
- int tot; /* Keep track of total # of 0x0d's removed. */
- int remaining; /* Keep track of how far to go. */
-
- tot = 0;
- remaining = size;
- for (i=0;i<size;i++) {
- remaining--;
- if (src[i] == 0x0d) {
- src[i] = 0; /* Make sure memory is writeable. */
- if (src[i] != 0)
- continue;
- memcpy(&src[i],&src[i+1],remaining);
- tot++;
- }
- }
- if (tot)
- printf("Removed %d CRs\n",tot);
- return(tot);
+ int i; /* Index into src array. */
+ int tot; /* Keep track of total # of 0x0d's removed. */
+ int remaining; /* Keep track of how far to go. */
+
+ tot = 0;
+ remaining = size;
+ for(i=0; i<size; i++) {
+ remaining--;
+ if(src[i] == 0x0d) {
+ src[i] = 0; /* Make sure memory is writeable. */
+ if(src[i] != 0) {
+ continue;
+ }
+ memcpy(&src[i],&src[i+1],remaining);
+ tot++;
+ }
+ }
+ if(tot) {
+ printf("Removed %d CRs\n",tot);
+ }
+ return(tot);
}
#endif