/*VARARGS1*/ int execute(char *a, ...) /* note: "exec" is already defined on u370 */ { va_list ap; int exitcode = -1; /* initialize, to avoid warning */ char *argv[BUFSIZ]; pid_t p; /* fork and exec the program or shell script */ endwin(); /* restore the terminal modes */ mousecleanup(); fflush(stdout); va_start(ap, a); for (p = 0; (argv[p] = va_arg(ap, char *)) != 0; p++) ; #if !HAVE_FORK /* HBB 20010313: in MSDOG, everything is completely different. * No fork()/exec()/wait(), but rather a single libc call: */ exitcode = spawnvp(P_WAIT, a, argv); #else if ((p = myfork()) == 0) { myexecvp(a, argv); /* child */ } else { exitcode = join(p); /* parent */ } #endif /* MSDOS */ /* the menu and scrollbar may be changed by the command executed */ #if UNIXPC || !TERMINFO # ifndef __DJGPP__ /* leave CRLF handling as is */ nonl(); # endif raw(); /* endwin() turns off cbreak mode so restore it */ noecho(); #endif mousemenu(); drawscrollbar(topline, nextline); va_end(ap); return(exitcode); }
void winscroll (boolean isvertscroll, int scrolltype, long pos) { /* 7.0b20 PBS: Fix Windows display glitch -- if scroll is finished, redraw the scrollbar. */ boolean flup, flpage; long distance; tyscrollinfo scrollinfo; tydirection dir; if (shellwindowinfo != NULL) { if (isvertscroll) { scrollinfo = (**shellwindowinfo).vertscrollinfo; } else { scrollinfo = (**shellwindowinfo).horizscrollinfo; } switch (scrolltype) { case SB_LINEUP: case SB_PAGEUP: case SB_TOP: flup = false; break; case SB_BOTTOM: case SB_LINEDOWN: case SB_PAGEDOWN: flup = true; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: if (pos < scrollinfo.cur) flup = false; else flup = true; break; default: flup = false; break; } dir = scrolldirection (isvertscroll, flup); flpage = false; distance = 0; switch (scrolltype) { case SB_PAGEUP: case SB_PAGEDOWN: flpage = true; distance = 1; break; case SB_LINEUP: case SB_LINEDOWN: distance = 1; break; case SB_BOTTOM: distance = scrollinfo.max - scrollinfo.cur; break; case SB_TOP: distance = scrollinfo.cur - scrollinfo.min; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: distance = scrollinfo.cur - pos; break; default: break; } distance = abs(distance); if (distance > 0) (*shellglobals.scrollroutine) (dir, flpage, distance); if (scrolltype == SB_ENDSCROLL) { /*7.0b20 PBS: Fix Windows display glitch -- redraw.*/ if (isvertscroll) drawscrollbar ((**shellwindowinfo).vertscrollbar); else drawscrollbar ((**shellwindowinfo).horizscrollbar); } /*if*/ } }
void display(void) { char *subsystem; /* OGS subsystem name */ char *book; /* OGS book name */ char file[PATHLEN + 1]; /* file name */ char function[PATLEN + 1]; /* function name */ char linenum[NUMLEN + 1]; /* line number */ int screenline; /* screen line number */ int width; /* source line display width */ int i; char *s; /* see if this is the initial display */ erase(); if (refsfound == NULL) { #if CCS if (displayversion == YES) { printw("cscope %s", ESG_REL); } else { printw("cscope"); } #else printw("Cscope version %d%s", FILEVERSION, FIXVERSION); #endif move(0, COLS - (int) sizeof(helpstring)); addstr(helpstring); } else if (totallines == 0) { /* if no references were found */ /* redisplay the last message */ addstr(lastmsg); } else { /* display the pattern */ if (changing == YES) { printw("Change \"%s\" to \"%s\"", Pattern, newpat); } else { printw("%c%s: %s", toupper((unsigned char)fields[field].text2[0]), fields[field].text2 + 1, Pattern); } /* display the column headings */ move(2, 2); if (ogs == YES && field != FILENAME) { printw("%-*s ", subsystemlen, "Subsystem"); printw("%-*s ", booklen, "Book"); } if (dispcomponents > 0) printw("%-*s ", filelen, "File"); if (field == SYMBOL || field == CALLEDBY || field == CALLING) { printw("%-*s ", fcnlen, "Function"); } if (field != FILENAME) { addstr("Line"); } addch('\n'); /* if at end of file go back to beginning */ if (nextline > totallines) { seekline(1); } /* calculate the source text column */ width = COLS - numlen - 3; if (ogs == YES) { width -= subsystemlen + booklen + 2; } if (dispcomponents > 0) { width -= filelen + 1; } if (field == SYMBOL || field == CALLEDBY || field == CALLING) { width -= fcnlen + 1; } /* until the max references have been displayed or there is no more room */ topline = nextline; for (disprefs = 0, screenline = REFLINE; disprefs < mdisprefs && screenline <= lastdispline; ++disprefs, ++screenline) { /* read the reference line */ if (fscanf(refsfound, "%" PATHLEN_STR "s%" PATHLEN_STR "s%" NUMLEN_STR "s %" TEMPSTRING_LEN_STR "[^\n]", file, function, linenum, tempstring) < 4) { break; } ++nextline; displine[disprefs] = screenline; /* if no mouse, display the selection number */ if (mouse == YES) { addch(' '); } else { printw("%c", dispchars[disprefs]); } /* display any change mark */ if (changing == YES && change[topline + disprefs - 1] == YES) { addch('>'); } else { addch(' '); } /* display the file name */ if (field == FILENAME) { printw("%-*s ", filelen, file); } else { /* if OGS, display the subsystem and book names */ if (ogs == YES) { ogsnames(file, &subsystem, &book); printw("%-*.*s ", subsystemlen, subsystemlen, subsystem); printw("%-*.*s ", booklen, booklen, book); } /* display the requested path components */ if (dispcomponents > 0) { printw("%-*.*s ", filelen, filelen, pathcomponents(file, dispcomponents)); } } /* else(field == FILENAME) */ /* display the function name */ if (field == SYMBOL || field == CALLEDBY || field == CALLING) { printw("%-*.*s ", fcnlen, fcnlen, function); } if (field == FILENAME) { addch('\n'); /* go to next line */ continue; } /* display the line number */ printw("%*s ", numlen, linenum); /* there may be tabs in egrep output */ while ((s = strchr(tempstring, '\t')) != NULL) { *s = ' '; } /* display the source line */ s = tempstring; for (;;) { /* see if the source line will fit */ if ((i = strlen(s)) > width) { /* find the nearest blank */ for (i = width; s[i] != ' ' && i > 0; --i) { ; } if (i == 0) { i = width; /* no blank */ } } /* print up to this point */ printw("%.*s", i, s); s += i; /* if line didn't wrap around */ if (i < width) { addch('\n'); /* go to next line */ } /* skip blanks */ while (*s == ' ') { ++s; } /* see if there is more text */ if (*s == '\0') { break; } /* if the source line is too long */ if (++screenline > lastdispline) { /* if this is the first displayed line, display what will fit on the screen */ if (topline == nextline -1) { disprefs++; /* break out of two loops */ goto endrefs; } /* erase the reference */ while (--screenline >= displine[disprefs]) { move(screenline, 0); clrtoeol(); } ++screenline; /* go back to the beginning of this reference */ --nextline; seekline(nextline); goto endrefs; } /* indent the continued source line */ move(screenline, COLS - width); } /* for(ever) */ } /* for(reference output lines) */ endrefs: /* position the cursor for the message */ i = FLDLINE - 1; if (screenline < i) { addch('\n'); } else { move(i, 0); } /* check for more references */ i = totallines - nextline + 1; bottomline = nextline; if (i > 0) { printw("* Lines %d-%d of %d, %d more - press the space bar to display more *", topline, bottomline, totallines, i); } /* if this is the last page of references */ else if (topline > 1 && nextline > totallines) { addstr("* Press the space bar to display the first lines again *"); } } /* display the input fields */ move(FLDLINE, 0); for (i = 0; i < FIELDS; ++i) { printw("%s %s:\n", fields[i].text1, fields[i].text2); } /* display any prompt */ if (changing == YES) { move(PRLINE, 0); addstr(selprompt); } drawscrollbar(topline, nextline); /* display the scrollbar */ refresh(); }
void display(void) { char *subsystem; /* OGS subsystem name */ char *book; /* OGS book name */ char file[PATHLEN + 1]; /* file name */ char function[PATLEN + 1]; /* function name */ char linenum[NUMLEN + 1]; /* line number */ int screenline; /* screen line number */ int width; /* source line display width */ int i; char *s; (void) erase(); /* if there are no references */ if (totallines == 0) { if (*lastmsg != '\0') { (void) addstr(lastmsg); /* redisplay any message */ } else { (void) printw("Cscope version %d%s", FILEVERSION, FIXVERSION); (void) move(0, COLS - (int)sizeof (helpstring)); (void) addstr(helpstring); } } else { /* display the pattern */ if (changing == YES) { (void) printw("Change \"%s\" to \"%s\"", pattern, newpat); } else { (void) printw("%c%s: %s", toupper(fields[field].text2[0]), fields[field].text2 + 1, pattern); } /* display the cscope invocation nesting depth */ if (cscopedepth > 1) { (void) move(0, COLS - (int)sizeof (depthstring) - 2); (void) addstr(depthstring); (void) printw("%d", cscopedepth); } /* display the column headings */ (void) move(2, selectlen + 1); if (ogs == YES && field != FILENAME) { (void) printw("%-*s ", subsystemlen, "Subsystem"); (void) printw("%-*s ", booklen, "Book"); } if (dispcomponents > 0) { (void) printw("%-*s ", filelen, "File"); } if (displayfcn()) { (void) printw("%-*s ", fcnlen, "Function"); } if (field != FILENAME) { (void) addstr("Line"); } (void) addch('\n'); /* if at end of file go back to beginning */ if (nextline > totallines) { seekline(1); } /* calculate the source text column */ width = COLS - selectlen - numlen - 2; if (ogs == YES) { width -= subsystemlen + booklen + 2; } if (dispcomponents > 0) { width -= filelen + 1; } if (displayfcn()) { width -= fcnlen + 1; } /* * until the max references have been displayed or * there is no more room */ topline = nextline; for (disprefs = 0, screenline = REFLINE; disprefs < mdisprefs && screenline <= lastdispline; ++disprefs, ++screenline) { /* read the reference line */ if (fscanf(refsfound, "%s%s%s %[^\n]", file, function, linenum, yytext) < 4) { break; } ++nextline; displine[disprefs] = screenline; /* if no mouse, display the selection number */ if (!mouse) { (void) printw("%*d", selectlen, disprefs + 1); } /* display any change mark */ if (changing == YES && change[topline + disprefs - 1] == YES) { (void) addch('>'); } else { (void) addch(' '); } /* display the file name */ if (field == FILENAME) { (void) printw("%-.*s\n", COLS - 3, file); continue; } /* if OGS, display the subsystem and book names */ if (ogs == YES) { ogsnames(file, &subsystem, &book); (void) printw("%-*.*s ", subsystemlen, subsystemlen, subsystem); (void) printw("%-*.*s ", booklen, booklen, book); } /* display the requested path components */ if (dispcomponents > 0) { (void) printw("%-*.*s ", filelen, filelen, pathcomponents(file, dispcomponents)); } /* display the function name */ if (displayfcn()) { (void) printw("%-*.*s ", fcnlen, fcnlen, function); } /* display the line number */ (void) printw("%*s ", numlen, linenum); /* there may be tabs in egrep output */ while ((s = strchr(yytext, '\t')) != NULL) { *s = ' '; } /* display the source line */ s = yytext; for (;;) { /* see if the source line will fit */ if ((i = strlen(s)) > width) { /* find the nearest blank */ for (i = width; s[i] != ' ' && i > 0; --i) { } if (i == 0) { i = width; /* no blank */ } } /* print up to this point */ (void) printw("%.*s", i, s); s += i; /* if line didn't wrap around */ if (i < width) { /* go to next line */ (void) addch('\n'); } /* skip blanks */ while (*s == ' ') { ++s; } /* see if there is more text */ if (*s == '\0') { break; } /* if the source line is too long */ if (++screenline > lastdispline) { /* * if this is the first displayed line, * display what will fit on the screen */ if (topline == nextline - 1) { goto endrefs; } /* erase the reference */ while (--screenline >= displine[disprefs]) { (void) move(screenline, 0); (void) clrtoeol(); } ++screenline; /* * go back to the beginning of this * reference */ --nextline; seekline(nextline); goto endrefs; } /* indent the continued source line */ (void) move(screenline, COLS - width); } } endrefs: /* check for more references */ bottomline = nextline; if (bottomline - topline < totallines) { (void) move(FLDLINE - 1, 0); (void) standout(); (void) printw("%*s", selectlen + 1, ""); if (bottomline - 1 == topline) { (void) printw("Line %d", topline); } else { (void) printw("Lines %d-%d", topline, bottomline - 1); } (void) printw(" of %d, press the space bar to " "display next lines", totallines); (void) standend(); } } /* display the input fields */ (void) move(FLDLINE, 0); for (i = 0; i < FIELDS; ++i) { (void) printw("%s %s:\n", fields[i].text1, fields[i].text2); } drawscrollbar(topline, nextline, totallines); }
BOOL command(int commandc) { char filename[PATHLEN + 1]; /* file path name */ MOUSEEVENT *p; /* mouse data */ int c, i; FILE *file; HISTORY *curritem, *item; /* command history */ char *s; switch (commandc) { case ctrl('C'): /* toggle caseless mode */ if (caseless == NO) { caseless = YES; putmsg2("Caseless mode is now ON"); } else { caseless = NO; putmsg2("Caseless mode is now OFF"); } egrepcaseless(caseless); /* turn on/off -i flag */ return (NO); case ctrl('R'): /* rebuild the cross reference */ if (isuptodate == YES) { putmsg("The -d option prevents rebuilding the " "symbol database"); return (NO); } exitcurses(); freefilelist(); /* remake the source file list */ makefilelist(); rebuild(); if (errorsfound == YES) { errorsfound = NO; askforreturn(); } entercurses(); putmsg(""); /* clear any previous message */ totallines = 0; topline = nextline = 1; break; case ctrl('X'): /* mouse selection */ if ((p = getmouseevent()) == NULL) { return (NO); /* unknown control sequence */ } /* if the button number is a scrollbar tag */ if (p->button == '0') { scrollbar(p); break; } /* ignore a sweep */ if (p->x2 >= 0) { return (NO); } /* if this is a line selection */ if (p->y1 < FLDLINE) { /* find the selected line */ /* note: the selection is forced into range */ for (i = disprefs - 1; i > 0; --i) { if (p->y1 >= displine[i]) { break; } } /* display it in the file with the editor */ editref(i); } else { /* this is an input field selection */ field = mouseselection(p, FLDLINE, FIELDS); setfield(); resetcmd(); return (NO); } break; case '\t': /* go to next input field */ case '\n': case '\r': case ctrl('N'): case KEY_DOWN: case KEY_ENTER: case KEY_RIGHT: field = (field + 1) % FIELDS; setfield(); resetcmd(); return (NO); case ctrl('P'): /* go to previous input field */ case KEY_UP: case KEY_LEFT: field = (field + (FIELDS - 1)) % FIELDS; setfield(); resetcmd(); return (NO); case KEY_HOME: /* go to first input field */ field = 0; setfield(); resetcmd(); return (NO); case KEY_LL: /* go to last input field */ field = FIELDS - 1; setfield(); resetcmd(); return (NO); case ' ': /* display next page */ case '+': case ctrl('V'): case KEY_NPAGE: /* don't redisplay if there are no lines */ if (totallines == 0) { return (NO); } /* * note: seekline() is not used to move to the next * page because display() leaves the file pointer at * the next page to optimize paging forward */ break; case '-': /* display previous page */ case KEY_PPAGE: /* don't redisplay if there are no lines */ if (totallines == 0) { return (NO); } i = topline; /* save the current top line */ nextline = topline; /* go back to this page */ /* if on first page but not at beginning, go to beginning */ if (nextline > 1 && nextline <= mdisprefs) { nextline = 1; } else { /* go back the maximum displayable lines */ nextline -= mdisprefs; /* if this was the first page, go to the last page */ if (nextline < 1) { nextline = totallines - mdisprefs + 1; if (nextline < 1) { nextline = 1; } /* old top is past last line */ i = totallines + 1; } } /* * move down til the bottom line is just before the * previous top line */ c = nextline; for (;;) { seekline(nextline); display(); if (i - bottomline <= 0) { break; } nextline = ++c; } return (NO); /* display already up to date */ case '>': /* write or append the lines to a file */ if (totallines == 0) { putmsg("There are no lines to write to a file"); } else { /* get the file name */ (void) move(PRLINE, 0); (void) addstr("Write to file: "); s = "w"; if ((c = mygetch()) == '>') { (void) move(PRLINE, 0); (void) addstr(appendprompt); c = '\0'; s = "a"; } if (c != '\r' && c != '\n' && c != KEY_ENTER && c != KEY_BREAK && getaline(newpat, COLS - sizeof (appendprompt), c, NO) > 0) { shellpath(filename, sizeof (filename), newpat); if ((file = fopen(filename, s)) == NULL) { cannotopen(filename); } else { seekline(1); while ((c = getc(refsfound)) != EOF) { (void) putc(c, file); } seekline(topline); (void) fclose(file); } } clearprompt(); } return (NO); /* return to the previous field */ case '<': /* read lines from a file */ (void) move(PRLINE, 0); (void) addstr(readprompt); if (getaline(newpat, COLS - sizeof (readprompt), '\0', NO) > 0) { clearprompt(); shellpath(filename, sizeof (filename), newpat); if (readrefs(filename) == NO) { putmsg2("Ignoring an empty file"); return (NO); } return (YES); } clearprompt(); return (NO); case '^': /* pipe the lines through a shell command */ case '|': /* pipe the lines to a shell command */ if (totallines == 0) { putmsg("There are no lines to pipe to a shell command"); return (NO); } /* get the shell command */ (void) move(PRLINE, 0); (void) addstr(pipeprompt); if (getaline(newpat, COLS - sizeof (pipeprompt), '\0', NO) == 0) { clearprompt(); return (NO); } /* if the ^ command, redirect output to a temp file */ if (commandc == '^') { (void) strcat(strcat(newpat, " >"), temp2); } exitcurses(); if ((file = mypopen(newpat, "w")) == NULL) { (void) fprintf(stderr, "cscope: cannot open pipe to shell command: %s\n", newpat); } else { seekline(1); while ((c = getc(refsfound)) != EOF) { (void) putc(c, file); } seekline(topline); (void) mypclose(file); } if (commandc == '^') { if (readrefs(temp2) == NO) { putmsg("Ignoring empty output of ^ command"); } } askforreturn(); entercurses(); break; case ctrl('L'): /* redraw screen */ case KEY_CLEAR: (void) clearok(curscr, TRUE); (void) wrefresh(curscr); drawscrollbar(topline, bottomline, totallines); return (NO); case '!': /* shell escape */ (void) execute(shell, shell, (char *)NULL); seekline(topline); break; case '?': /* help */ (void) clear(); help(); (void) clear(); seekline(topline); break; case ctrl('E'): /* edit all lines */ editall(); break; case ctrl('A'): /* repeat last pattern */ case ctrl('Y'): /* (old command) */ if (*pattern != '\0') { (void) addstr(pattern); goto repeat; } break; case ctrl('B'): /* cmd history back */ case ctrl('F'): /* cmd history fwd */ curritem = currentcmd(); item = (commandc == ctrl('F')) ? nextcmd() : prevcmd(); clearmsg2(); if (curritem == item) { /* inform user that we're at history end */ putmsg2( "End of input field and search pattern history"); } if (item) { field = item->field; setfield(); atfield(); (void) addstr(item->text); (void) strcpy(pattern, item->text); switch (c = mygetch()) { case '\r': case '\n': case KEY_ENTER: goto repeat; default: ungetch(c); atfield(); (void) clrtoeol(); /* clear current field */ break; } } return (NO); case '\\': /* next character is not a command */ (void) addch('\\'); /* display the quote character */ /* get a character from the terminal */ if ((commandc = mygetch()) == EOF) { return (NO); /* quit */ } (void) addstr("\b \b"); /* erase the quote character */ goto ispat; case '.': atfield(); /* move back to the input field */ /* FALLTHROUGH */ default: /* edit a selected line */ if (isdigit(commandc) && commandc != '0' && !mouse) { if (returnrequired == NO) { editref(commandc - '1'); } else { (void) move(PRLINE, 0); (void) addstr(selectionprompt); if (getaline(newpat, COLS - sizeof (selectionprompt), commandc, NO) > 0 && (i = atoi(newpat)) > 0) { editref(i - 1); } clearprompt(); } } else if (isprint(commandc)) { /* this is the start of a pattern */ ispat: if (getaline(newpat, COLS - fldcolumn - 1, commandc, caseless) > 0) { (void) strcpy(pattern, newpat); resetcmd(); /* reset history */ repeat: addcmd(field, pattern); /* add to history */ if (field == CHANGE) { /* prompt for the new text */ (void) move(PRLINE, 0); (void) addstr(toprompt); (void) getaline(newpat, COLS - sizeof (toprompt), '\0', NO); } /* search for the pattern */ if (search() == YES) { switch (field) { case DEFINITION: case FILENAME: if (totallines > 1) { break; } topline = 1; editref(0); break; case CHANGE: return (changestring()); } } else if (field == FILENAME && access(newpat, READ) == 0) { /* try to edit the file anyway */ edit(newpat, "1"); } } else { /* no pattern--the input was erased */ return (NO); } } else { /* control character */ return (NO); } } return (YES); }