/* * Move to a particular line (the argument). Count from bottom of file if * argument is negative. */ int vl_gotoline(int n) { int status = TRUE; /* status return */ MARK odot; if (n == 0) /* if a bogus argument...then leave */ return (FALSE); odot = DOT; DOT.o = w_left_margin(curwp); if (n < 0) { DOT.l = lback(buf_head(curbp)); status = backline(TRUE, -n - 1); } else { DOT.l = lforw(buf_head(curbp)); status = forwline(TRUE, n - 1); } if (status != TRUE) { DOT = odot; return status; } (void) firstnonwhite(FALSE, 1); curwp->w_flag |= WFMOVE; return TRUE; }
/* * Move forward n rows on the screen, staying in the same column. It's ok to * scroll, too. */ int forw_row(int f, int n) { int code = TRUE; int col, next; n = need_a_count(f, n, 1); if (n < 0) { code = back_row(f, -n); } else if (n > 0) { /* set the "goal" column if necessary */ if (curgoal < 0) curgoal = getccol(FALSE); col = curgoal; next = col; while ((n-- > 0) && (code == TRUE)) { int save = next; next += term.cols; if (gotocol(TRUE, next + 1) == FALSE) { curgoal %= term.cols; gotocol(TRUE, save); code = forwline(TRUE, 1); } else { curgoal = next; } } } return code; }
/* * Move forward by full lines bound to "C-N". * Just calls forwline, with raw = FALSE. * Required because bound keys have form fun(f, n). */ PASCAL NEAR bforwline( int f, int n )/* argument falg and num */ { return(forwline(f, n, FALSE)); }
/* ARGSUSED */ int backline(int f, int n) { struct line *dlp; if (n < 0) return (forwline(f | FFRAND, -n)); if ((lastflag & CFCPCN) == 0) /* Fix goal. */ setgoal(); thisflag |= CFCPCN; dlp = curwp->w_dotp; if (lback(dlp) == curbp->b_headp) { if (!(f & FFRAND)) { dobeep(); ewprintf("Beginning of buffer"); } return(TRUE); } while (n-- && lback(dlp) != curbp->b_headp) { dlp = lback(dlp); curwp->w_dotline--; } if (n > 0 && !(f & FFRAND)) { dobeep(); ewprintf("Beginning of buffer"); } curwp->w_dotp = dlp; curwp->w_doto = getgoal(dlp); curwp->w_rflag |= WFMOVE; return (TRUE); }
PASCAL NEAR gotoline( /* move to a particular line. argument (n) must be a positive integer for this to actually do anything */ int f, int n ) /* prefix flag and argument */ { register int status; /* status return */ char arg[NSTRING]; /* buffer to hold argument */ /* get an argument if one doesnt exist */ if (f == FALSE) { if ((status = mlreply(TEXT7, arg, NSTRING)) != TRUE) { /* "Line to GOTO: " */ mlwrite(TEXT8); /* "[Aborted]" */ return(status); } n = asc_int(arg); } if (n < 1) /* if a bogus argument...then leave */ return(FALSE); /* first, we go to the start of the buffer */ curwp->w_dotp = lforw(curbp->b_linep); curwp->w_doto = 0; return(forwline(f,n-1,TRUE)); }
/* * Implements the vi "k" command. * * This function is like "forwline", but goes backwards. */ int backline(int f, int n) { int rc; LINE *dlp; n = need_a_count(f, n, 1); if (n < 0) { rc = forwline(f, -n); } else if (is_first_line(DOT, curbp)) { /* cannot move up */ rc = FALSE; } else { /* set the "goal" column if necessary */ if (curgoal < 0) curgoal = getccol(FALSE); /* loop upwards */ dlp = DOT.l; while (n-- && lback(dlp) != buf_head(curbp)) dlp = lback(dlp); /* set dot */ DOT.l = dlp; DOT.o = getgoal(dlp); curwp->w_flag |= WFMOVE; rc = TRUE; } return rc; }
/* move to a particular line. argument (n) must be a positive integer for this * to actually do anything */ int gotoline (int f, int n) { if (n < 1) /* if a bogus argument...then leave */ return (FALSE); /* first, we go to the start of the buffer */ curwp->w_dotp = lforw (curbp->b_linep); curwp->w_doto = 0; return (forwline (f, n - 1)); }
/* * move to a particular line. argument (n) must be a positive integer for this * to actually do anything */ int gotoline(int f, int n) { if ((n < 1) || (n > curwp->w_bufp->b_lines)) /* if a bogus argument...then leave */ return (FALSE); /* but we should never get here */ /* first, we go to the start of the buffer */ curwp->w_dotp = lforw(curbp->b_linep); curwp->w_doto = 0; curwp->w_dotline = 0; /* and reset the line number */ return (forwline(f, n - 1)); }
/* * Implements the vi "^M" command. * * Like 'forwline()', but goes to the first non-white character position. */ int forwbline(int f, int n) { int s; n = need_a_count(f, n, 1); if ((s = forwline(f, n)) != TRUE) return (s); return firstnonwhite(FALSE, 1); }
/* * Implements the vi "$" command. * * Move the cursor to the end of the current line. Trivial. */ int gotoeol(int f, int n) { if (f == TRUE) { if (n > 0) --n; else if (n < 0) ++n; if (forwline(f, n) != TRUE) return FALSE; } DOT.o = llength(DOT.l); curgoal = VL_HUGE; return (TRUE); }
/* * This function is like "forwline", but goes backwards. The scheme is exactly * the same. Check for arguments that are less than zero and call your * alternate. Figure out the new line and call "movedot" to perform the * motion. No errors are possible. Bound to "C-P". */ int backline (int f, int n) { LINE *dlp; if (n < 0) return (forwline (f, -n)); if ((lastflag & CFCPCN) == 0)/* Reset goal if the */ curgoal = getccol (FALSE); /* last isn't C-P, C-N */ thisflag |= CFCPCN; dlp = curwp->w_dotp; while (n-- && lback (dlp) != curbp->b_linep) dlp = lback (dlp); curwp->w_dotp = dlp; curwp->w_doto = getgoal (dlp); curwp->w_flag |= WFMOVE; return (TRUE); }
/* * This function is like "forwline", but goes backwards. The scheme is exactly * the same. Check for arguments that are less than zero and call your * alternate. Figure out the new line and call "movedot" to perform the * motion. No errors are possible. Bound to "C-P". * If raw is TRUE then enter folds, else skip them. MJB: 13-Oct-89 */ PASCAL NEAR backline( int f, int n, int raw ) /* argument falg and num */ { register LINE *dlp; if (n < 0) return(forwline(f, -n, raw)); /* if we are on the last line as we start....fail the command */ if (lback(curwp->w_dotp) == curbp->b_linep) return(FALSE); /* if the last command was not note a line move, reset the goal column */ if ((lastflag&CFCPCN) == 0) curgoal = getccol(FALSE); /* flag this command as a line move */ thisflag |= CFCPCN; /* and move the point up */ dlp = curwp->w_dotp; while (n-- && lback(dlp)!=curbp->b_linep) if (raw) /* raw mode */ dlp = dlp->l_bp; else /* it's cooked */ dlp = lback(dlp); /* reseting the current position */ curwp->w_dotp = dlp; curwp->w_doto = getgoal(dlp); curwp->w_flag |= WFMOVE; if (raw) /* may have entered folds */ openoutfolds(); #if DBCS return(stopback()); #else return(TRUE); #endif }
/* ARGSUSED */ int prefixregion(int f, int n) { struct line *first, *last; struct region region; char *prefix = prefix_string; int nline; int s; if ((s = checkdirty(curbp)) != TRUE) return (s); if (curbp->b_flag & BFREADONLY) { dobeep(); ewprintf("Buffer is read-only"); return (FALSE); } if ((f == TRUE) && ((s = setprefix(FFRAND, 1)) != TRUE)) return (s); /* get # of lines to affect */ if ((s = getregion(®ion)) != TRUE) return (s); first = region.r_linep; last = (first == curwp->w_dotp) ? curwp->w_markp : curwp->w_dotp; for (nline = 1; first != last; nline++) first = lforw(first); /* move to beginning of region */ curwp->w_dotp = region.r_linep; curwp->w_doto = region.r_offset; curwp->w_dotline = region.r_lineno; /* for each line, go to beginning and insert the prefix string */ while (nline--) { (void)gotobol(FFRAND, 1); for (prefix = prefix_string; *prefix; prefix++) (void)linsert(1, *prefix); (void)forwline(FFRAND, 1); } (void)gotobol(FFRAND, 1); return (TRUE); }
/* ARGSUSED */ int backline(int f, int n) { struct line *dlp; if (n < 0) return (forwline(f | FFRAND, -n)); if ((lastflag & CFCPCN) == 0) /* Fix goal. */ setgoal(); thisflag |= CFCPCN; dlp = curwp->w_dotp; while (n-- && lback(dlp) != curbp->b_headp) { dlp = lback(dlp); curwp->w_dotline--; } curwp->w_dotp = dlp; curwp->w_doto = getgoal(dlp); curwp->w_rflag |= WFMOVE; return (TRUE); }
int buffermenu(int f, int n) { BUFFER *bp; BUFFER *org_bp = curbp; int c,k; int bufptr; int bufcount = 0; bufptr = 1; start: listbuffers(f,n); swbuffer(blistp); onlywind(0,0); bufcount = count_buffers(); if (bufptr > bufcount) bufptr = bufcount; if (bufcount > 0) forwline(0, bufptr + 1); else forwline(0, 2); for (;;) { mlwrite("Buffer Menu: 1,2,s,v,k,q "); update(); c = ttgetc(); /* if no buffers, only allow exit */ if (bufcount == 0) { switch (c) { case 'q': case 'Q': case 'x': case 'X': break; default: (*term.t_beep) (); continue; } } /* * pre process escape sequence to get up/down arrows * convert to CTRL+N, CTRL+P */ if (c == ESC) { k = getctl(); if (k == '[') { k = getctl(); switch(k) { case 'A': c = CTRL_P; break; case 'B': c = CTRL_N; break; default: (*term.t_beep)(); continue; } } else { k = getctl(); (*term.t_beep) (); continue; } } /* if ESC */ switch (c) { case 'n': case 'N': case CTRL_N: if (bufcount == bufptr) { (*term.t_beep) (); break; } forwline(0,1); bufptr++; break; case 'p': case 'P': case CTRL_P: if (bufptr == 1) { (*term.t_beep) (); break; } backline(0,1); bufptr--; break; case '1': bp = get_buffer(bufptr); swbuffer(bp); onlywind(0,0); mlerase(); return TRUE; case '2': bp = get_buffer(bufptr); swbuffer(bp); onlywind(0,0); /* need to check or is still valid */ if (valid_buf(org_bp) == TRUE && bufcount > 1) { splitwind(0,0); swbuffer(org_bp); nextwind(0,0); } mlerase(); return TRUE; /* save file */ case 's': case 'S': bp = get_buffer(bufptr); if (bp != NULL) { curbp = bp; (void)filesave(0,0); curbp = blistp; goto start; } break; /* toggle read only */ case 'v': case 'V': case '%': bp = get_buffer(bufptr); if (bp != NULL) /* be defensive */ bp->b_flag ^= BFRO; goto start; break; /* kill buffer */ case 'k': case 'K': bp = get_buffer(bufptr); if (bp != NULL) zotbuf(bp); goto start; break; /* exit buffer menu */ case 'q': case 'Q': case 'x': case 'X': if (bufcount == 0) { bp = get_scratch(); swbuffer(bp); onlywind(0,0); mlerase(); return TRUE; } if (valid_buf(org_bp) == TRUE) swbuffer(org_bp); else swbuffer(bheadp); onlywind(0,0); mlerase(); return TRUE; /* any other key */ default: (*term.t_beep) (); break; } } mlerase(); return TRUE; }
int main(int argc, char *argv[]) #endif { UCS c; register int f; register int n; register BUFFER *bp; int viewflag = FALSE; /* are we starting in view mode?*/ int starton = 0; /* where's dot to begin with? */ int setlocale_collate = 1; char bname[NBUFN]; /* buffer name of file to read */ char *file_to_edit = NULL; char *display_charmap = NULL, *dc; char *keyboard_charmap = NULL; int use_system = 0; char *err = NULL; set_input_timeout(600); Pmaster = NULL; /* turn OFF composer functionality */ km_popped = 0; /* * Read command line flags before initializing, otherwise, we never * know to init for f_keys... */ file_to_edit = pico_args(argc, argv, &starton, &viewflag, &setlocale_collate); set_collation(setlocale_collate, 1); #define cpstr(s) strcpy((char *)fs_get(1+strlen(s)), s) #ifdef _WINDOWS init_utf8_display(1, NULL); #else /* UNIX */ if(display_character_set) display_charmap = cpstr(display_character_set); #if HAVE_LANGINFO_H && defined(CODESET) else if((dc = nl_langinfo_codeset_wrapper()) != NULL) display_charmap = cpstr(dc); #endif if(!display_charmap) display_charmap = cpstr("US-ASCII"); if(keyboard_character_set) keyboard_charmap = cpstr(keyboard_character_set); else keyboard_charmap = cpstr(display_charmap); if(use_system_translation){ #if PREREQ_FOR_SYS_TRANSLATION use_system++; /* This modifies its arguments */ if(setup_for_input_output(use_system, &display_charmap, &keyboard_charmap, &input_cs, &err) == -1){ fprintf(stderr, "%s\n", err ? err : "trouble with character set"); exit(1); } else if(err){ fprintf(stderr, "%s\n", err); fs_give((void **) &err); } #endif } if(!use_system){ if(setup_for_input_output(use_system, &display_charmap, &keyboard_charmap, &input_cs, &err) == -1){ fprintf(stderr, "%s\n", err ? err : "trouble with character set"); exit(1); } else if(err){ fprintf(stderr, "%s\n", err); fs_give((void **) &err); } } if(keyboard_charmap){ set_locale_charmap(keyboard_charmap); free((void *) keyboard_charmap); } if(display_charmap) free((void *) display_charmap); #endif /* UNIX */ /* * There are a couple arguments that we need to be sure * are converted for internal use. */ if(alt_speller) alt_speller = cpstr(fname_to_utf8(alt_speller)); if(opertree && opertree[0]){ strncpy(opertree, fname_to_utf8(opertree), sizeof(opertree)); opertree[sizeof(opertree)-1] = '\0'; } if(glo_quote_str_orig) glo_quote_str = utf8_to_ucs4_cpystr(fname_to_utf8(glo_quote_str_orig)); if(glo_wordseps_orig) glo_wordseps = utf8_to_ucs4_cpystr(fname_to_utf8(glo_wordseps_orig)); if(file_to_edit) file_to_edit = cpstr(fname_to_utf8(file_to_edit)); #undef cpstr #if defined(DOS) || defined(OS2) if(file_to_edit){ /* strip quotes? */ int l; if(strchr("'\"", file_to_edit[0]) && (l = strlen(file_to_edit)) > 1 && file_to_edit[l-1] == file_to_edit[0]){ file_to_edit[l-1] = '\0'; /* blat trailing quote */ file_to_edit++; /* advance past leading quote */ } } #endif if(!vtinit()) /* Displays. */ exit(1); strncpy(bname, "main", sizeof(bname)); /* default buffer name */ bname[sizeof(bname)-1] = '\0'; edinit(bname); /* Buffers, windows. */ update(); /* let the user know we are here */ #ifdef _WINDOWS mswin_setwindow(NULL, NULL, NULL, NULL, NULL, NULL); mswin_showwindow(); mswin_showcaret(1); /* turn on for main window */ mswin_allowpaste(MSWIN_PASTE_FULL); mswin_setclosetext("Use the ^X command to exit Pico."); mswin_setscrollcallback (pico_scroll_callback); #endif #if defined(USE_TERMCAP) || defined(USE_TERMINFO) || defined(VMS) if(kbesc == NULL){ /* will arrow keys work ? */ (*term.t_putchar)('\007'); emlwrite("Warning: keypad keys may be non-functional", NULL); } #endif /* USE_TERMCAP/USE_TERMINFO/VMS */ if(file_to_edit){ /* Any file to edit? */ makename(bname, file_to_edit); /* set up a buffer for this file */ bp = curbp; /* read in first file */ makename(bname, file_to_edit); strncpy(bp->b_bname, bname, sizeof(bp->b_bname)); bp->b_bname[sizeof(bp->b_bname)-1] = '\0'; if(strlen(file_to_edit) >= NFILEN){ char buf[128]; snprintf(buf, sizeof(buf), "Filename \"%.10s...\" too long", file_to_edit); emlwrite(buf, NULL); file_to_edit = NULL; } else{ strncpy(bp->b_fname, file_to_edit, sizeof(bp->b_fname)); bp->b_fname[sizeof(bp->b_fname)-1] = '\0'; if (((gmode&MDTREE) && !in_oper_tree(file_to_edit)) || readin(file_to_edit, (viewflag==FALSE), TRUE) == ABORT) { if ((gmode&MDTREE) && !in_oper_tree(file_to_edit)){ EML eml; eml.s = opertree; emlwrite(_("Can't read file from outside of %s"), &eml); } file_to_edit = NULL; } } if(!file_to_edit){ strncpy(bp->b_bname, "main", sizeof(bp->b_bname)); bp->b_bname[sizeof(bp->b_bname)-1] = '\0'; strncpy(bp->b_fname, "", sizeof(bp->b_fname)); bp->b_fname[sizeof(bp->b_fname)-1] = '\0'; } bp->b_dotp = bp->b_linep; bp->b_doto = 0; if (viewflag) /* set the view mode */ bp->b_mode |= MDVIEW; } /* setup to process commands */ lastflag = 0; /* Fake last flags. */ curbp->b_mode |= gmode; /* and set default modes*/ curwp->w_flag |= WFMODE; /* and force an update */ if(timeoutset){ EML eml; eml.s = comatose(get_input_timeout()); emlwrite(_("Checking for new mail every %s seconds"), &eml); } forwline(0, starton - 1); /* move dot to specified line */ while(1){ if(km_popped){ km_popped--; if(km_popped == 0) /* cause bottom three lines to be repainted */ curwp->w_flag |= WFHARD; } if(km_popped){ /* temporarily change to cause menu to be painted */ term.t_mrow = 2; curwp->w_ntrows -= 2; curwp->w_flag |= WFMODE; movecursor(term.t_nrow-2, 0); /* clear status line, too */ peeol(); } update(); /* Fix up the screen */ if(km_popped){ term.t_mrow = 0; curwp->w_ntrows += 2; } #ifdef MOUSE #ifdef EX_MOUSE /* New mouse function for real mouse text seletion. */ register_mfunc(mouse_in_pico, 2, 0, term.t_nrow - (term.t_mrow + 1), term.t_ncol); #else mouse_in_content(KEY_MOUSE, -1, -1, 0, 0); register_mfunc(mouse_in_content, 2, 0, term.t_nrow - (term.t_mrow + 1), term.t_ncol); #endif #endif #ifdef _WINDOWS mswin_setdndcallback (pico_file_drop); mswin_mousetrackcallback(pico_cursor); #endif c = GetKey(); #ifdef MOUSE #ifdef EX_MOUSE clear_mfunc(mouse_in_pico); #else clear_mfunc(mouse_in_content); #endif #endif #ifdef _WINDOWS mswin_cleardndcallback (); mswin_mousetrackcallback(NULL); #endif if(timeoutset && (c == NODATA || time_to_check())){ if(pico_new_mail()) emlwrite(_("You may possibly have new mail."), NULL); } if(km_popped) switch(c){ case NODATA: case (CTRL|'L'): km_popped++; break; default: /* clear bottom three lines */ mlerase(); break; } if(c == NODATA) continue; if(mpresf){ /* erase message line? */ if(mpresf++ > MESSDELAY) mlerase(); } f = FALSE; n = 1; #ifdef MOUSE clear_mfunc(mouse_in_content); #endif /* Do it. */ execute(normalize_cmd(c, fkm, 1), f, n); } }
/* * PgDn. Scroll down (rows / 2). * Just forwline(f, (rows / 2)) * Bound to C-V */ int pagedown(int f, int n) { forwline(f, (rows / 2)); return (TRUE); }
/* * Set a variable. * * @var: variable to set. * @value: value to set to. */ int svar(struct variable_description *var, char *value) { int vnum; /* ordinal number of var refrenced */ int vtype; /* type of variable to set */ int status; /* status return */ int c; /* translated character */ char *sp; /* scratch string pointer */ /* simplify the vd structure (we are gonna look at it a lot) */ vnum = var->v_num; vtype = var->v_type; /* and set the appropriate value */ status = TRUE; switch (vtype) { case TKVAR: /* set a user variable */ if (uv[vnum].u_value != NULL) free(uv[vnum].u_value); sp = malloc(strlen(value) + 1); if (sp == NULL) return FALSE; strcpy(sp, value); uv[vnum].u_value = sp; break; case TKENV: /* set an environment variable */ status = TRUE; /* by default */ switch (vnum) { case EVFILLCOL: fillcol = atoi(value); break; case EVPAGELEN: status = newsize(TRUE, atoi(value)); break; case EVCURCOL: status = setccol(atoi(value)); break; case EVCURLINE: status = gotoline(TRUE, atoi(value)); break; case EVRAM: break; case EVFLICKER: flickcode = stol(value); break; case EVCURWIDTH: status = newwidth(TRUE, atoi(value)); break; case EVCBUFNAME: strcpy(curbp->b_bname, value); curwp->w_flag |= WFMODE; break; case EVCFNAME: strcpy(curbp->b_fname, value); curwp->w_flag |= WFMODE; break; case EVSRES: status = TTrez(value); break; case EVDEBUG: macbug = stol(value); break; case EVSTATUS: cmdstatus = stol(value); break; case EVASAVE: gasave = atoi(value); break; case EVACOUNT: gacount = atoi(value); break; case EVLASTKEY: lastkey = atoi(value); break; case EVCURCHAR: ldelchar(1, FALSE); /* delete 1 char */ c = atoi(value); if (c == '\n') lnewline(); else linsert(1, c); backchar(FALSE, 1); break; case EVDISCMD: discmd = stol(value); break; case EVVERSION: break; case EVPROGNAME: break; case EVSEED: seed = atoi(value); break; case EVDISINP: disinp = stol(value); break; case EVWLINE: status = resize(TRUE, atoi(value)); break; case EVCWLINE: status = forwline(TRUE, atoi(value) - getwpos()); break; case EVTARGET: curgoal = atoi(value); thisflag = saveflag; break; case EVSEARCH: strcpy(pat, value); rvstrcpy(tap, pat); #if MAGIC mcclear(); #endif break; case EVREPLACE: strcpy(rpat, value); break; case EVMATCH: break; case EVKILL: break; case EVCMODE: curbp->b_mode = atoi(value); curwp->w_flag |= WFMODE; break; case EVGMODE: gmode = atoi(value); break; case EVTPAUSE: term.t_pause = atoi(value); break; case EVPENDING: break; case EVLWIDTH: break; case EVLINE: putctext(value); case EVGFLAGS: gflags = atoi(value); break; case EVRVAL: break; case EVTAB: tabmask = atoi(value) - 1; if (tabmask != 0x07 && tabmask != 0x03) tabmask = 0x07; curwp->w_flag |= WFHARD; break; case EVOVERLAP: overlap = atoi(value); break; case EVSCROLLCOUNT: scrollcount = atoi(value); break; case EVSCROLL: #if SCROLLCODE if (!stol(value)) term.t_scroll = NULL; #endif break; } break; } return status; }