/* DR 02/12/93 12:47:07 PM */ #include "eel.h" /* * Test patterns follow: * * D:\epsilon\s603\grab.e * D:\epsilon\s603\grab.e(16) * D:\epsilon\s603\grab.e(17:10) * D:\epsilon\s603\grab.e(18) * D:\epsilon\s603\grab.e(19:15) * D:\epsilon\s603\grab.e(20) * D:\epsilon\s603\grab.e(21:20) ** 16 ** 17 10 ** 18 ** 19 15 ** 20 ** 21 20 */ #define DRIVE "([a-zA-Z]:)?" #define FNAME DRIVE "([0-9A-z\.\/\\]+)" #define LPAREN "[ \\(]*" #define NUMBER "([0-9]+)" #define RPAREN "[ \\)]+" #define FNAME_PATTERN FNAME "(" LPAREN NUMBER "(:" NUMBER ")?" RPAREN ")?" #define FNAME_PAREN 2 #define LINENO_PAREN 4 #define COLUMN_PAREN 6 /* * grab_file() * * This command finds the next file name in the current window, loads it, * and then positions point at the indicated line number and column. */ command grab_file() on cx_tab[CTRL('J')] { int num; char number[10], column[10]; char *orig = bufname, file[FNAMELEN]; int bGrp, eGrp; /* Beginning & end of Group */ int orig_num = window_number; re_search(1, FNAME_PATTERN); point = matchstart; point += parse_string(1, FNAME_PATTERN, NULL); grab(find_group(FNAME_PAREN, 1), find_group(FNAME_PAREN, 0), file); bGrp = find_group(LINENO_PAREN, 1); eGrp = find_group(LINENO_PAREN, 0); if (bGrp < 0 || eGrp < 0) number[0] = '\0'; else grab(bGrp, eGrp, number); bGrp = find_group(COLUMN_PAREN, 1); eGrp = find_group(COLUMN_PAREN, 0); if (bGrp < 0 || eGrp < 0) column[0] = '\0'; else grab(bGrp, eGrp, column); absolute(file); bufname = orig; window_number = 0; do { if (!strcmp(filename, file)) orig_num = window_number; window_number++; } while (window_number); window_number = orig_num; find_it(file, strip_returns); num = strtoi(number, 10); if (num != 0) go_line(num); num = strtoi(column, 10); if (num != 0) point += num; }