int execprg(int f, int n) { #ifndef WINNT int s; char line[NLINE]; #endif /* don't allow this command if restricted */ if (restflag) return resterr(); #if WINNT mlwrite("(unsupported)"); return FALSE; #endif #if VMS if ((s = mlreply("!", line, NLINE)) != TRUE) return s; TTflush(); s = sys(line); /* Run the command. */ mlputs("\r\n\n(End)"); /* Pause. */ TTflush(); tgetc(); sgarbf = TRUE; return s; #endif #if MSDOS if ((s = mlreply("$", line, NLINE)) != TRUE) return s; movecursor(term.t_nrow, 0); TTkclose(); execprog(line); TTkopen(); /* if we are interactive, pause here */ if (clexec == FALSE) { mlputs("\r\n(End)"); tgetc(); } sgarbf = TRUE; return TRUE; #endif #if V7 | USG | BSD if ((s = mlreply("!", line, NLINE)) != TRUE) return s; TTputc('\n'); /* Already have '\r' */ TTflush(); TTclose(); /* stty to old modes */ TTkclose(); system(line); fflush(stdout); /* to be sure P.K. */ TTopen(); mlputs("(End)"); /* Pause. */ TTflush(); while ((s = tgetc()) != '\r' && s != ' '); sgarbf = TRUE; return TRUE; #endif }
int keycursor(int row, int col) { movecursor(row, col); wrefresh(curwin); waitkeypressed(0); return getakey(); }
void vttidy() { mlerase(); movecursor(term.t_nrow, 0); TTflush(); TTclose(); TTkclose(); }
static void printinstr(void) { int ctr; for (ctr=0; ctr<80; ctr++) putstring(24, ctr, C_HELP_INSTR, " "); movecursor(24, 1); PUT_KEY("Escape", "Abort"); }
/* move the cursor around, like for firing a wand, sets x and y to target */ void setspot(int *x, int *y) { char c = ' '; mprint("Targeting.... ? for help"); omshowcursor(*x,*y); while ((c != '.') && (c != ESCAPE)) { c = lgetc(); switch(c) { case 'h': case '4': movecursor(x,y,-1,0); break; case 'j': case '2': movecursor(x,y,0,1); break; case 'k': case '8': movecursor(x,y,0,-1); break; case 'l': case '6': movecursor(x,y,1,0); break; case 'b': case '1': movecursor(x,y,-1,1); break; case 'n': case '3': movecursor(x,y,1,1); break; case 'y': case '7': movecursor(x,y,-1,-1); break; case 'u': case '9': movecursor(x,y,1,-1); break; case '?': clearmsg(); mprint("Use vi keys or numeric keypad to move cursor to target."); mprint("Hit the '.' key when done, or ESCAPE to abort."); break; } } if (c==ESCAPE) { *x = *y = ABORT; clearmsg(); } screencheck(Player.x,Player.y); }
/* * Clean up the virtual terminal system, in anticipation for a return to the * operating system. Move down to the last line and clear it out (the next * system prompt will be written in the line). Shut down the channel to the * terminal. */ void vttidy(void) { mlerase(); movecursor(term.t_nrow, 0); TTflush(); TTclose(); TTkclose(); #ifdef PKCODE write(1, "\r", 1); #endif }
void load(struct virtscreen *vscr) { sem_acquire(vscr->lock); if(vscr->data == vscr->back) { vscr->data = screen; memcpy(vscr->data,vscr->back,vscr->num_bytes); } active = vscr; movecursor(vscr->xpos,vscr->ypos); sem_release(vscr->lock); status(vscr - con); }
/* * Create a subjob with a copy of the command intrepreter in it. When the * command interpreter exits, mark the screen as garbage so that you do a full * repaint. Bound to "^X C". The message at the start in VMS puts out a newline. * Under some (unknown) condition, you don't get one free when DCL starts up. */ spawncli(f, n) { /* don't allow this command if restricted */ if (restflag) return(resterr()); movecursor(term.t_nrow, 0); /* Seek to last line. */ TTflush(); TTkclose(); shell(); TTkopen(); sgarbf = TRUE; return(TRUE); }
static int print_doc_msg_func(int pnum, int num_pages) { char temp[10]; int key; if ( pnum == -1 ) /* successful completion */ { static FCODE msg[] = {"Done -- Press any key"}; buzzer(0); putstringcenter(7, 0, 80, C_HELP_LINK, msg); getakey(); return (0); } if ( pnum == -2 ) /* aborted */ { static FCODE msg[] = {"Aborted -- Press any key"}; buzzer(1); putstringcenter(7, 0, 80, C_HELP_LINK, msg); getakey(); return (0); } if (pnum == 0) /* initialization */ { static FCODE msg[] = {"Generating FRACTINT.DOC"}; helptitle(); printinstr(); setattr(2, 0, C_HELP_BODY, 80*22); putstringcenter(1, 0, 80, C_HELP_HDG, msg); putstring(7, 30, C_HELP_BODY, "Completed:"); movecursor(25,80); /* hide cursor */ } sprintf(temp, "%d%%", (int)( (100.0 / num_pages) * pnum ) ); putstring(7, 41, C_HELP_LINK, temp); while ( keypressed() ) { key = getakey(); if ( key == ESC ) return (0); /* user abort */ } return (1); /* AOK -- continue */ }
void TestForButtonPress(char buttonToTest) { if (buttonToTest & P1IFG) { if (buttonToTest & P1IES) { movecursor(buttonToTest); }else { debounce(); } P1IES ^= buttonToTest; P1IFG &= ~buttonToTest; } }
static void helpinstr(void) { int ctr; for (ctr=0; ctr<80; ctr++) putstring(24, ctr, C_HELP_INSTR, " "); movecursor(24, 1); PUT_KEY("F1", "Index"); #ifndef XFRACT PUT_KEY("\030\031\033\032", "Select"); #else PUT_KEY("K J H L", "Select"); #endif PUT_KEY("Enter", "Go to"); PUT_KEY("Backspace", "Last topic"); PUT_KEY("Escape", "Exit help"); }
void cputc(Console cons, int c) { { while(!(inb(0x3f8+5) & 0x60)); outb(0x3f8,c); } if (c == '\n') { cons->pos += 80 - cons->pos % 80; } else { cons->buf[cons->pos++] = c | (cons->color << 8); } if ((cons->pos / 80) >= 24) { mmove(cons->buf, cons->buf + 80, sizeof(cons->buf[0]) * 23 * 80); cons->pos -= 80; miset(cons->buf + cons->pos, (cons->color << 24 | cons->color << 8), sizeof(cons->buf[0]) * (24 * 80 - cons->pos)); } movecursor(cons); }
void act(char* buf){ // recursive function int i,d1=0,d2=0,xpos,sensitivity =5; int x=0,y=0; for(i=0;i<48;i++){if(buf[i]=='x')xpos=i;}; for(i=0;i<xpos;i++){if(buf[i]=='.')d1=i;}; for(i=xpos;i<48;i++){if(buf[i]=='.')d2=i;}; if(buf[d1-2]=='-'){x=buf[d1-1]-48; x=-1*x;}else{x=buf[d1-1]-48;}; if(buf[d2-2]=='-'){y=buf[d2-1]-48; y=-1*y;}else{y=buf[d2-1]-48;}; printf("\n %u",x); printf("\n %u",y); movecursor((-1*x)*sensitivity,y*sensitivity); //printf("xpos: %d ; d1: %d ; d2 : %d ;x : %d ;y : %d ; isto_pos:%d ; cur_posx : %d , cur_posy : %d \n",xpos,d1,d2,x,y,pos_isto,cur_x,cur_y); //movecursor ( x, y); }
void kernel_main() { initconsole(); init_descriptor_tables(); movecursor(0,0); //asm volatile("int $0x3"); //asm volatile("int $0x4"); asm volatile("sti"); // gets irq working init_keyboard(); // change this eventually render(); startinput(); while(1==1) { // keep kernel running } }
static void display_page(char far *title, char far *text, unsigned text_len, int page, int num_pages, int start_margin, int *num_link, LINK far *link) { char temp[9]; helptitle(); helpinstr(); setattr(2, 0, C_HELP_BODY, 80*22); putstringcenter(1, 0, 80, C_HELP_HDG, title); sprintf(temp, "%2d of %d", page+1, num_pages); #ifndef XFRACT putstring(1, 79-(6 + ((num_pages>=10)?2:1)), C_HELP_INSTR, temp); #else /* Some systems (Ultrix) mess up if you write to column 80 */ putstring(1, 78-(6 + ((num_pages>=10)?2:1)), C_HELP_INSTR, temp); #endif if (text != NULL) display_parse_text(text, text_len, start_margin, num_link, link); movecursor(25, 80); /* hide cursor */ }
execprg(f, n) { register int s; char line[NLINE]; /* don't allow this command if restricted */ if (restflag) return(resterr()); if ((s=mlreply("$", line, NLINE)) != TRUE) return(s); movecursor(term.t_nrow - 1, 0); TTkclose(); execprog(line); TTkopen(); /* if we are interactive, pause here */ if (clexec == FALSE) { puts(TEXT6); /* "\r\n\n[End]" */ tgetc(); } sgarbf = TRUE; return (TRUE); }
static int xterm_button(int c) { WINDOW *wp; int event; int button; int x; int y; int status; #if OPT_XTERM >= 3 int save_row = ttrow; int save_col = ttcol; int firstrow, lastrow; int startx, endx, mousex; int starty, endy, mousey; MARK save_dot; char temp[NSTRING]; static const char *fmt = "\033[%d;%d;%d;%d;%dT"; #endif /* OPT_XTERM >= 3 */ if (insertmode) return ABORT; if ((status = (global_g_val(GMDXTERM_MOUSE))) != 0) { beginDisplay; switch(c) { case 'M': /* button-event */ event = keystroke(); x = XtermPos() + x_origin; y = XtermPos() + y_origin; button = (event & 3) + 1; TRACE(("M-button event:%d x:%d y:%d\n", event, x, y)) if (button > 3) { endofDisplay; return TRUE; /* button up */ } wp = row2window(y-1); #if OPT_XTERM >= 3 /* Tell the xterm how to highlight the selection. * It won't do anything else until we do this. */ if (wp != 0) { firstrow = wp->w_toprow + 1; lastrow = mode_row(wp) + 1; } else { /* from message-line */ firstrow = term.t_nrow ; lastrow = term.t_nrow + 1; } if (y >= lastrow) /* don't select modeline */ y = lastrow - 1; (void)lsprintf(temp, fmt, 1, x, y, firstrow, lastrow); putpad(temp); TTflush(); #endif /* OPT_XTERM >= 3 */ /* Set the dot-location if button 1 was pressed in a * window. */ if (wp != 0 && button == 1 && !reading_msg_line && setcursor(y-1, x-1)) { /*mlerase();*/ (void)update(TRUE); status = TRUE; } else if (button <= 3) { #if OPT_XTERM >= 3 /* abort the selection */ (void)lsprintf(temp, fmt, 0, x, y, firstrow, lastrow); putpad(temp); TTflush(); #endif /* OPT_XTERM >= 3 */ status = ABORT; } else { status = FALSE; } break; #if OPT_XTERM >= 3 case 't': /* reports valid text-location */ x = XtermPos(); y = XtermPos(); TRACE(("t: x:%d y:%d\n", x, y)) setwmark(y-1, x-1); yankregion(); movecursor(save_row, save_col); /*mlerase();*/ (void)update(TRUE); break; case 'T': /* reports invalid text-location */ /* * The starting-location returned is not the location * at which the mouse was pressed. Instead, it is the * top-most location of the selection. In turn, the * ending-location is the bottom-most location of the * selection. The mouse-up location is not necessarily * a pointer to valid text. * * This case handles multi-clicking events as well as * selections whose start or end location was not * pointing to text. */ save_dot = DOT; startx = XtermPos(); /* starting-location */ starty = XtermPos(); endx = XtermPos(); /* ending-location */ endy = XtermPos(); mousex = XtermPos(); /* location at mouse-up */ mousey = XtermPos(); TRACE(("T: start(%d,%d) end(%d,%d) mouse(%d,%d)\n", starty, startx, endy, endx, mousey, mousex)) setcursor(starty - 1, startx - 1); setwmark (endy - 1, endx - 1); if (MK.o != 0 && !is_at_end_of_line(MK)) MK.o += 1; yankregion(); DOT = save_dot; movecursor(save_row, save_col); /*mlerase();*/ (void)update(TRUE); break; #endif /* OPT_XTERM >= 3 */ default: status = FALSE; } endofDisplay; }
/* * filter a buffer through an external DOS program * Bound to ^X # * We use unique temporary file names so that multiple instances of * MicroEMACS don't try to use the same file. */ filter(f, n) { register int s; /* return status from CLI */ register BUFFER *bp; /* pointer to buffer to zot */ char line[NLINE]; /* command line send to shell */ char tmpnam[NFILEN]; /* place to store real file name */ char *tmp; /* ptr to TMP DOS environment variable */ static char filnam1[NSTRING]; static char filnam2[NSTRING]; /* don't allow this command if restricted */ if (restflag) return(resterr()); if (curbp->b_mode&MDVIEW) /* don't allow this command if */ return(rdonly()); /* we are in read only mode */ /* get the filter name and its args */ if ((s=mlreply("#", line, NLINE)) != TRUE) return(s); /* Call mktemp() to get unique filenames in the tmp directory. */ if ((tmp = getenv("TMP")) == NULL) filnam1[0] = filnam2[0] = 0; else { strcpy(filnam1, tmp); strcpy(filnam2, tmp); if (filnam1[strlen(filnam1) - 1] != '\\') { strcat(filnam1, "\\"); strcat(filnam2, "\\"); } } strcat(filnam1,"eXXXXXX"); strcat(filnam2,"eXXXXXX"); mktemp(filnam1); /* setup the proper file names */ bp = curbp; strcpy(tmpnam, bp->b_fname); /* save the original name */ strcpy(bp->b_fname, filnam1); /* set it to our new one */ /* write it out, checking for errors */ if (writeout(filnam1, "w") != TRUE) { mlwrite(TEXT2); /* "[Cannot write filter file]" */ strcpy(bp->b_fname, tmpnam); return(FALSE); } mktemp(filnam2); strcat(line, " <"); /* construct the command line */ strcat(line, filnam1); strcat(line, " >"); strcat(line, filnam2); movecursor(term.t_nrow - 1, 0); TTkclose(); system(line); TTkopen(); sgarbf = TRUE; s = TRUE; /* on failure, escape gracefully */ if (s != TRUE || (readin(filnam2,FALSE) == FALSE)) { mlwrite(TEXT3); /* "[Execution failed]" */ strcpy(bp->b_fname, tmpnam); unlink(filnam1); unlink(filnam2); return(s); } /* reset file name */ strcpy(bp->b_fname, tmpnam); /* restore name */ bp->b_flag |= BFCHG; /* flag it as changed */ /* and get rid of the temporary file */ unlink(filnam1); unlink(filnam2); return(TRUE); }
/* * updateline() * * int row; row of screen to update * struct video *vp1; virtual screen image * struct video *vp2; physical screen image */ static int updateline(int row, struct video *vp1, struct video *vp2) { #if RAINBOW /* UPDATELINE specific code for the DEC rainbow 100 micro */ unicode_t *cp1; unicode_t *cp2; int nch; /* since we don't know how to make the rainbow do this, turn it off */ flags &= (~VFREV & ~VFREQ); cp1 = &vp1->v_text[0]; /* Use fast video. */ cp2 = &vp2->v_text[0]; putline(row + 1, 1, cp1); nch = term.t_ncol; do { *cp2 = *cp1; ++cp2; ++cp1; } while (--nch); *flags &= ~VFCHG; #else /* UPDATELINE code for all other versions */ unicode_t *cp1; unicode_t *cp2; unicode_t *cp3; unicode_t *cp4; unicode_t *cp5; int nbflag; /* non-blanks to the right flag? */ int rev; /* reverse video flag */ int req; /* reverse video request flag */ /* set up pointers to virtual and physical lines */ cp1 = &vp1->v_text[0]; cp2 = &vp2->v_text[0]; #if COLOR TTforg(vp1->v_rfcolor); TTbacg(vp1->v_rbcolor); #endif #if REVSTA | COLOR /* if we need to change the reverse video status of the current line, we need to re-write the entire line */ rev = (vp1->v_flag & VFREV) == VFREV; req = (vp1->v_flag & VFREQ) == VFREQ; if ((rev != req) #if COLOR || (vp1->v_fcolor != vp1->v_rfcolor) || (vp1->v_bcolor != vp1->v_rbcolor) #endif ) { movecursor(row, 0); /* Go to start of line. */ /* set rev video if needed */ if (rev != req) (*term.t_rev) (req); /* scan through the line and dump it to the screen and the virtual screen array */ cp3 = &vp1->v_text[term.t_ncol]; while (cp1 < cp3) { TTputc(*cp1); ++ttcol; *cp2++ = *cp1++; } /* turn rev video off */ if (rev != req) (*term.t_rev) (FALSE); /* update the needed flags */ vp1->v_flag &= ~VFCHG; if (req) vp1->v_flag |= VFREV; else vp1->v_flag &= ~VFREV; #if COLOR vp1->v_fcolor = vp1->v_rfcolor; vp1->v_bcolor = vp1->v_rbcolor; #endif return TRUE; } #endif /* advance past any common chars at the left */ while (cp1 != &vp1->v_text[term.t_ncol] && cp1[0] == cp2[0]) { ++cp1; ++cp2; } /* This can still happen, even though we only call this routine on changed * lines. A hard update is always done when a line splits, a massive * change is done, or a buffer is displayed twice. This optimizes out most * of the excess updating. A lot of computes are used, but these tend to * be hard operations that do a lot of update, so I don't really care. */ /* if both lines are the same, no update needs to be done */ if (cp1 == &vp1->v_text[term.t_ncol]) { vp1->v_flag &= ~VFCHG; /* flag this line is changed */ return TRUE; } /* find out if there is a match on the right */ nbflag = FALSE; cp3 = &vp1->v_text[term.t_ncol]; cp4 = &vp2->v_text[term.t_ncol]; while (cp3[-1] == cp4[-1]) { --cp3; --cp4; if (cp3[0] != ' ') /* Note if any nonblank */ nbflag = TRUE; /* in right match. */ } cp5 = cp3; /* Erase to EOL ? */ if (nbflag == FALSE && eolexist == TRUE && (req != TRUE)) { while (cp5 != cp1 && cp5[-1] == ' ') --cp5; if (cp3 - cp5 <= 3) /* Use only if erase is */ cp5 = cp3; /* fewer characters. */ } movecursor(row, cp1 - &vp1->v_text[0]); /* Go to start of line. */ #if REVSTA TTrev(rev); #endif while (cp1 != cp5) { /* Ordinary. */ TTputc(*cp1); ++ttcol; *cp2++ = *cp1++; } if (cp5 != cp3) { /* Erase. */ TTeeol(); while (cp1 != cp3) *cp2++ = *cp1++; } #if REVSTA TTrev(FALSE); #endif vp1->v_flag &= ~VFCHG; /* flag this line as updated */ return TRUE; #endif }
/* * Fill the current paragraph according to the current fill column */ int fillpara(int f, int n) { UCS *qstr, qstr2[NSTRING], c; int quotelevel = -1; REGION addedregion; char action = 'P'; if(curbp->b_mode&MDVIEW){ /* don't allow this command if */ return(rdonly()); /* we are in read only mode */ } else if (fillcol == 0) { /* no fill column set */ mlwrite_utf8("No fill column set", NULL); return(FALSE); } else if(curwp->w_dotp == curbp->b_linep && !curwp->w_markp) /* don't wrap! */ return(FALSE); /* * If there is already a region set, then we may use it * instead of the current paragraph. */ if(curwp->w_markp){ int k, rv; KEYMENU menu_justify[12]; char prompt[100]; for(k = 0; k < 12; k++){ menu_justify[k].name = NULL; KS_OSDATASET(&menu_justify[k], KS_NONE); } menu_justify[1].name = "R"; menu_justify[1].label = "[" N_("Region") "]"; menu_justify[6].name = "^C"; menu_justify[6].label = N_("Cancel"); menu_justify[7].name = "P"; menu_justify[7].label = N_("Paragraph"); menu_justify[2].name = "Q"; menu_justify[2].label = N_("Quotelevel"); wkeyhelp(menu_justify); /* paint menu */ sgarbk = TRUE; if(Pmaster && curwp) curwp->w_flag |= WFMODE; strncpy(prompt, "justify Region, Paragraph; or fix Quotelevel ? ", sizeof(prompt)); prompt[sizeof(prompt)-1] = '\0'; mlwrite_utf8(prompt, NULL); (*term.t_rev)(1); rv = -1; while(1){ switch(c = GetKey()){ case (CTRL|'C') : /* Bail out! */ case F2 : pputs_utf8(_("ABORT"), 1); rv = ABORT; emlwrite("", NULL); break; case (CTRL|'M') : /* default */ case 'r' : case 'R' : case F3 : pputs_utf8(_("Region"), 1); rv = 'R'; break; case 'p' : case 'P' : case F7 : pputs_utf8(_("Paragraph"), 1); rv = 'P'; break; case 'q' : case 'Q' : case F8 : case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : pputs_utf8(_("Quotelevel"), 1); while(rv == -1){ switch(c){ case 'q' : case 'Q' : case F8 : {char num[20]; num[0] = '\0'; switch(mlreplyd_utf8("Quote Level ? ", num, sizeof(num), QNORML, NULL)){ case TRUE: if(isdigit(num[0])){ quotelevel = atoi(num); if(quotelevel < 0){ emlwrite("Quote Level cannot be negative", NULL); sleep(3); } else if(quotelevel > 20){ emlwrite("Quote Level should be less than 20", NULL); rv = ABORT; } else{ rv = 'Q'; } } else if(num[0]){ emlwrite("Quote Level should be a number", NULL); sleep(3); } break; case HELPCH: emlwrite("Enter the number of quotes you want before the text", NULL); sleep(3); break; default: emlwrite("Quote Level is a number", NULL); rv = ABORT; break; } } break; case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : rv = 'Q'; quotelevel = (int) (c - '0'); break; } } break; case (CTRL|'G') : if(term.t_mrow == 0 && km_popped == 0){ movecursor(term.t_nrow-2, 0); peeol(); term.t_mrow = 2; (*term.t_rev)(0); wkeyhelp(menu_justify); mlwrite_utf8(prompt, NULL); (*term.t_rev)(1); sgarbk = TRUE; /* mark menu dirty */ km_popped++; break; } /* else fall through */ default: (*term.t_beep)(); case NODATA : break; } (*term.t_flush)(); if(rv != -1){ (*term.t_rev)(0); if(km_popped){ term.t_mrow = 0; movecursor(term.t_nrow, 0); peeol(); sgarbf = 1; km_popped = 0; } action = rv; break; } } if(action != ABORT) emlwrite("", NULL); } if(action == 'R' && curwp->w_markp){ /* let yank() know that it may be restoring a paragraph */ thisflag |= CFFILL; if(!Pmaster) sgarbk = TRUE; curwp->w_flag |= WFMODE; swap_mark_and_dot_if_mark_comes_first(); /* determine if we're justifying quoted text or not */ qstr = (glo_quote_str && quote_match(glo_quote_str, curwp->w_doto > 0 ? curwp->w_dotp->l_fp : curwp->w_dotp, qstr2, NSTRING) && *qstr2) ? qstr2 : NULL; /* * Fillregion moves dot to the end of the filled region. */ if(!fillregion(qstr, &addedregion)) return(FALSE); set_last_region_added(&addedregion); } else if(action == 'P'){ /* * Justfiy the current paragraph. */ if(curwp->w_markp) /* clear mark if already set */ setmark(0,0); if(gotoeop(FALSE, 1) == FALSE) return(FALSE); /* determine if we're justifying quoted text or not */ qstr = (glo_quote_str && quote_match(glo_quote_str, curwp->w_dotp, qstr2, NSTRING) && *qstr2) ? qstr2 : NULL; setmark(0,0); /* mark last line of para */ /* jump back to the beginning of the paragraph */ gotobop(FALSE, 1); /* let yank() know that it may be restoring a paragraph */ thisflag |= (CFFILL | CFFLPA); if(!Pmaster) sgarbk = TRUE; curwp->w_flag |= WFMODE; curwp->w_doto = 0; /* start region at beginning of line */ /* * Fillregion moves dot to the end of the filled region. */ if(!fillregion(qstr, &addedregion)) return(FALSE); set_last_region_added(&addedregion); /* Leave cursor on first char of first line after justified region */ curwp->w_dotp = lforw(curwp->w_dotp); curwp->w_doto = 0; if(curwp->w_markp) setmark(0,0); /* clear mark */ } else if(action == 'Q'){ /* let yank() know that it may be restoring a paragraph */ thisflag |= CFFILL; if(!Pmaster) sgarbk = TRUE; curwp->w_flag |= WFHARD; swap_mark_and_dot_if_mark_comes_first(); if(!setquotelevelinregion(quotelevel, &addedregion)) return(FALSE); set_last_region_added(&addedregion); } else{ /* abort */ } return(TRUE); }
/* * Pipe a one line command into a window * Bound to ^X @ * We use a unique temporary file name so that multiple instances of * MicroEMACS don't try to use the same file. */ pipecmd(f, n) { register WINDOW *wp; /* pointer to new window */ register BUFFER *bp; /* pointer to buffer to zot */ register char *tmp; /* ptr to TMP DOS environment variable */ char line[NLINE]; /* command line send to shell */ static char bname[] = "command"; static char filnam[NSTRING]; char *getenv(); /* don't allow this command if restricted */ if (restflag) return(resterr()); /* get rid of the command output buffer if it exists */ if ((bp=bfind(bname, FALSE, 0)) != FALSE) { /* try to make sure we are off screen */ wp = wheadp; while (wp != NULL) { if (wp->w_bufp == bp) { onlywind(FALSE, 1); break; } wp = wp->w_wndp; } /* get rid of the existing command buffer */ if (zotbuf(bp) != TRUE) return(FALSE); } /* get the command to pipe in */ if (mlreply("@", line, NLINE) != TRUE) return(FALSE); /* Call mktemp() to get a unique filename in the tmp directory. */ if ((tmp = getenv("TMP")) == NULL) filnam[0] = 0; else { strcpy(filnam, tmp); if (filnam[strlen(filnam) - 1] != '\\') strcat(filnam, "\\"); } strcat(filnam,"eXXXXXX"); mktemp(filnam); /* redirect the command output to the output file */ strcat(line, " >>"); strcat(line, filnam); movecursor(term.t_nrow - 1, 0); /* execute the command */ TTkclose(); system(line); TTkopen(); sgarbf = TRUE; /* did the output file get generated? */ if (access( filnam, 0) != 0) return(FALSE); /* split the current window to make room for the command output */ if (splitwind(FALSE, 1) == FALSE) return(FALSE); /* and read the stuff in */ if (getfile(filnam, FALSE) == FALSE) return(FALSE); /* rename the buffer */ strcpy( curwp->w_bufp->b_bname, "command"); /* make this window in VIEW mode, update all mode lines */ curwp->w_bufp->b_mode |= MDVIEW; wp = wheadp; while (wp != NULL) { wp->w_flag |= WFMODE; wp = wp->w_wndp; } /* and get rid of the temporary file */ unlink(filnam); return(TRUE); }
void move_cursor(struct virtscreen *cur) { if(cur == active) movecursor(cur->xpos,cur->ypos); }
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); } }
/* * bktoshell - suspend and wait to be woken up */ int bktoshell(int f, int n) { UCS z = CTRL | 'Z'; if(!(gmode&MDSSPD)){ unknown_command(z); return(FALSE); } if(Pmaster){ if(!Pmaster->suspend){ unknown_command(z); return(FALSE); } if((*Pmaster->suspend)() == NO_OP_COMMAND){ int rv; if(km_popped){ term.t_mrow = 2; curwp->w_ntrows -= 2; } clearcursor(); mlerase(); rv = (*Pmaster->showmsg)('x'); ttresize(); picosigs(); if(rv) /* Did showmsg corrupt the display? */ pico_refresh(0, 1); /* Yes, repaint */ mpresf = 1; if(km_popped){ term.t_mrow = 0; curwp->w_ntrows += 2; } } else{ ttresize(); pclear(0, term.t_nrow); pico_refresh(0, 1); } return(TRUE); } if(gmode&MDSPWN){ char *shell; int dummy; vttidy(); movecursor(0, 0); (*term.t_eeop)(); printf("\n\n\nUse \"exit\" to return to Pi%s\n", (gmode & MDBRONLY) ? "lot" : "co"); system((shell = (char *)getenv("SHELL")) ? shell : "/bin/csh"); rtfrmshell(dummy); /* fixup tty */ } else { movecursor(term.t_nrow-1, 0); peeol(); movecursor(term.t_nrow, 0); peeol(); movecursor(term.t_nrow, 0); printf("\n\n\nUse \"fg\" to return to Pi%s\n", (gmode & MDBRONLY) ? "lot" : "co"); ttclose(); movecursor(term.t_nrow, 0); peeol(); (*term.t_flush)(); signal(SIGCONT, rtfrmshell); /* prepare to restart */ signal(SIGTSTP, SIG_DFL); /* prepare to stop */ kill(0, SIGTSTP); } return(TRUE); }
/* * mainloop() - * основной цикл работы редактора */ mainloop() { int i,m,first=1; register int j; int clsave,ccsave; int k; /* Хитрости с экономией памяти */ register int *lre1= &lread1; #define lread1 (*lre1) int thiscol, thisrow; char ich[8], *cp; /* Для команд с тремя вариантами аргументов */ int (*lnfun)(),(*spfun)(); int openlines(), openspaces(), closelines(),closespaces(),picklines(), pickspaces(); /* === */ extern int templ[4]; struct viewport *oport; /* * Обработка одного символа или команды * ==================================== */ if (cursorline== 0) oldcline = 1; if (cursorcol == 0) oldccol = 1; #ifndef lint goto funcdone; #endif FOREVER { csrsw = clrsw = 0; read1(); if (errsw) { errsw = 0; clrsw = 1; goto errclear; } /* * Редактирование в строке */ if ((! CTRLCHAR) || lread1 == CCCTRLQUOTE || lread1 == CCBACKSPACE || lread1 == CCDELCH) { /* Отмена в 1 колонке */ if (lread1 == CCBACKSPACE && cursorcol == 0) { lread1 = -1; goto contin; } if (openwrite[curfile] == 0) goto nowriterr; /* Строки у нас нет? Дай! */ if (clineno != (i = curwksp->ulhclno+cursorline)) getlin(i); /* исключение символа */ if (lread1==CCDELCH || (imodesw && lread1==CCBACKSPACE) ) { thiscol = cursorcol + curwksp->ulhccno; thisrow = cursorline; if (lread1 == CCBACKSPACE) thiscol--; if (ncline < thiscol + 2) { if (lread1 == CCBACKSPACE) movecursor(LT); lread1 = -1; goto contin; } for (i=thiscol;i<ncline-2;i++) cline[i] = cline[i+1]; ncline--; thiscol -= curwksp->ulhccno; putup(-(1+thiscol),cursorline); poscursor(thiscol,thisrow); fcline = 1; lread1 = -1; goto contin; } /* Проверка на границу окна */ if (cursorcol > curport->rtext) { if (fcline) { putline(0); movep(defrport); goto contin; } else goto margerr; } fcline = 1; if (j = (lread1 == CCBACKSPACE)) { movecursor(LT); lread1 = ' '; } if ((i = cursorcol + curwksp->ulhccno) >= (lcline - 2)) excline(i+2); if (i >= ncline-1) { for (k=ncline-1; k<=i; k++) cline[k] = ' '; cline[i+1] = NEWLINE; ncline = i+2; } else if (imodesw) { thiscol = cursorcol + curwksp->ulhccno; thisrow = cursorline; if (ncline >= lcline) excline(ncline+1); for (i=ncline;i>thiscol;i--) cline[i] = cline[i-1]; ncline++; thiscol -= curwksp->ulhccno; putup(-(1+thiscol),cursorline); poscursor(thiscol,thisrow); } /* Выставим границу */ if (cursorcol >= curport->rtext) curport->redit = curport->rtext + 1; /* Замена символа */ if(lread1==CCCTRLQUOTE) lread1 = esc0; if (cursorcol == curport->rtext - 10) putcha(COBELL); cline[i] = lread1; putch(lread1,1); /* Если переехали границу */ curport->redit = curport->rtext; if (j) movecursor(LT); lread1 = -1; goto contin; } /* Сдвиг вниз, если последняя строка */ if (lread1 == CCRETURN ) { putline(0); if ( cursorline == curport->btext) movew(defplline); if((i=curwksp->ulhccno) !=0) movep(-i); movecursor(lread1); lread1= -1; goto errclear; } /* * Если команда перемещения */ if (lread1<=BT) { movecursor(lread1); if (lread1 <= VMOTCODE ) { putline(0); if(curspos) goto newnumber; } lread1 = -1; goto contin; } /* Если граница поля */ if (cursorcol > curport->rtext) poscursor(curport->rtext,cursorline); putline(0); if (lread1 == CCQUIT) { if (endit() == 0) goto funcdone; gosw = 0; return; } switch (lread1) { case CCENTER: goto gotarg; case CCLPORT: movep(- deflport); goto funcdone; case CCSETFILE: switchfile(); goto funcdone; case CCCHPORT: chgport(-1); goto funcdone; case CCOPEN: if (openwrite[curfile]==0) goto nowriterr; openlines(curwksp->ulhclno + cursorline,definsert); goto funcdone; case CCMISRCH: search(-1); goto funcdone; case CCCLOSE: if (openwrite[curfile]==0) goto nowriterr; closelines(curwksp->ulhclno + cursorline, defdelete); goto funcdone; case CCPUT: if (openwrite[curfile]==0) goto nowriterr; if (pickbuf->nrows == 0) goto nopickerr; put(pickbuf,curwksp->ulhclno+cursorline, curwksp->ulhccno+cursorcol); goto funcdone; case CCPICK: picklines(curwksp->ulhclno + cursorline, defpick); goto funcdone; case CCINSMODE: imodesw = 1 - imodesw; /* change it */ goto funcdone; case CCGOTO: gtfcn(0); goto funcdone; case CCMIPAGE: movew(- defmipage * (1+curport->btext)); goto funcdone; case CCPLSRCH: search(1); goto funcdone; case CCRPORT: movep(defrport); goto funcdone; case CCPLLINE: movew(defplline); goto funcdone; case CCDELCH: goto notimperr; case CCSAVEFILE: savefile(NULL,curfile); goto funcdone; case CCMILINE: movew(-defmiline); goto funcdone; case CCDOCMD: goto notstrerr; case CCPLPAGE: movew(defplpage * (1+curport->btext)); goto funcdone; case CCMAKEPORT: makeport(deffile); goto funcdone; case CCTABS: settab(curwksp->ulhccno + cursorcol); goto funcdone; /* case CCMOVELEFT: */ /* case CCTAB: */ /* case CCMOVEDOWN: */ /* case CCHOME: */ /* case CCRETURN: */ /* case CCMOVEUP: */ default: goto badkeyerr; } /* Повтор ввода аргумента */ reparg: read1(); if(CTRLCHAR) goto yesarg; else goto noargerr; /* * Дай аргумент! */ gotarg: param(0); yesarg: if (lread1 == CCQUIT ) { if (paraml>0 && (dechars(paramv,paraml),*paramv) == 'a') { gosw = 0; if (*(paramv+1) != 'd') return; cleanup(); inputfile = -1; /* to force a dump */ fatal("ABORTED"); } if (endit() == 0) goto funcdone; gosw = 1; return; } switch (lread1) { case CCENTER: goto funcdone; case CCLPORT: if (paramtype <= 0) goto notstrerr; if (s2i(paramv,&i)) goto notinterr; movep(-i); goto funcdone; case CCSETFILE: if (paramtype <= 0) goto notstrerr; if (paramv == 0) goto noargerr; if ( use0flg || !inputfile) dechars(paramv,paraml); use0flg=1; editfile(paramv,0,0,1,1); goto funcdone; case CCCHPORT: if (paramtype <= 0) goto notstrerr; if (s2i(paramv,&i)) goto notinterr; if (i <= 0) goto notposerr; chgport(i-1); goto funcdone; case CCOPEN: if (openwrite[curfile]==0) goto nowriterr; if (paramtype == 0) { splitline(curwksp->ulhclno + paramr0, paramc0 + curwksp->ulhccno); goto funcdone; } else { lnfun = openlines; spfun = openspaces; goto spdir; }; case CCMISRCH: case CCPLSRCH: if (paramtype <= 0) goto notstrerr; if (paramv == 0) goto noargerr; if (searchkey) free(searchkey); searchkey = paramv; paraml = 0; search(lread1==CCPLSRCH?1:-1); goto funcdone; case CCCLOSE: if (openwrite[curfile]==0) goto nowriterr; if (paramtype == 0) combineline(curwksp->ulhclno + paramr0, paramc0 + curwksp->ulhccno); else { if(paramtype > 0 && paramv && paramv[0]=='>') { msrbuf(deletebuf,paramv+1,0); goto funcdone; } lnfun = closelines; spfun = closespaces; goto spdir; } goto funcdone; case CCPUT: if (paramtype > 0 && paramv && paramv[0]=='$' ) { if (msrbuf(pickbuf,paramv+1,1))goto errclear; goto funcdone; } if (paramtype != 0) goto notstrerr; if (openwrite[curfile]==0) goto nowriterr; if (deletebuf->nrows == 0) goto nodelerr; put(deletebuf,curwksp->ulhclno+cursorline, curwksp->ulhccno+cursorcol); goto funcdone; case CCMOVELEFT: case CCTAB: case CCMOVEDOWN: case CCHOME: case CCMOVEUP: case CCMOVERIGHT: case CCBACKTAB: if (s2i(paramv,&i)) goto notinterr; if (i <= 0) goto notposerr; m = ((lread1<=BT) ? lread1:0); while (--i >= 0) movecursor(m); goto funcdone; case CCRETURN: if(paramtype <=0|| !paramv) goto notimperr; dechars(paramv,paraml); switch (paramv[0]) { case '>': msvtag(paramv+1); goto funcdone; case '$': if(mdeftag(paramv+1)){ lread1= -1; goto reparg; } else goto funcdone; case 'w': if(paramv[1]==' ' && paramv[2]=='+') openwrite[curwksp->wfile]=1; else openwrite[curwksp->wfile]=0; goto funcdone; case 'k': defkey(); goto funcdone; case 'r': rescreen(-1); goto funcdone; /* Восттановить экран */ case 'd': if(paramv[1]==' ') defmac(¶mv[2]); goto funcdone; case 'q': lread1=CCQUIT; if(paramv[1]=='a') { gosw=0; return; } goto contin; default: goto noargerr; } case CCPICK: if (paramtype == 0) goto notimperr; if (paramtype > 0 && paramv && paramv[0]=='>') { msrbuf(pickbuf,paramv+1,0); goto funcdone; } lnfun = picklines; spfun = pickspaces; goto spdir; case CCINSMODE: imodesw = 1 - imodesw; /* Щелкнем!! */ goto funcdone; case CCGOTO: if (paramtype == 0) gtfcn(nlines[curfile]); else if (paramtype > 0) { if(paramv && paramv[0]=='$') { mgotag(paramv+1); goto funcdone; } if (s2i(paramv,&i)) goto notinterr; gtfcn(i-1); } else goto noargerr; goto funcdone; case CCMIPAGE: if (paramtype <= 0) goto notstrerr; if (s2i(paramv,&i)) goto notinterr; movew(- i * (1 + curport->btext)); goto funcdone; case CCRPORT: if (paramtype <= 0) goto notstrerr; if (s2i(paramv,&i)) goto notinterr; movep(i); goto funcdone; case CCPLLINE: if (paramtype < 0) goto notstrerr; else if (paramtype == 0) movew(cursorline); else if (paramtype > 0) { if (s2i(paramv,&i)) goto notinterr; movew(i); } goto funcdone; case CCDELCH: goto notimperr; case CCSAVEFILE: if (paramtype <= 0) goto notstrerr; if (paramv == 0) goto noargerr; dechars(paramv,paraml); savefile(paramv,curfile); goto funcdone; case CCMILINE: if (paramtype < 0) goto notstrerr; else if (paramtype == 0) movew(cursorline - curport->btext); else if (paramtype > 0) { if (s2i(paramv,&i)) goto notinterr; movew(-i); } goto funcdone; case CCDOCMD: if(paramtype<=0) goto notstrerr; dechars(paramv,paraml); if (openwrite[curfile] == 0) goto nowriterr; callexec(); goto funcdone; case CCPLPAGE: if (paramtype <= 0) goto notstrerr; if (s2i(paramv,&i)) goto notinterr; movew(i * (1 + curport->btext)); goto funcdone; case CCMAKEPORT: if (paramtype == 0) removeport(); else if (paramtype < 0) goto notstrerr; else { dechars(paramv,paraml); makeport(paramv); } goto funcdone; case CCTABS: clrtab(curwksp->ulhccno + cursorcol); goto funcdone; default: goto badkeyerr; } spdir: if (paramtype > 0) { if(paramv[0] == '$') { if(mdeftag(paramv+1)) goto spdir; else goto funcdone; } if (s2i(paramv,&i)) goto notinterr; if (i <= 0) goto notposerr; (*lnfun)(curwksp->ulhclno + cursorline, i); } else { if (paramc1 == paramc0) { (*lnfun)(curwksp->ulhclno+paramr0, (paramr1-paramr0)+1); } else (*spfun)(curwksp->ulhclno + paramr0, curwksp->ulhccno + paramc0, (paramc1-paramc0), (paramr1-paramr0) + 1); } goto funcdone; badkeyerr: error(DIAG("Illegal key or unnown macro","Неизвестная клавиша или макро")); goto funcdone; notstrerr: error(DIAG("Argument must be a string.","Аргумент должен быть строкой")); goto funcdone; noargerr: error(DIAG("Invalid argument.","Плохой аргумент")); goto funcdone; notinterr: error(DIAG("Argument must be numerik.","Аргумент должен быть числом")); goto funcdone; notposerr: error(DIAG("Argument must be positive.","Аргумент должен быть положительным")); goto funcdone; nopickerr: error(DIAG("Nothing in the pick buffer.","Буфер вставок пуст")); goto funcdone; nodelerr: error (DIAG("Nothing in the close buffer.","Буфер убранных строк пуст")); goto funcdone; notimperr: error(DIAG("Feature not implemented yet.","Еще не определено.")); goto funcdone; margerr: error("Margin stusk; move cursor to free."); goto funcdone; nowriterr: error(DIAG("You cannot modify this file!","Вы не можете изменить этот файл.")); goto funcdone; funcdone: clrsw = 1; newnumber: lread1 = -1; /* signify char read was used */ errclear: oport = curport; k = cursorline; j = cursorcol; switchport(¶mport); paramport.redit = PARAMRINFO; if (clrsw) { if (!errsw && !first) { poscursor(0,0); info(blanks,PARAMRINFO); } poscursor(PARAMREDIT+2,0); if (oport->wksp->wfile) { info(DIAG("file ","файл "),PARAMRINFO); info(openfnames[oport->wksp->wfile],PARAMRINFO); } info(DIAG(" line "," строка: "),PARAMRINFO); clsave = cursorline; first=0; ccsave = cursorcol; } poscursor(ccsave,clsave); i = oport->wksp->ulhclno + k + 1; /* Рисуем номер строки */ cp = ich + 8; *--cp = '\0'; do (*--cp = '0' + (i % 10)); while (i = i/10); info(cp,PARAMRINFO); *cp = '\0'; while (cp != ich) *--cp = ' '; info(ich,PARAMRINFO); switchport(oport); paramport.redit = PARAMREDIT; poscursor(j,k); if (csrsw) { putch(COCURS,1); poscursor(j,k); dumpcbuf(); sleep(1); putup(k,k); poscursor(j,k); } if (imodesw && clrsw && !errsw) telluser(DIAG(" ***** i n s e r t m o d e *****"," * * * * режим вставки * * * * "),0); contin: ; } #undef lread1 }
/* * This is invoked as a wrapper for 'kbd_putc()'. It writes to the Messages * scratch buffer, and also to the message line. If the Messages buffer isn't * visible, it is automatically popped up when a new message line is begun. * Since it's a scratch buffer, popping it down destroys it. */ int msg_putc(int c) { BUFFER *savebp = curbp; WINDOW *savewp = curwp; MARK savemk; int saverow = ttrow; int savecol = ttcol; register BUFFER *bp; register WINDOW *wp; if ((bp = create_msgs()) == 0) return TRUE; savemk = DOT; beginDisplay(); /* * Modify the current-buffer state as unobtrusively as possible (i.e., * don't modify the buffer order, and don't make the buffer visible if * it isn't already!). To use the 'bputc()' logic, though, we've got * to have a window, even if it's not real. */ curbp = bp; if ((wp = bp2any_wp(bp)) == NULL) { static WINDOW dummy; wp = &dummy; wp->w_bufp = bp; } curwp = wp; DOT.l = lback(buf_head(bp)); DOT.o = llength(DOT.l); /* * Write into the [Messages]-buffer */ #if OPT_TRACE if (c == '\n') { static TBUFF *ss; int len = (DOT.o > 0) ? DOT.o : 1; if (tb_init(&ss, EOS) != 0 && tb_bappend(&ss, (DOT.o > 0) ? lvalue(DOT.l) : "?", (size_t) len) != 0 && tb_append(&ss, EOS) != 0) { TRACE(("msg:%s\n", visible_buff(tb_values(ss), (int) tb_length(ss) - 1, TRUE))); } } #endif if ((c != '\n') || (DOT.o > 0)) { bputc(c); b_clr_changed(bp); } /* Finally, restore the original current-buffer and write the character * to the message line. */ curbp = savebp; curwp = savewp; if (savewp) DOT = savemk; movecursor(saverow, savecol); if (c != '\n') { if (sgarbf) { mlsavec(c); } else { kbd_putc(c); } } endofDisplay(); return TRUE; }
//extern int __LIB__ ozeditline(byte _x0,byte y0,char *s0,byte slen,byte xlen) //int ozeditline(byte _x0,byte y0,char *s0,byte slen,byte xlen) int ozeditline(int _x0, int y0, char* s0, int slen, int xlen) { static char c; static byte l1, l2; static unsigned k; static byte i; register char* p; switch (ozgetfont()) { case FONT_PC_NORMAL: case FONT_OZ_NORMAL: height = 8; break; default: height = 13; break; } x = x0 = _x0; y = y0; if ((int)x0 + (int)xlen > 239 || (int)y + (int)height > 79) return OZEDITLINE_ERROR; xlen--; s = s0; pos = strlen(s0); if (pos >= slen) return OZEDITLINE_ERROR; ozputs(x0, y, s); setcursor(); xorcursor(); while (1) { switch (k = getch()) { case KEY_MAIN: case KEY_SCHEDULE: case KEY_MEMO: case KEY_TELEPHONE: case KEY_POWER: case KEY_MYPROGRAMS: ozexitto(k); case KEY_BACKLIGHT: oztogglelight(); break; case KEY_LEFT: if (pos > 0) { pos--; movecursor(); } break; case KEY_RIGHT: if (s[pos]) { pos++; movecursor(); } break; case KEY_LOWER_ESC: case KEY_UPPER_ESC: case 27: xorcursor(); return OZEDITLINE_CANCEL; case KEY_LOWER_ENTER: case KEY_UPPER_ENTER: case '\r': case '\n': xorcursor(); return strlen(s); case KEY_BACKSPACE: case KEY_BACKSPACE_16K: if (pos > 0) { pos--; p = s + pos; c = *p; while (*p) { *p = p[1]; p++; } xorcursor(); l1 = ozputs(x0, y, s); l2 = ozputch(l1, -1, c); for (i = l1; i < l2; i++) { _ozvline(i, y, height, WHITE); } ozputs(x0, y, s); setcursor(); xorcursor(); } break; default: if (k < 127 && ozputch(0, -1, k) + ozputs(0, -1, s) < xlen && (l1 = 1 + strlen(s)) < slen) { xorcursor(); for (i = l1; i > pos; i--) s[i] = s[i - 1]; if (s[pos] == 0) s[pos + 1] = 0; s[pos] = k; pos++; ozputs(x0, y, s); setcursor(); xorcursor(); } break; } } return OZEDITLINE_ERROR; }
int ozeditline1(byte _x0,byte y0,char *s0,byte slen,byte _xlen) { static char c; static byte l1; static unsigned k; static byte i; register char *p; xlen=_xlen; /* switch(ozgetfont()) { case FONT_PC_NORMAL: case FONT_OZ_NORMAL: height=8; break; default: height=13; break; } */ height=ozgetfontheight(ozgetfont()); x=x0=_x0; y1=y0; if((int)x0+(int)xlen>239 || (int)y1+(int)height>79) return OZEDITLINE_ERROR; xlen--; s=s0; pos=strlen(s0); if(pos>=slen) return OZEDITLINE_ERROR; putit(); setxorcursor(); for(;;) switch(k=getch()) { case KEY_BACKLIGHT: oztogglelight(); break; case KEY_LEFT: if(pos>0) { pos--; movecursor(); } break; case KEY_RIGHT: if(s[pos]) { pos++; movecursor(); } break; case KEY_MAIN: case KEY_SCHEDULE: case KEY_MEMO: case KEY_TELEPHONE: case KEY_MYPROGRAMS: case KEY_UPPER_ESC: case 27: xorcursor(); return OZEDITLINE_CANCEL; case KEY_LOWER_ENTER: case KEY_UPPER_ENTER: /* case '\r': */ case '\n': xorcursor(); return strlen(s); case KEY_BACKSPACE: if(pos>0) { pos--; p=s+pos; c=*p; while(*p) { *p=p[1]; p++; } xorcursor(); _ozfilledbox(putit(),y1,measurechar(c),height,WHITE); /* putit(); */ setxorcursor(); } break; default: if(k<127 && (byte)measurechar(k)+(byte)measurestring(s) < xlen && (l1=strlen(s)+1) < slen) { xorcursor(); for(i=l1;i>pos;i--) s[i]=s[i-1]; /* if(s[pos]==0) s[pos+1]=0; */ s[pos]=k; pos++; putit(); setxorcursor(); } break; } }
EVENT UIAPI uivfieldedit( VSCREEN *vptr, VFIELDEDIT *header ) /************************************************************/ { register EVENT ev; register VFIELD* cur; auto VBUFFER buffer; auto SAREA area; if( header->reset ) { header->reset = false; header->prevfield = NULL; header->curfield = NULL; header->cursor = true; area.height = 1; for( cur = header->fieldlist ; cur != NULL ; cur = cur->link ) { area.row = cur->row; area.col = cur->col; area.width = cur->length; uivattribute( vptr, area, header->exit ); } } if( header->cursor ) { header->cursor = false; header->delpending = false; header->fieldpending = false; header->cancel = false; if( vptr->cursor == C_OFF ) { vptr->cursor = C_NORMAL; } return( movecursor( vptr, header, vptr->row, vptr->col ) ); } if( header->fieldpending ) { header->update = true; if( header->cancel ) { header->cancel = false; header->curfield = NULL; setfield( vptr, header, header->prevfield, 0 ); } header->fieldpending = false; } cur = header->curfield; if( header->update ) { header->update = false; if( cur ) { /* this should always be non-NULL */ uipadblanks( header->buffer, cur->length ); if( header->delpending ) { buffer.content = header->buffer; buffer.length = cur->length; buffer.index = vptr->col - cur->col; uieditevent( EV_DELETE, &buffer ); header->dirty = true; header->delpending = false; } uivtextput( vptr, cur->row, cur->col, header->enter, header->buffer, cur->length ); } } if( header->oktomodify ) { uipushlist( livefieldevents ); } else { uipushlist( deadfieldevents ); } ev = uivgetevent( vptr ); if( ev > EV_NO_EVENT ) { if( uiintoplist( ev ) ) { if( cur ) { buffer.content = header->buffer; buffer.length = cur->length; buffer.index = vptr->col - cur->col; buffer.insert = ( vptr->cursor == C_INSERT ); buffer.dirty = false; uieditevent( ev, &buffer ); header->dirty |= buffer.dirty; } switch( ev ) { case EV_HOME: if( cur != NULL ) break; /* home is within field */ /* WARNING: this case falls through to the next */ case EV_TAB_FORWARD: case EV_TAB_BACKWARD: cur = tabfield( vptr, header->fieldlist, ev == EV_TAB_FORWARD ); /* WARNING: the EV_HOME case falls through */ if( cur != NULL ) { ev = setfield( vptr, header, cur, 0 ); cur = NULL; /* kludge - avoid calling movecursor */ } break; case EV_INSERT: if( vptr->cursor == C_INSERT ) { vptr->cursor = C_NORMAL ; } else { vptr->cursor = C_INSERT ; } break; case EV_CURSOR_UP: ev = movecursor( vptr, header, vptr->row - 1, vptr->col ); break; case EV_CURSOR_DOWN: ev = movecursor( vptr, header, vptr->row + 1, vptr->col ); break; case EV_RUB_OUT: header->delpending = true; /* WARNING: this case falls through to the next !!!! */ case EV_CURSOR_LEFT: if( cur ) { if( vptr->col > cur->col ) { break; /* cursor movement within field */ } } ev = movecursor( vptr, header, vptr->row, vptr->col - 1 ); break; case EV_CURSOR_RIGHT: case ' ': if( header->curfield ) { if( vptr->col < cur->col + cur->length - 1 ) { break; /* cursor movement within field */ } } ev = movecursor( vptr, header, vptr->row, vptr->col + 1 ); break; } if( ev != EV_FIELD_CHANGE ) { if( cur ) { ev = movecursor( vptr, header, vptr->row, cur->col + buffer.index ); if( buffer.dirty && ( ev == EV_NO_EVENT ) ) { uivtextput( vptr, cur->row, cur->col, header->enter, header->buffer, cur->length ); } } else { ev = EV_NO_EVENT; } header->delpending = false; } } } uipoplist(); return( ev ); }
void setattr(int row, int col, int attr, int count) { movecursor(row, col); }