//BEGIN SearchCommand bool SearchCommand::exec(class Kate::View *view, const TQString &cmd, TQString &msg) { TQString flags, pattern, replacement; if ( cmd.startsWith( "find" ) ) { static TQRegExp re_find("find(?::([bcersw]*))?\\s+(.+)"); if ( re_find.search( cmd ) < 0 ) { msg = i18n("Usage: find[:[bcersw]] PATTERN"); return false; } flags = re_find.cap( 1 ); pattern = re_find.cap( 2 ); } else if ( cmd.startsWith( "ifind" ) ) { static TQRegExp re_ifind("ifind(?::([bcrs]*))?\\s+(.*)"); if ( re_ifind.search( cmd ) < 0 ) { msg = i18n("Usage: ifind[:[bcrs]] PATTERN"); return false; } ifindClear(); return true; } else if ( cmd.startsWith( "replace" ) ) { // Try if the pattern and replacement is quoted, using a quote character ["'] static TQRegExp re_rep("replace(?::([bceprsw]*))?\\s+([\"'])((?:[^\\\\\\\\2]|\\\\.)*)\\2\\s+\\2((?:[^\\\\\\\\2]|\\\\.)*)\\2\\s*$"); // Or one quoted argument TQRegExp re_rep1("replace(?::([bceprsw]*))?\\s+([\"'])((?:[^\\\\\\\\2]|\\\\.)*)\\2\\s*$"); // Else, it's just one or two (space separated) words TQRegExp re_rep2("replace(?::([bceprsw]*))?\\s+(\\S+)(.*)"); #define unbackslash(s) p=0;\ while ( (p = pattern.find( '\\' + delim, p )) > -1 )\ {\ if ( !p || pattern[p-1] != '\\' )\ pattern.remove( p, 1 );\ p++;\ } if ( re_rep.search( cmd ) >= 0 ) { flags = re_rep.cap(1); pattern = re_rep.cap( 3 ); replacement = re_rep.cap( 4 ); int p(0); // unbackslash backslashed delimiter strings // in pattern .. TQString delim = re_rep.cap( 2 ); unbackslash(pattern); // .. and in replacement unbackslash(replacement); } else if ( re_rep1.search( cmd ) >= 0 ) { flags = re_rep1.cap(1); pattern = re_rep1.cap( 3 ); int p(0); TQString delim = re_rep1.cap( 2 ); unbackslash(pattern); } else if ( re_rep2.search( cmd ) >= 0 ) { flags = re_rep2.cap( 1 ); pattern = re_rep2.cap( 2 ); replacement = TQString(re_rep2.cap( 3 )).stripWhiteSpace(); } else { msg = i18n("Usage: replace[:[bceprsw]] PATTERN [REPLACEMENT]"); return false; } kdDebug()<<"replace '"<<pattern<<"' with '"<<replacement<<"'"<<endl; #undef unbackslash } long f = 0; if ( flags.contains( 'b' ) ) f |= KFindDialog::FindBackwards; if ( flags.contains( 'c' ) ) f |= KFindDialog::FromCursor; if ( flags.contains( 'e' ) ) f |= KFindDialog::SelectedText; if ( flags.contains( 'r' ) ) f |= KFindDialog::RegularExpression; if ( flags.contains( 'p' ) ) f |= KReplaceDialog::PromptOnReplace; if ( flags.contains( 's' ) ) f |= KFindDialog::CaseSensitive; if ( flags.contains( 'w' ) ) f |= KFindDialog::WholeWordsOnly; if ( cmd.startsWith( "find" ) ) { ((KateView*)view)->find( pattern, f ); return true; } else if ( cmd.startsWith( "replace" ) ) { f |= KReplaceDialog::BackReference; // mandatory here? ((KateView*)view)->replace( pattern, replacement, f ); return true; } return false; }
int odftread() { if (Already_read) return(0); Already_read = TRUE; if (!Vflag) { /* * table is hard-coded for "FACE" FMLI */ register int i; for (i = 0; i < MAXODFT && FMLI_detab[i].objtype[0] != '\0';i++) Detab[i] = FMLI_detab[i]; Detab[i].objtype[0] = '\0'; } else { register int i, moffset; char *p, *q, buf[PATHSIZ]; char *b; char *tmpstr; FILE *fp; int offset = 0, magic; long magic_offset[MAXMAGIC+1]; char magic_bytes[MAXMAGIC]; char *get_skip(); char *tab_parse(); long tab_long(); p = expand("$OASYS/info/OH/externals/detect.tab"); fp = fopen(p, "r"); free(p); if (fp == NULL) fatal(MISSING, "detect.tab"); tmpstr = NULL; while (get_skip(buf, PATHSIZ, fp) != NULL) { /* flush optional line number */ for (b = buf; *b == '\t' || isdigit(*b); b++) ; b = tab_parse(&tmpstr, b); strncpy(Detab[offset].objtype, tmpstr, OTYPESIZ); if (b) { char *unbackslash(); b = tab_parse(&Detab[offset].defodi, b); p = unbackslash(Detab[offset].defodi); if (p[0] == '"') memshift(p, p + 1, strlen(p)); p += strlen(p) - 1; if (p[0] == '"') p[0] = '\0'; } Detab[offset].defmask = tab_long(&b, 16); if (b && *b) Detab[offset].func_type = tab_long(&b, 16); else { #ifdef _DEBUG _debug(stderr, "BAD ODFT '%s'\n", Detab[offset].objtype); #endif error(MUNGED, "heuristics table"); continue; } switch (Detab[offset].func_type) { case F_INT: Detab[offset].intern_func = tab_long(&b, 0); break; case F_SHELL: case F_EXEC: b = tab_parse(&tmpstr, b); Detab[offset].extern_func = tmpstr; tmpstr = NULL; break; case F_PARTS: case F_DPARTS: break; case F_MAGIC: p = b; magic = 0; while (*p && magic < MAXMAGIC) { moffset = strtol(p, &q, 0); if (p == q) /* strtol failed */ break; p = q; while (*q && isspace(*q)) q++; if (*q == '"') { q++; while (*q && *q != '"' && magic < MAXMAGIC-1) { magic_bytes[magic] = *q; magic_offset[magic] = moffset++; magic++; q++; } if (*q) q++; } else { magic_offset[magic] = moffset; magic_bytes[magic] = (char) strtol(p,&q,0); if (p == q) { p = '\0'; break; } else p = q; magic++; } } if (magic == 0) { #ifdef _DEBUG _debug(stderr, "BAD ODFT '%s' MAGIC: %s\n", Detab[offset].objtype, q); #endif error(MUNGED, "heuristics magic number"); continue; } magic_offset[magic] = -1L; /* for efficiency, the most common magic number * case, 0, 1, -1, is coded up. */ if (magic == 2 && magic_offset[0] == 0L && magic_offset[1] == 1L) { Detab[offset].magic_offset = &(Normal_mag_offset[0]); } else { Detab[offset].magic_offset = (long *)calloc(magic+1, sizeof(long)); for (i = 0; i < magic+1; i++) Detab[offset].magic_offset[i] = magic_offset[i]; } Detab[offset].magic_bytes = calloc(magic, sizeof(char)); for (i = 0; i < magic; i++) Detab[offset].magic_bytes[i] = magic_bytes[i]; break; default: #ifdef _DEBUG _debug(stderr, "ODFT '%s' BAD FUNCTION: %d\n", Detab[offset].objtype, Detab[offset].func_type); #endif error(MUNGED, "heuristics table function"); continue; } offset++; } fclose(fp); Detab[offset].objtype[0] = '\0'; if (tmpstr) free(tmpstr); } return(0); }