int do_filevisitalt(char *fn) { struct buffer *bp; int status; char *adjf; status = killbuffer(curbp); if (status == ABORT || status == FALSE) return (ABORT); adjf = adjustname(fn, TRUE); if (adjf == NULL) return (FALSE); if (fisdir(adjf) == TRUE) return (do_dired(adjf)); if ((bp = findbuffer(adjf)) == NULL) return (FALSE); curbp = bp; if (showbuffer(bp, curwp, WFFULL) != TRUE) return (FALSE); if (bp->b_fname[0] == '\0') { if ((status = readin(adjf)) != TRUE) killbuffer(bp); return (status); } return (TRUE); }
/* * load - go load the file name we got passed. */ int load(const char *fname) { int s = TRUE, line; int nbytes = 0; char excbuf[128]; FILE *ffp; if ((fname = adjustname(fname, TRUE)) == NULL) /* just to be careful */ return (FALSE); if (ffropen(&ffp, fname, NULL) != FIOSUC) return (FALSE); line = 0; while ((s = ffgetline(ffp, excbuf, sizeof(excbuf) - 1, &nbytes)) == FIOSUC) { line++; excbuf[nbytes] = '\0'; if (excline(excbuf) != TRUE) { s = FIOERR; ewprintf("Error loading file %s at line %d", fname, line); break; } } (void)ffclose(ffp, NULL); excbuf[nbytes] = '\0'; if (s != FIOEOF || (nbytes && excline(excbuf) != TRUE)) return (FALSE); return (TRUE); }
/* ARGSUSED */ int filevisitalt(int f, int n) { struct buffer *bp; char fname[NFILEN], *bufp, *adjf; int status; if (getbufcwd(fname, sizeof(fname)) != TRUE) fname[0] = '\0'; bufp = eread("Find alternate file: ", fname, NFILEN, EFNEW | EFCR | EFFILE | EFDEF); if (bufp == NULL) return (ABORT); else if (bufp[0] == '\0') return (FALSE); status = killbuffer(curbp); if (status == ABORT || status == FALSE) return (ABORT); adjf = adjustname(fname, TRUE); if (adjf == NULL) return (FALSE); if ((bp = findbuffer(adjf)) == NULL) return (FALSE); curbp = bp; if (showbuffer(bp, curwp, WFFULL) != TRUE) return (FALSE); if (bp->b_fname[0] == '\0') { if ((status = readin(adjf)) != TRUE) killbuffer(bp); return (status); } return (TRUE); }
/* * This is equivalent to filevisit from file.c. * Look around to see if we can find the file in another buffer; if we * can't find it, create a new buffer, read in the text, and switch to * the new buffer. *scratch*, *grep*, *compile* needs to be handled * differently from other buffers which have "filenames". */ int loadbuffer(char *bname) { struct buffer *bufp; char *adjf; /* check for special buffers which begin with '*' */ if (bname[0] == '*') { if ((bufp = bfind(bname, FALSE)) != NULL) { curbp = bufp; return (showbuffer(bufp, curwp, WFFULL)); } else { return (FALSE); } } else { if ((adjf = adjustname(bname, TRUE)) == NULL) return (FALSE); if ((bufp = findbuffer(adjf)) == NULL) return (FALSE); } curbp = bufp; if (showbuffer(bufp, curwp, WFFULL) != TRUE) return (FALSE); if (bufp->b_fname[0] == '\0') { if (readin(adjf) != TRUE) { killbuffer(bufp); return (FALSE); } } return (TRUE); }
/*ARGSUSED*/ fileinsert(f, n) { register int s; char fname[NFILEN]; #ifdef EXTD_DIR ensurecwd(); edefset(curbp->b_cwd); #endif #ifndef NO_FILECOMP /* 90.04.04 by K.Maeda */ if ((s=eread("Insert file: ", fname, NFILEN, EFNEW|EFFILE|EFCR)) != TRUE) #else /* NO_FILECOMP */ if ((s=ereply("Insert file: ", fname, NFILEN)) != TRUE) #endif /* NO_FILECOMP */ return (s); #ifdef READONLY /* 91.01.05 by S.Yoshida */ if (curbp->b_flag & BFRONLY) { /* If this buffer is read-only, */ warnreadonly(); /* do only displaying warning. */ return TRUE; } else #endif /* READONLY */ return insertfile(adjustname(fname), (char *) NULL); /* don't set buffer name */ }
/* ARGSUSED */ int filewrite(int f, int n) { int s; char fname[NFILEN], bn[NBUFN]; char *adjfname, *bufp; if (getbufcwd(fname, sizeof(fname)) != TRUE) fname[0] = '\0'; if ((bufp = eread("Write file: ", fname, NFILEN, EFDEF | EFNEW | EFCR | EFFILE)) == NULL) return (ABORT); else if (bufp[0] == '\0') return (FALSE); adjfname = adjustname(fname, TRUE); if (adjfname == NULL) return (FALSE); /* old attributes are no longer current */ bzero(&curbp->b_fi, sizeof(curbp->b_fi)); if ((s = writeout(curbp, adjfname)) == TRUE) { (void)strlcpy(curbp->b_fname, adjfname, sizeof(curbp->b_fname)); if (getbufcwd(curbp->b_cwd, sizeof(curbp->b_cwd)) != TRUE) (void)strlcpy(curbp->b_cwd, "/", sizeof(curbp->b_cwd)); if (augbname(bn, basename(curbp->b_fname), sizeof(bn)) == FALSE) return (FALSE); free(curbp->b_bname); if ((curbp->b_bname = strdup(bn)) == NULL) return (FALSE); curbp->b_flag &= ~(BFBAK | BFCHG); upmodes(curbp); } return (s); }
/* ARGSUSED */ int poptofile(int f, int n) { struct buffer *bp; struct mgwin *wp; char fname[NFILEN], *adjf, *bufp; int status; if (getbufcwd(fname, sizeof(fname)) != TRUE) fname[0] = '\0'; if ((bufp = eread("Find file in other window: ", fname, NFILEN, EFNEW | EFCR | EFFILE | EFDEF)) == NULL) return (ABORT); else if (bufp[0] == '\0') return (FALSE); adjf = adjustname(fname, TRUE); if (adjf == NULL) return (FALSE); if ((bp = findbuffer(adjf)) == NULL) return (FALSE); if (bp == curbp) return (splitwind(f, n)); if ((wp = popbuf(bp)) == NULL) return (FALSE); curbp = bp; curwp = wp; if (bp->b_fname[0] == '\0') { if ((status = readin(adjf)) != TRUE) killbuffer(bp); return (status); } return (TRUE); }
/*ARGSUSED*/ fileinsert(f, n) { register int s; char fname[NFILEN]; if ((s=ereply("Insert file: ", fname, NFILEN)) != TRUE) return (s); return insertfile(adjustname(fname), (char *) NULL); /* don't set buffer name */ }
/* ARGSUSED */ int filewrite(int f, int n) { struct stat statbuf; int s; char fname[NFILEN], bn[NBUFN], tmp[NFILEN + 25]; char *adjfname, *bufp; FILE *ffp; if (getbufcwd(fname, sizeof(fname)) != TRUE) fname[0] = '\0'; if ((bufp = eread("Write file: ", fname, NFILEN, EFDEF | EFNEW | EFCR | EFFILE)) == NULL) return (ABORT); else if (bufp[0] == '\0') return (FALSE); adjfname = adjustname(fname, TRUE); if (adjfname == NULL) return (FALSE); /* Check if file exists; write checks done later */ if (stat(adjfname, &statbuf) == 0) { if (S_ISDIR(statbuf.st_mode)) { dobeep(); ewprintf("%s is a directory", adjfname); return (FALSE); } snprintf(tmp, sizeof(tmp), "File `%s' exists; overwrite", adjfname); if ((s = eyorn(tmp)) != TRUE) return (s); } /* old attributes are no longer current */ bzero(&curbp->b_fi, sizeof(curbp->b_fi)); if ((s = writeout(&ffp, curbp, adjfname)) == TRUE) { (void)strlcpy(curbp->b_fname, adjfname, sizeof(curbp->b_fname)); if (getbufcwd(curbp->b_cwd, sizeof(curbp->b_cwd)) != TRUE) (void)strlcpy(curbp->b_cwd, "/", sizeof(curbp->b_cwd)); if (augbname(bn, curbp->b_fname, sizeof(bn)) == FALSE) return (FALSE); free(curbp->b_bname); if ((curbp->b_bname = strdup(bn)) == NULL) return (FALSE); (void)fupdstat(curbp); curbp->b_flag &= ~BFCHG; upmodes(curbp); undo_add_boundary(FFRAND, 1); undo_add_modified(); } return (s); }
/*ARGSUSED*/ filevisit(f, n) { register BUFFER *bp; int s; char fname[NFILEN]; char *adjf; if ((s=ereply("Find file: ", fname, NFILEN)) != TRUE) return s; adjf = adjustname(fname); if ((bp = findbuffer(adjf)) == NULL) return FALSE; curbp = bp; if (showbuffer(bp, curwp, WFHARD) != TRUE) return FALSE; if (bp->b_fname[0] == 0) return readin(adjf); /* Read it in. */ return TRUE; }
/* ARGSUSED */ int fileinsert(int f, int n) { char fname[NFILEN], *bufp, *adjf; if (getbufcwd(fname, sizeof(fname)) != TRUE) fname[0] = '\0'; bufp = eread("Insert file: ", fname, NFILEN, EFNEW | EFCR | EFFILE | EFDEF); if (bufp == NULL) return (ABORT); else if (bufp[0] == '\0') return (FALSE); adjf = adjustname(bufp, TRUE); if (adjf == NULL) return (FALSE); return (insertfile(adjf, NULL, FALSE)); }
/*ARGSUSED*/ poptofile(f, n) { register BUFFER *bp; register WINDOW *wp; int s; char fname[NFILEN]; char *adjf; if ((s=ereply("Find file in other window: ", fname, NFILEN)) != TRUE) return s; adjf = adjustname(fname); if ((bp = findbuffer(adjf)) == NULL) return FALSE; if ((wp = popbuf(bp)) == NULL) return FALSE; curbp = bp; curwp = wp; if (bp->b_fname[0] == 0) return readin(adjf); /* Read it in. */ return TRUE; }
int backuptohomedir(int f, int n) { const char *c = _PATH_MG_DIR; char *p; if (bkupdir == NULL) { p = adjustname(c, TRUE); bkupdir = strndup(p, NFILEN); if (bkupdir == NULL) return(FALSE); if (mkdir(bkupdir, 0700) == -1 && errno != EEXIST) { free(bkupdir); bkupdir = NULL; } } else { free(bkupdir); bkupdir = NULL; } return (TRUE); }
/* * XXX dname needs to have enough place to store an additional '/'. */ struct buffer * dired_(char *dname) { struct buffer *bp; FILE *dirpipe; char line[256]; int len, ret; #ifdef MONA DIR *dirp; struct dirent *dent; char* month_names[] = {"Jan", "Feb" ,"Mar" ,"Apr" ,"May" ,"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; #endif if ((dname = adjustname(dname, FALSE)) == NULL) { ewprintf("Bad directory name"); return (NULL); } /* this should not be done, instead adjustname() should get a flag */ len = strlen(dname); if (dname[len - 1] != '/') { dname[len++] = '/'; dname[len] = '\0'; } if ((bp = findbuffer(dname)) == NULL) { ewprintf("Could not create buffer"); return (NULL); } if (bclear(bp) != TRUE) return (NULL); bp->b_flag |= BFREADONLY; #ifdef MONA dirp = opendir(dname); assert(dirp); while ((dent = readdir(dirp)) != NULL) { snprintf(line, sizeof(line), "%s/%s", dname, dent->d_name); int year, month, day, hour, min, sec, size; mona_get_file_datetime_size(line, &year, &month, &day, &hour, &min, &sec, &size); char* month_name; if (month <= 12 && month >= 1) { month_name = month_names[month - 1]; } else { // assert(0); month_name = "---"; } snprintf(line, sizeof(line), " %crwxrwxrwx 1 mona mona %d %s %02d %02d:%02d %s", fisdir(line) ? 'd' : '-', size, month_name, day, hour, min, dent->d_name); addline(bp, line); } closedir(dirp); #else #ifdef GNU_LS # ifdef __CYGWIN__ /* On Windows platforms the user or group name can be two * words, such as "Domain Users" or "First Last." So, we must * use the --numeric-uid-gid option of ls, or else we don't * know where the filename starts. */ ret = snprintf(line, sizeof(line), "ls -aln --time-style='+%%b %%d %%H:%%M' '%s'", dname); # else ret = snprintf(line, sizeof(line), "ls -al --time-style='+%%b %%d %%H:%%M' '%s'", dname); # endif #else ret = snprintf(line, sizeof(line), "ls -al '%s'", dname); #endif /* GNU_LS */ if (ret < 0 || ret >= sizeof(line)) { ewprintf("Path too long"); return (NULL); } if ((dirpipe = popen(line, "r")) == NULL) { ewprintf("Problem opening pipe to ls"); return (NULL); } line[0] = line[1] = ' '; while (fgets(&line[2], sizeof(line) - 2, dirpipe) != NULL) { line[strcspn(line, "\n")] = '\0'; /* remove ^J */ (void) addline(bp, line); } if (pclose(dirpipe) == -1) { ewprintf("Problem closing pipe to ls : %s", strerror(errno)); return (NULL); } #endif bp->b_dotp = bfirstlp(bp); (void)strlcpy(bp->b_fname, dname, sizeof(bp->b_fname)); (void)strlcpy(bp->b_cwd, dname, sizeof(bp->b_cwd)); if ((bp->b_modes[1] = name_mode("dired")) == NULL) { bp->b_modes[0] = name_mode("fundamental"); ewprintf("Could not find mode dired"); return (NULL); } bp->b_nmodes = 1; return (bp); }
/* ARGSUSED */ static int compile_goto_error(int f, int n) { struct buffer *bp; struct mgwin *wp; char *fname, *line, *lp, *ln; int lineno; char *adjf, path[NFILEN]; const char *errstr; struct line *last; compile_win = curwp; compile_buffer = curbp; last = blastlp(compile_buffer); retry: /* last line is compilation result */ if (curwp->w_dotp == last) return (FALSE); if ((line = linetostr(curwp->w_dotp)) == NULL) return (FALSE); lp = line; if ((fname = strsep(&lp, ":")) == NULL || *fname == '\0') goto fail; if ((ln = strsep(&lp, ":")) == NULL || *ln == '\0') goto fail; lineno = (int)strtonum(ln, INT_MIN, INT_MAX, &errstr); if (errstr) goto fail; if (fname && fname[0] != '/') { if (getbufcwd(path, sizeof(path)) == FALSE) goto fail; if (strlcat(path, fname, sizeof(path)) >= sizeof(path)) goto fail; adjf = path; } else { adjf = adjustname(fname, TRUE); } free(line); if (adjf == NULL) return (FALSE); if ((bp = findbuffer(adjf)) == NULL) return (FALSE); if ((wp = popbuf(bp, WNONE)) == NULL) return (FALSE); curbp = bp; curwp = wp; if (bp->b_fname[0] == '\0') readin(adjf); gotoline(FFARG, lineno); return (TRUE); fail: free(line); if (curwp->w_dotp != blastlp(curbp)) { curwp->w_dotp = lforw(curwp->w_dotp); curwp->w_rflag |= WFMOVE; goto retry; } dobeep(); ewprintf("No more hits"); return (FALSE); }
int main(int argc, char **argv) { char *cp, *init_fcn_name = NULL; PF init_fcn = NULL; int o, i, nfiles; struct buffer *bp = NULL; while ((o = getopt(argc, argv, "f:")) != -1) switch (o) { case 'f': if (init_fcn_name != NULL) errx(1, "cannot specify more than one " "initial function"); init_fcn_name = optarg; break; default: usage(); } argc -= optind; argv += optind; setlocale(LC_CTYPE, ""); maps_init(); /* Keymaps and modes. */ funmap_init(); /* Functions. */ if (init_fcn_name && (init_fcn = name_function(init_fcn_name)) == NULL) errx(1, "Unknown function `%s'", init_fcn_name); vtinit(); /* Virtual terminal. */ dirinit(); /* Get current directory. */ edinit(bp); /* Buffers, windows. */ bellinit(); /* Audible and visible bell. */ /* * doing update() before reading files causes the error messages from * the file I/O show up on the screen. (and also an extra display of * the mode line if there are files specified on the command line.) */ update(CMODE); /* Force FFOTHARG=1 so that this mode is enabled, not simply toggled */ if (init_fcn) init_fcn(FFOTHARG, 1); for (nfiles = 0, i = 0; i < argc; i++) { if (argv[i][0] == '+' && strlen(argv[i]) >= 2) { long lval; char *end; lval = strtol(&argv[i][1], &end, 0); if (argv[i][1] == '\0' || *end != '\0') goto notnum; startrow = lval; } else { notnum: cp = adjustname(argv[i], FALSE); if (cp != NULL) { if (nfiles == 1) splitwind(0, 1); if ((curbp = findbuffer(cp)) == NULL) { vttidy(); errx(1, "Can't find current buffer!"); } (void)showbuffer(curbp, curwp, 0); if (readin(cp) != TRUE) killbuffer(curbp); else { /* Ensure enabled, not just toggled */ if (init_fcn_name) init_fcn(FFOTHARG, 1); nfiles++; } } } } if (nfiles > 2) listbuffers(0, 1); /* fake last flags */ thisflag = 0; for (;;) { if (epresf == KCLEAR) eerase(); if (epresf == TRUE) epresf = KCLEAR; if (winch_flag) { do_redraw(0, 0, TRUE); winch_flag = 0; } update(CMODE); lastflag = thisflag; thisflag = 0; switch (doin()) { case TRUE: break; case ABORT: ewprintf("Quit"); /* FALLTHRU */ case FALSE: default: macrodef = FALSE; } } }
int do_makedir(char *path) { struct stat sb; int finished, ishere; mode_t dir_mode, f_mode, oumask; char *slash; if ((path = adjustname(path, TRUE)) == NULL) return (FALSE); /* Remove trailing slashes */ slash = strrchr(path, '\0'); while (--slash > path && *slash == '/') *slash = '\0'; slash = path; oumask = umask(0); f_mode = 0777 & ~oumask; dir_mode = f_mode | S_IWUSR | S_IXUSR; for (;;) { slash += strspn(slash, "/"); slash += strcspn(slash, "/"); finished = (*slash == '\0'); *slash = '\0'; ishere = !stat(path, &sb); if (finished && ishere) { dobeep(); ewprintf("Cannot create directory %s: file exists", path); return(FALSE); } else if (!finished && ishere && S_ISDIR(sb.st_mode)) { *slash = '/'; continue; } if (mkdir(path, finished ? f_mode : dir_mode) == 0) { if (f_mode > 0777 && chmod(path, f_mode) < 0) { umask(oumask); return (ABORT); } } else { if (!ishere || !S_ISDIR(sb.st_mode)) { if (!ishere) { dobeep(); ewprintf("Creating directory: " "permission denied, %s", path); } else eerase(); umask(oumask); return (FALSE); } } if (finished) break; *slash = '/'; } eerase(); umask(oumask); return (TRUE); }
/* * return list of file names that match the name in buf. */ struct list * make_file_list(char *buf) { char *dir, *file, *cp; size_t len, preflen; int ret; DIR *dirp; struct dirent *dent; struct list *last, *current; char fl_name[NFILEN + 2]; char prefixx[NFILEN + 1]; /* * We need three different strings: * dir - the name of the directory containing what the user typed. * Must be a real unix file name, e.g. no ~user, etc.. * Must not end in /. * prefix - the portion of what the user typed that is before the * names we are going to find in the directory. Must have a * trailing / if the user typed it. * names from the directory - We open dir, and return prefix * concatenated with names. */ /* first we get a directory name we can look up */ /* * Names ending in . are potentially odd, because adjustname will * treat foo/bar/.. as a foo/, whereas we are * interested in names starting with .. */ len = strlen(buf); if (len && buf[len - 1] == '.') { buf[len - 1] = 'x'; dir = adjustname(buf, TRUE); buf[len - 1] = '.'; } else dir = adjustname(buf, TRUE); if (dir == NULL) return (NULL); /* * If the user typed a trailing / or the empty string * he wants us to use his file spec as a directory name. */ if (len && buf[len - 1] != '/') { file = strrchr(dir, '/'); if (file) { *file = '\0'; if (*dir == '\0') dir = "/"; } else return (NULL); } /* Now we get the prefix of the name the user typed. */ if (strlcpy(prefixx, buf, sizeof(prefixx)) >= sizeof(prefixx)) return (NULL); cp = strrchr(prefixx, '/'); if (cp == NULL) prefixx[0] = '\0'; else cp[1] = '\0'; preflen = strlen(prefixx); /* cp is the tail of buf that really needs to be compared. */ cp = buf + preflen; len = strlen(cp); /* * Now make sure that file names will fit in the buffers allocated. * SV files are fairly short. For BSD, something more general would * be required. */ if (preflen > NFILEN - MAXNAMLEN) return (NULL); /* loop over the specified directory, making up the list of files */ /* * Note that it is worth our time to filter out names that don't * match, even though our caller is going to do so again, and to * avoid doing the stat if completion is being done, because stat'ing * every file in the directory is relatively expensive. */ dirp = opendir(dir); if (dirp == NULL) return (NULL); last = NULL; while ((dent = readdir(dirp)) != NULL) { int isdir; if (strncmp(cp, dent->d_name, len) != 0) continue; isdir = 0; if (dent->d_type == DT_DIR) { isdir = 1; } else if (dent->d_type == DT_LNK || dent->d_type == DT_UNKNOWN) { struct stat statbuf; char statname[NFILEN + 2]; statbuf.st_mode = 0; ret = snprintf(statname, sizeof(statname), "%s/%s", dir, dent->d_name); if (ret < 0 || ret > sizeof(statname) - 1) continue; if (stat(statname, &statbuf) < 0) continue; if (S_ISDIR(statbuf.st_mode)) isdir = 1; } if ((current = malloc(sizeof(struct list))) == NULL) { free_file_list(last); closedir(dirp); return (NULL); } ret = snprintf(fl_name, sizeof(fl_name), "%s%s%s", prefixx, dent->d_name, isdir ? "/" : ""); if (ret < 0 || ret >= sizeof(fl_name)) { free(current); continue; } current->l_next = last; current->l_name = strdup(fl_name); last = current; } closedir(dirp); return (last); }
int main(int argc, char **argv) { char *cp, *init_fcn_name = NULL; PF init_fcn = NULL; int o, i, nfiles; int nobackups = 0; struct buffer *bp = NULL; #ifdef MRUBY mrb_mg_init(); int noinitfile = 0; #endif /* MRUBY */ while ((o = getopt(argc, argv, "nf:q")) != -1) switch (o) { case 'n': nobackups = 1; break; case 'f': if (init_fcn_name != NULL) errx(1, "cannot specify more than one " "initial function"); init_fcn_name = optarg; break; case 'q': noinitfile = 1; break; default: usage(); } argc -= optind; argv += optind; maps_init(); /* Keymaps and modes. */ funmap_init(); /* Functions. */ /* * This is where we initialize standalone extensions that should * be loaded dynamically sometime in the future. */ { extern void grep_init(void); extern void theo_init(void); extern void cmode_init(void); extern void dired_init(void); dired_init(); grep_init(); theo_init(); cmode_init(); #ifdef UTF8 utf8_init(); #endif /* UTF8 */ } if (init_fcn_name && (init_fcn = name_function(init_fcn_name)) == NULL) errx(1, "Unknown function `%s'", init_fcn_name); vtinit(); /* Virtual terminal. */ dirinit(); /* Get current directory. */ edinit(bp); /* Buffers, windows. */ ttykeymapinit(); /* Symbols, bindings. */ /* * doing update() before reading files causes the error messages from * the file I/O show up on the screen. (and also an extra display of * the mode line if there are files specified on the command line.) */ update(); /* user startup file */ #ifdef MRUBY if (noinitfile == 0 && (cp = startupfile(NULL)) != NULL) mrb_mg_load(cp); #else if ((cp = startupfile(NULL)) != NULL) (void)load(cp); #endif /* MRUBY */ /* * Now ensure any default buffer modes from the startup file are * given to any files opened when parsing the startup file. * Note *scratch* will also be updated. */ for (bp = bheadp; bp != NULL; bp = bp->b_bufp) { bp->b_flag = defb_flag; for (i = 0; i <= defb_nmodes; i++) { bp->b_modes[i] = defb_modes[i]; } } /* Force FFOTHARG=1 so that this mode is enabled, not simply toggled */ if (init_fcn) init_fcn(FFOTHARG, 1); if (nobackups) makebkfile(FFARG, 0); for (nfiles = 0, i = 0; i < argc; i++) { if (argv[i][0] == '+' && strlen(argv[i]) >= 2) { long long lval; const char *errstr; lval = strtonum(&argv[i][1], INT_MIN, INT_MAX, &errstr); if (argv[i][1] == '\0' || errstr != NULL) goto notnum; startrow = lval; } else { notnum: cp = adjustname(argv[i], FALSE); if (cp != NULL) { if (nfiles == 1) splitwind(0, 1); if ((curbp = findbuffer(cp)) == NULL) { vttidy(); errx(1, "Can't find current buffer!"); } (void)showbuffer(curbp, curwp, 0); if (readin(cp) != TRUE) killbuffer(curbp); else { /* Ensure enabled, not just toggled */ if (init_fcn_name) init_fcn(FFOTHARG, 1); nfiles++; } } } } if (nfiles > 2) listbuffers(0, 1); /* fake last flags */ thisflag = 0; for (;;) { if (epresf == KCLEAR) eerase(); if (epresf == TRUE) epresf = KCLEAR; if (winch_flag) { do_redraw(0, 0, TRUE); winch_flag = 0; } update(); lastflag = thisflag; thisflag = 0; switch (doin()) { case TRUE: break; case ABORT: ewprintf("Quit"); /* FALLTHRU */ case FALSE: default: ttbeep(); macrodef = FALSE; } } }