/** * non-declaration statement */ do_statement () { if (amatch ("if", 2)) { doif (); lastst = STIF; } else if (amatch ("while", 5)) { dowhile (); lastst = STWHILE; } else if (amatch ("switch", 6)) { doswitch (); lastst = STSWITCH; } else if (amatch ("do", 2)) { dodo (); need_semicolon (); lastst = STDO; } else if (amatch ("for", 3)) { dofor (); lastst = STFOR; } else if (amatch ("return", 6)) { doreturn (); need_semicolon (); lastst = STRETURN; } else if (amatch ("break", 5)) { dobreak (); need_semicolon (); lastst = STBREAK; } else if (amatch ("continue", 8)) { docont (); need_semicolon (); lastst = STCONT; } else if (match (";")) ; else if (amatch ("case", 4)) { docase (); lastst = statement (NO); } else if (amatch ("default", 7)) { dodefault (); lastst = statement (NO); } else if (match ("__asm__")) { doasm (); lastst = STASM; } else if (match("#")) { kill(); } else if (match ("{")) do_compound (NO); else { expression (YES); /* if (match (":")) { dolabel (); lastst = statement (NO); } else { */ need_semicolon (); lastst = STEXP; /* } */ } }
int jump_to_file_line(BW *bw,unsigned char *file,int line,unsigned char *msg) { int omid; if (!bw->b->name || zcmp(file, bw->b->name)) { if (doswitch(bw, vsdup(file), NULL, NULL)) return -1; bw = (BW *) maint->curwin->object; } omid = mid; mid = 1; pline(bw->cursor, line); dofollows(); mid = omid; bw->cursor->xcol = piscol(bw->cursor); msgnw(bw->parent, msg); return 0; }
Status GRCsim::visit(Switch &s) { assert(s.st); //Notice that switch alway has one active child - no matter // its ctrlflow value is 1 or x, just pass by the ctrl value // to this child. int act_ch = doswitch(s.st); assert(act_ch < (int) s.successors.size()); GRCNode *child = s.successors[act_ch]; if (debug) cerr << cfgmap[&s] << ":switch " << stmap[s.st] << " --" << act_ch << "--> " << (child ? cfgmap[child] : -1) << '\n'; if (child) schedule(child,globalcc); return Status(); }
static int dotag(BW *bw, unsigned char *s, void *obj, int *notify) { unsigned char buf[512]; unsigned char buf1[512]; FILE *f; unsigned char *t = NULL; if (notify) { *notify = 1; } if (bw->b->name) { t = vsncpy(t, 0, sz(bw->b->name)); t = vsncpy(sv(t), sc(":")); t = vsncpy(sv(t), sv(s)); } /* first try to open the tags file in the current directory */ f = fopen("tags", "r"); if (!f) { /* if there's no tags file in the current dir, then query for the environment variable TAGS. */ char *tagspath = getenv("TAGS"); if(tagspath){ f = fopen(tagspath, "r"); } if(!f){ msgnw(bw->parent, joe_gettext(_("Couldn't open tags file"))); vsrm(s); vsrm(t); return -1; } } while (fgets((char *)buf, 512, f)) { int x, y, c; for (x = 0; buf[x] && buf[x] != ' ' && buf[x] != '\t'; ++x) ; c = buf[x]; buf[x] = 0; if (!strcmp(s, buf) || (t && !strcmp(t, buf))) { buf[x] = c; while (buf[x] == ' ' || buf[x] == '\t') { ++x; } for (y = x; buf[y] && buf[y] != ' ' && buf[y] != '\t' && buf[y] != '\n'; ++y) ; if (x != y) { c = buf[y]; buf[y] = 0; if (doswitch(bw, vsncpy(NULL, 0, sz(buf + x)), NULL, NULL)) { vsrm(s); vsrm(t); fclose(f); return -1; } bw = (BW *) maint->curwin->object; p_goto_bof(bw->cursor); buf[y] = c; while (buf[y] == ' ' || buf[y] == '\t') { ++y; } for (x = y; buf[x] && buf[x] != '\n'; ++x) ; buf[x] = 0; if (x != y) { long line = 0; if (buf[y] >= '0' && buf[y] <= '9') { /* It's a line number */ sscanf((char *)(buf + y), "%ld", &line); if (line >= 1) { int omid = mid; mid = 1; pline(bw->cursor, line - 1), bw->cursor->xcol = piscol(bw->cursor); dofollows(); mid = omid; } else { msgnw(bw->parent, joe_gettext(_("Invalid line number"))); } } else { int z = 0; /* It's a search string. New versions of ctags have real regex with vi command. Old ones do not always quote / and depend on it being last char on line. */ if (buf[y] == '/' || buf[y] == '?') { int ch = buf[y++]; /* Find terminating / or ? */ for (x = y + strlen(buf + y); x != y; --x) if (buf[x] == ch) break; /* Copy characters, convert to JOE regex... */ if (buf[y] == '^') { buf1[z++] = '\\'; buf1[z++] = '^'; ++y; } while (buf[y] && buf[y] != '\n' && !(buf[y] == ch && y == x)) { if (buf[y] == '$' && buf[y+1] == ch) { ++y; buf1[z++] = '\\'; buf1[z++] = '$'; } else if (buf[y] == '\\' && buf[y+1]) { /* This is going to cause problem... old ctags did not have escape */ ++y; if (buf[y] == '\\') buf1[z++] = '\\'; buf1[z++] = buf[y++]; } else { buf1[z++] = buf[y++]; } } } if (z) { vsrm(s); vsrm(t); fclose(f); buf1[z] = 0; return dopfnext(bw, mksrch(vsncpy(NULL, 0, sz(buf1)), NULL, 0, 0, -1, 0, 0, 0), NULL); } } } vsrm(s); vsrm(t); fclose(f); return 0; } } } msgnw(bw->parent, joe_gettext(_("Not found"))); vsrm(s); vsrm(t); fclose(f); return -1; }