int main(int argc, char **argv) { static char errbuf[256]; int i; setvbuf(stderr, errbuf, _IOLBF, sizeof errbuf); progname = basename(argv[0]); setlocale(LC_CTYPE, ""); mb_cur_max = MB_CUR_MAX; i = flags(argc, argv); argc -= i, argv += i; if (argc > 0) for (i = 0; i < argc; i++) addcmd(argv[i]); else addcmd("echo"); endcmd(); process(); return errcnt; }
int kgsl_g12_cmdstream_issueibcmds(struct kgsl_device_private *dev_priv, int drawctxt_index, uint32_t ibaddr, int sizedwords, uint32_t *timestamp, unsigned int ctrl) { unsigned int result = 0; unsigned int ofs = PACKETSIZE_STATESTREAM * sizeof(unsigned int); unsigned int cnt = 5; unsigned int nextaddr = 0; unsigned int index = 0; unsigned int nextcnt = 0x9000 | 5; struct kgsl_memdesc tmp = {0}; unsigned int cmd; struct kgsl_device *device = dev_priv->device; struct kgsl_pagetable *pagetable = dev_priv->process_priv->pagetable; struct kgsl_g12_device *g12_device = (struct kgsl_g12_device *) device; cmd = ibaddr; tmp.hostptr = (void *)*timestamp; KGSL_CMD_INFO("ctxt %d ibaddr 0x%08x sizedwords %d", drawctxt_index, ibaddr, sizedwords); if (drawctxt_index != (int)g_z1xx.prevctx) { kgsl_mmu_setstate(device, pagetable); cnt = PACKETSIZE_STATESTREAM; ofs = 0; } else { kgsl_g12_setstate(device, device->mmu.tlb_flags); } result = wait_event_interruptible_timeout(g12_device->wait_timestamp_wq, room_in_rb(g12_device), msecs_to_jiffies(KGSL_TIMEOUT_DEFAULT)); if (result < 0) { KGSL_CMD_ERR("failed waiting for ringbuffer. result %d", result); goto error; } result = 0; index = g12_device->current_timestamp % KGSL_G12_PACKET_COUNT; g12_device->current_timestamp++; *timestamp = g12_device->current_timestamp; g_z1xx.prevctx = drawctxt_index; addcmd(&g_z1xx, index, cmd + ofs, cnt); nextaddr = g_z1xx.cmdbufdesc.physaddr + rb_offset((index + 1) % KGSL_G12_PACKET_COUNT); tmp.hostptr = (void *)(tmp.hostptr + (sizedwords * sizeof(unsigned int))); tmp.size = 12; kgsl_sharedmem_writel(&tmp, 4, nextaddr); kgsl_sharedmem_writel(&tmp, 8, nextcnt); kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, 1); kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, 0); error: return result; }
int kgsl_g12_cmdstream_issueibcmds(struct kgsl_device_private *dev_priv, int drawctxt_index, uint32_t ibaddr, int sizedwords, uint32_t *timestamp, unsigned int ctrl) { unsigned int result = 0; unsigned int ofs = PACKETSIZE_STATESTREAM * sizeof(unsigned int); unsigned int cnt = 5; unsigned int nextaddr = 0; unsigned int index = 0; unsigned int nextindex; unsigned int nextcnt = KGSL_G12_STREAM_END_CMD | 5; struct kgsl_memdesc tmp = {0}; unsigned int cmd; struct kgsl_device *device = dev_priv->device; struct kgsl_pagetable *pagetable = dev_priv->process_priv->pagetable; struct kgsl_g12_device *g12_device = (struct kgsl_g12_device *) device; cmd = ibaddr; tmp.hostptr = (void *)*timestamp; KGSL_CMD_INFO("ctxt %d ibaddr 0x%08x sizedwords %d", drawctxt_index, ibaddr, sizedwords); /* context switch */ if (drawctxt_index != (int)g12_device->ringbuffer.prevctx) { KGSL_CMD_INFO("context switch %d -> %d", drawctxt_index, g12_device->ringbuffer.prevctx); kgsl_mmu_setstate(device, pagetable); cnt = PACKETSIZE_STATESTREAM; ofs = 0; } kgsl_g12_setstate(device, kgsl_pt_get_flags(device->mmu.hwpagetable, device->id)); result = wait_event_interruptible_timeout(g12_device->wait_timestamp_wq, room_in_rb(g12_device), msecs_to_jiffies(KGSL_TIMEOUT_DEFAULT)); if (result < 0) { KGSL_CMD_ERR("failed waiting for ringbuffer. result %d", result); goto error; } result = 0; index = g12_device->current_timestamp % KGSL_G12_PACKET_COUNT; g12_device->current_timestamp++; nextindex = g12_device->current_timestamp % KGSL_G12_PACKET_COUNT; *timestamp = g12_device->current_timestamp; g12_device->ringbuffer.prevctx = drawctxt_index; addcmd(&g12_device->ringbuffer, index, cmd + ofs, cnt); /* Make sure the next ringbuffer entry has a marker */ addmarker(&g12_device->ringbuffer, nextindex); nextaddr = g12_device->ringbuffer.cmdbufdesc.gpuaddr + rb_offset(nextindex); tmp.hostptr = (void *)(tmp.hostptr + (sizedwords * sizeof(unsigned int))); tmp.size = 12; kgsl_sharedmem_writel(&tmp, 4, nextaddr); kgsl_sharedmem_writel(&tmp, 8, nextcnt); cmd = (int)(((2) & VGV3_CONTROL_MARKADD_FMASK) << VGV3_CONTROL_MARKADD_FSHIFT); kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, cmd); kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, 0); error: return result; }
int kgsl_g12_cmdstream_issueibcmds(struct kgsl_device_private *dev_priv, struct kgsl_context *context, struct kgsl_ibdesc *ibdesc, unsigned int numibs, uint32_t *timestamp, unsigned int ctrl) { int result = 0; unsigned int ofs = PACKETSIZE_STATESTREAM * sizeof(unsigned int); unsigned int cnt = 5; unsigned int nextaddr = 0; unsigned int index = 0; unsigned int nextindex; unsigned int nextcnt = KGSL_G12_STREAM_END_CMD | 5; struct kgsl_memdesc tmp = {0}; unsigned int cmd; struct kgsl_device *device = dev_priv->device; struct kgsl_pagetable *pagetable = dev_priv->process_priv->pagetable; struct kgsl_g12_device *g12_device = KGSL_G12_DEVICE(device); unsigned int sizedwords; if (device->state & KGSL_STATE_HUNG) { return -EINVAL; goto error; } if (numibs != 1) { KGSL_DRV_ERR(device, "Invalid number of ibs: %d\n", numibs); result = -EINVAL; goto error; } cmd = ibdesc[0].gpuaddr; sizedwords = ibdesc[0].sizedwords; tmp.hostptr = (void *)*timestamp; KGSL_CMD_INFO(device, "ctxt %d ibaddr 0x%08x sizedwords %d\n", context->id, cmd, sizedwords); /* context switch */ if ((context->id != (int)g12_device->ringbuffer.prevctx) || (ctrl & KGSL_CONTEXT_CTX_SWITCH)) { KGSL_CMD_INFO(device, "context switch %d -> %d\n", context->id, g12_device->ringbuffer.prevctx); kgsl_mmu_setstate(device, pagetable); cnt = PACKETSIZE_STATESTREAM; ofs = 0; } kgsl_g12_setstate(device, kgsl_pt_get_flags(device->mmu.hwpagetable, device->id)); result = wait_event_interruptible_timeout(device->wait_queue, room_in_rb(g12_device), msecs_to_jiffies(KGSL_TIMEOUT_DEFAULT)); if (result <= 0) { KGSL_CMD_ERR(device, "wait_event_interruptible_timeout " "failed: %d\n", result); goto error; } result = 0; index = g12_device->current_timestamp % KGSL_G12_PACKET_COUNT; g12_device->current_timestamp++; nextindex = g12_device->current_timestamp % KGSL_G12_PACKET_COUNT; *timestamp = g12_device->current_timestamp; g12_device->ringbuffer.prevctx = context->id; addcmd(&g12_device->ringbuffer, index, cmd + ofs, cnt); /* Make sure the next ringbuffer entry has a marker */ addmarker(&g12_device->ringbuffer, nextindex); nextaddr = g12_device->ringbuffer.cmdbufdesc.gpuaddr + rb_offset(nextindex); tmp.hostptr = (void *)(tmp.hostptr + (sizedwords * sizeof(unsigned int))); tmp.size = 12; kgsl_sharedmem_writel(&tmp, 4, nextaddr); kgsl_sharedmem_writel(&tmp, 8, nextcnt); /* sync memory before activating the hardware for the new command*/ mb(); cmd = (int)(((2) & VGV3_CONTROL_MARKADD_FMASK) << VGV3_CONTROL_MARKADD_FSHIFT); kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, cmd); kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, 0); error: return result; }
static void process(FILE *f) { int i, n; char mac[5]; /* The current macro or nroff command */ int pl; stktop = -1; for (lineno = 1; fgets(line, sizeof(line), f); lineno++) { if (line[0] == '.') { /* * find and isolate the macro/command name. */ strncpy(mac, line + 1, 4); if (isspace(mac[0])) { pe(lineno); printf("Empty command\n"); } else if (isspace(mac[1])) { mac[1] = 0; } else if (isspace(mac[2])) { mac[2] = 0; } else if (mac[0] != '\\' || mac[1] != '\"') { pe(lineno); printf("Command too long\n"); } /* * Is it a known command? */ checkknown(mac); /* * Should we add it? */ if (eq(mac, "de")) addcmd(line); chkcmd(mac); } /* * At this point we process the line looking * for \s and \f. */ for (i = 0; line[i]; i++) { if (line[i] == '\\' && (i == 0 || line[i-1] != '\\')) { if (!sflag && line[++i] == 's') { pl = line[++i]; if (isdigit(pl)) { n = pl - '0'; pl = ' '; } else n = 0; while (isdigit(line[++i])) n = 10 * n + line[i] - '0'; i--; if (n == 0) { if (stk[stktop].opno == SZ) { stktop--; } else { pe(lineno); printf("unmatched \\s0\n"); } } else { stk[++stktop].opno = SZ; stk[stktop].pl = pl; stk[stktop].parm = n; stk[stktop].lno = lineno; } } else if (!fflag && line[i] == 'f') { n = line[++i]; if (n == 'P') { if (stk[stktop].opno == FT) { stktop--; } else { pe(lineno); printf("unmatched \\fP\n"); } } else { stk[++stktop].opno = FT; stk[stktop].pl = 1; stk[stktop].parm = n; stk[stktop].lno = lineno; } } } } } /* * We've hit the end and look at all this stuff that hasn't been * matched yet! Complain, complain. */ for (i = stktop; i >= 0; i--) { complain(i); } }
int main(int argc, char **argv) { char *port_source = "at compile time"; char *tmp_port; int opt; int house = 0; int repeat; int devs; int dimlevel = 0; br_control_info *cinfo = NULL; int tmperrno; #ifdef HAVE_GETOPT_LONG int opt_index; static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"port", required_argument, 0, 'x'}, {"repeat", required_argument, 0, 'r'}, {"on", required_argument, 0, 'n'}, {"off", required_argument, 0, 'f'}, {"ON", no_argument, 0, 'N'}, {"OFF", no_argument, 0, 'F'}, {"dim", required_argument, 0, 'd'}, {"lamps_on", no_argument, 0, 'B'}, {"lamps_off", no_argument, 0, 'D'}, {"inverse", no_argument, 0, 'i'}, {"house", required_argument, 0, 'c'}, {"verbose", no_argument, 0, 'v'}, {0, 0, 0, 0} }; #endif #define OPT_STRING "x:hvr:ic:n:Nf:Fd:BD" /* * It's possible to do an exec without even passing argv[0]; * this is just to make sure we don't make any bad * output decisions without accounting for that */ if (argc) MyName = argv[0]; if (argc < 2) { usage(); exit(EINVAL); } if ((cinfo = malloc(sizeof(br_control_info))) == NULL) { tmperrno = errno; fprintf(stderr, "%s: Error (%s) allocating memory.\n", MyName, strerror(errno)); exit(tmperrno); } CINFO_CLR(cinfo); cinfo->port = X10_PORTNAME; cinfo->repeat = 1; if ((tmp_port = getenv("X10_PORTNAME"))) { port_source = "in the environment variable X10_PORTNAME"; if (!checkimmutableport(port_source)) cinfo->port = tmp_port; } #ifdef HAVE_GETOPT_LONG while ((opt = getopt_long(argc, argv, OPT_STRING, long_options, &opt_index)) != -1) { #else while ((opt = getopt(argc, argv, OPT_STRING)) != -1) { #endif switch (opt) { case 'x': port_source = "on the command line"; if (checkimmutableport(port_source) < 0) exit(errno); cinfo->port = optarg; break; case 'r': repeat = atoi(optarg); if (!repeat && !isdigit(*optarg)) { fprintf(stderr, "%s: Invalid repeat value specified.\n", MyName); exit(EINVAL); } cinfo->repeat = (repeat ? repeat:INT_MAX); break; case 'v': if (Verbose++ == 10) fprintf(stderr, "\nGet a LIFE already. " "I've got enough v's, thanks.\n\n"); break; case 'i': cinfo->inverse++; /* no this isn't documented. * your free gift for reading the source. */ break; case 'c': if ((house = gethouse(optarg)) < 0) exit(errno); break; case 'n': if ((devs = getdevs(optarg)) < 0) exit(errno); if (addcmd(cinfo, ON, house, devs, 0) < 0) exit(errno); break; case 'N': if (addcmd(cinfo, ALL_ON, house, 0, 0) < 0) exit(errno); break; case 'f': if ((devs = getdevs(optarg)) < 0) exit(errno); if (addcmd(cinfo, OFF, house, devs, 0) < 0) exit(errno); break; case 'F': if (addcmd(cinfo, ALL_OFF, house, 0, 0) < 0) exit(errno); break; case 'd': if ((devs = getdim(optarg, &dimlevel)) < 0) exit(errno); if (addcmd(cinfo, DIM, house, devs, dimlevel) < 0) exit(errno); break; case 'B': if (addcmd(cinfo, ALL_LAMPS_ON, house, 0, 0) < 0) exit(errno); break; case 'D': if (addcmd(cinfo, ALL_LAMPS_OFF, house, 0, 0) < 0) exit(errno); break; case 'h': usage(); exit(0); default: usage(); exit(EINVAL); } } if (argc > optind) { /* * Must be using the native BottleRocket command line... */ if (native_br(cinfo, argc, argv, optind) < 0) exit(errno); } if (open_port(cinfo) < 0) exit(errno); if (br_execute(cinfo) < 0) exit(errno); if (close_port(cinfo) < 0) exit(errno); free(cinfo); return 0; }
int native_br(br_control_info *cinfo, int argc, char *argv[], int optind) { /* * Get arguments from the command line in native BottleRocket style */ int cmd; int house = 0; int devs = 0; int i; if (argc - optind < 2) { usage(); errno = EINVAL; return -1; } /* * Two arguments at a time; device and command */ for (i = optind; i < argc - 1; i += 2) { cmd = br_native_getcmd(argv[i + 1]); switch(cmd) { case ON: if (br_getunit(argv[i], &house, &devs) < 0) return -1; if (addcmd(cinfo, ON, house, devs, 0) < 0) return -1; break; case OFF: if (br_getunit(argv[i], &house, &devs) < 0) return -1; if (addcmd(cinfo, OFF, house, devs, 0) < 0) return -1; break; case DIM: if ((house = gethouse(argv[i])) < 0) return -1; if (addcmd(cinfo, DIM, house, 0, -1) < 0) return -1; break; case BRIGHT: if ((house = gethouse(argv[i])) < 0) return -1; if (addcmd(cinfo, DIM, house, 0, 1) < 0) return -1; break; case ALL_ON: if ((house = gethouse(argv[i])) < 0) return -1; if (addcmd(cinfo, ALL_ON, house, 0, 1) < 0) return -1; break; case ALL_OFF: if ((house = gethouse(argv[i])) < 0) return -1; if (addcmd(cinfo, ALL_OFF, house, 0, 1) < 0) return -1; break; case ALL_LAMPS_ON: if ((house = gethouse(argv[i])) < 0) return -1; if (addcmd(cinfo, ALL_LAMPS_ON, house, 0, 1) < 0) return -1; break; case ALL_LAMPS_OFF: if ((house = gethouse(argv[i])) < 0) return -1; if (addcmd(cinfo, ALL_LAMPS_OFF, house, 0, 1) < 0) return -1; break; default: /* How the hell did we end up here? */ errno = EINVAL; return -1; } } if (i != argc) { usage(); errno = EINVAL; return -1; } return 0; }
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); }