NFAUNode * WCPattern::parseBackref() { #define is_dig(x) ((x) >= '0' && (x) <= '9') #define to_int(x) ((x) - '0') int ci = curInd; int oldRef = 0, ref = 0; while (ci < pattern.GetLength() && is_dig(pattern[ci]) && (ref < 10 || ref < groupCount)) { oldRef = ref; ref = ref * 10 + to_int(pattern[ci++]); } if (ci == pattern.GetLength()) { oldRef = ref; ++ci; } if (oldRef < 0 || ci <= curInd) { raiseError(); return registerNode(new NFAReferenceUNode(-1)); } curInd = ci; return registerNode(new NFAReferenceUNode(ref)); #undef is_dig #undef to_int }
Token recognizeToken(bool allow_change = true){ if(eof()) return Token::END; wchar_t wc = curChar(allow_change); if(is_dig(wc)) return Token::NUM; if(is_letter(wc)) return Token::IDENTIFER; if(wc == L'\"') return Token::STRING; if(wc == L'\'') return Token::CHAR; if(wc == L'\0') return Token::NONE; return Token::OPERATOR; }
static void parse_name(const char *name, long *hashp, long **dimp, int *ndimp) { const char *s; int l; long val; if (!memcmp(name, "::", 2)) { *hashp = _clip_casehashbytes(0, "__SELF__", 8); l = strcspn(name + 1, "[]:"); s = name + 1 + l; } else { l = strcspn(name, "[]:"); *hashp = _clip_casehashbytes(0, name, l); s = name + l; } for (;;) { l = strspn(s, "[]:"); s += l; l = strcspn(s, "[]:"); if (!l) break; *dimp = (long *) realloc(*dimp, sizeof(long) * (1 + *ndimp)); if (is_dig(s, l)) val = atoi(s) - 1; else val = _clip_casehashbytes(0, s, l); (*dimp)[*ndimp] = val; (*ndimp)++; s += l; } }
int main(int argc, char **argv) { int ch; char prompt[96]; while ((ch = getopt(argc, argv, "hv")) != EOF) { switch (ch) { case 'v': log_level++; break; case 'h': usage(); } } argc -= optind; argv += optind; if (argc < 1) usage(); progname = argv[0]; if (is_dig(progname)) { pid = strtoul(progname, 0, 10); } else { char path[256]; FILE *file; snprintf(path, sizeof(path), "%s.pid", progname); file = fopen(path, "r"); if (file) { unsigned long ul; if (fscanf(file, "%lu", &ul) == 1) pid = ul; fclose(file); } if (pid == 0) { snprintf(path, sizeof(path), "pidof -s %s", progname); file = popen(path, "r"); if (file) { unsigned long ul; if (fscanf(file, "%lu", &ul) == 1) pid = ul; pclose(file); } } } if (pid == 0) { fprintf(stderr, "cannot determine PID of target process '%s'\n", progname); exit(1); } tcgetattr(0, &term); oterm = term; term.c_lflag &= ~ICANON; term.c_cc[VTIME] = 1; tcsetattr(0, TCSANOW, &term); signal(SIGINT, sigfunc); signal(SIGTERM, sigfunc); #ifndef OS_MINGW signal(SIGHUP, sigfunc); signal(SIGPIPE, sigpipe); signal(SIGUSR1, sigusr); #endif signal(SIGILL, sigfunc); signal(SIGSEGV, sigfunc); snprintf(in_path, sizeof(in_path), "/tmp/clip_dbg.%lu.in", (unsigned long) pid); remove(in_path); if (mkfifo(in_path, 0600)) { fprintf(stderr, "clip_dbg: cannot create FIFO '%s': %s\n", in_path, strerror(errno)); cleanup(3); } logg(1, "fifo %s created successfully", in_path); snprintf(out_path, sizeof(out_path), "/tmp/clip_dbg.%lu.out", (unsigned long) pid); remove(out_path); if (mkfifo(out_path, 0600)) { fprintf(stderr, "clip_dbg: cannot create FIFO '%s': %s\n", out_path, strerror(errno)); cleanup(4); } logg(1, "fifo %s created successfully", out_path); #ifndef OS_MINGW if (kill(pid, SIGUSR1)) { fprintf(stderr, "clip_dbg: cannot send signal SIGUSR1 to pid %lu: %s\n", (unsigned long) pid, strerror(errno)); cleanup(7); } #endif fin = fopen(in_path, "w"); if (!fin) { fprintf(stderr, "clip_dbg: cannot open FIFO '%s': %s\n", in_path, strerror(errno)); cleanup(5); } setvbuf(fin, 0, _IOLBF, 0); /*setvbuf(stdin, 0, _IOLBF, 0); */ /*setvbuf(stdout, 0, _IOLBF, 0); */ logg(1, "fifo %s opened for writing", in_path); fwrite("\n", 1, 1, fin); logg(1, "signal SIGUSR1 sent to pid %lu", (unsigned long) pid); fout = open(out_path, O_RDONLY, 0); if (fout < 0) { fprintf(stderr, "clip_dbg: cannot open FIFO '%s': %s\n", out_path, strerror(errno)); cleanup(6); } #ifndef OS_MINGW fcntl(fout, F_SETFL, O_NONBLOCK); #endif logg(1, "fifo %s opened for reading", out_path); mpid = getpid(); write(1, usage_str, sizeof(usage_str) - 1); snprintf(prompt, sizeof(prompt), "clip_dbg %s > ", progname); rl_callback_handler_install(prompt, process_line); write(1, "?\n", 2); while (1) { fd_set rfs; int r, l; char buf[1024]; FD_ZERO(&rfs); FD_SET(fout, &rfs); FD_SET(fileno(stdin), &rfs); r = select(fout + 1, &rfs, 0, 0, 0); if (r < 0) break; if (FD_ISSET(fout, &rfs)) { l = read(fout, buf, sizeof(buf)); if (l <= 0) break; if (pipe_flag) { int i; for (i = 0; i < l; i++) char_pipe(buf[i]); } else { if (write(1, buf, l) < l) break; rl_forced_update_display(); continue; } } if (FD_ISSET(fileno(stdin), &rfs)) { if (!pipe_flag) { rl_callback_read_char(); } } } cleanup(0); return 0; }