⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.c

📁 nedit 是一款linux下的开发源码的功能强大的编辑器
💻 C
📖 第 1 页 / 共 5 页
字号:
static const char CVSID[] = "$Id: search.c,v 1.59.2.1 2003/06/20 21:43:51 slobasso Exp $";/********************************************************************************									       ** search.c -- Nirvana Editor search and replace functions		       **									       ** Copyright (C) 1999 Mark Edel						       **									       ** This is free software; you can redistribute it and/or modify it under the    ** terms of the GNU General Public License as published by the Free Software    ** Foundation; either version 2 of the License, or (at your option) any later   ** version.							               ** 									       ** This software is distributed in the hope that it will be useful, but WITHOUT ** ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        ** FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License        ** for more details.							       ** 									       ** You should have received a copy of the GNU General Public License along with ** software; if not, write to the Free Software Foundation, Inc., 59 Temple     ** Place, Suite 330, Boston, MA  02111-1307 USA		                       **									       ** Nirvana Text Editor	    						       ** May 10, 1991								       **									       ** Written by Mark Edel							       **									       ********************************************************************************/#ifdef HAVE_CONFIG_H#include "../config.h"#endif#include "search.h"#include "regularExp.h"#include "textBuf.h"#include "text.h"#include "nedit.h"#include "server.h"#include "window.h" #include "preferences.h"#include "file.h"#include "highlight.h"#ifdef REPLACE_SCOPE#include "textDisp.h"#include "textP.h"#endif#include "../util/DialogF.h"#include "../util/misc.h"#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#ifdef VMS#include "../util/VMSparam.h"#else#ifndef __MVS__#include <sys/param.h>#endif#endif /*VMS*/#include <Xm/Xm.h>#include <X11/Shell.h>#include <Xm/XmP.h>#include <Xm/Form.h>#include <Xm/Label.h>#ifdef REPLACE_SCOPE#if XmVersion >= 1002#include <Xm/PrimitiveP.h>#endif#endif#include <Xm/PushB.h>#include <Xm/RowColumn.h>#include <Xm/Text.h>#include <Xm/ToggleB.h>#include <Xm/List.h>#include <X11/Xatom.h>		/* for getting selection */#include <X11/keysym.h>#include <X11/X.h>		/* " " */#ifdef HAVE_DEBUG_H#include "../debug.h"#endifint NHist = 0;typedef struct _SelectionInfo {    int done;    WindowInfo* window;    char* selection;} SelectionInfo;typedef struct {    int direction;    int searchType;    int searchWrap;} SearchSelectedCallData;/* History mechanism for search and replace strings */static char *SearchHistory[MAX_SEARCH_HISTORY];static char *ReplaceHistory[MAX_SEARCH_HISTORY];static int SearchTypeHistory[MAX_SEARCH_HISTORY];static int HistStart = 0;static int textFieldNonEmpty(Widget w);static void setTextField(WindowInfo* window, Time time, Widget textField);static void getSelectionCB(Widget w, SelectionInfo *selectionInfo, Atom *selection,	Atom *type, char *value, int *length, int *format);static void createReplaceDlog(Widget parent, WindowInfo *window);static void createFindDlog(Widget parent, WindowInfo *window);static void createReplaceMultiFileDlog(WindowInfo *window);static void fFocusCB(Widget w, WindowInfo *window, caddr_t *callData);static void rFocusCB(Widget w, WindowInfo *window, caddr_t *callData);static void rKeepCB(Widget w, WindowInfo *window, caddr_t *callData);static void fKeepCB(Widget w, WindowInfo *window, caddr_t *callData);static void replaceCB(Widget w, WindowInfo *window,	XmAnyCallbackStruct *callData); static void replaceAllCB(Widget w, WindowInfo *window,	XmAnyCallbackStruct *callData);static void rInSelCB(Widget w, WindowInfo *window,	XmAnyCallbackStruct *callData); static void rCancelCB(Widget w, WindowInfo *window, caddr_t callData);static void fCancelCB(Widget w, WindowInfo *window, caddr_t callData);static void rFindCB(Widget w,WindowInfo *window,XmAnyCallbackStruct *callData);static void rFindTextValueChangedCB(Widget w, WindowInfo *window, XKeyEvent *event);static void rFindArrowKeyCB(Widget w, WindowInfo *window, XKeyEvent *event);static void rSetActionButtons(WindowInfo* window,                              int replaceBtn,                              int replaceFindBtn,                              int replaceAndFindBtn,#ifndef REPLACE_SCOPE                              int replaceInWinBtn,                              int replaceInSelBtn,#endif                                    int replaceAllBtn);#ifdef REPLACE_SCOPEstatic void rScopeWinCB(Widget w, WindowInfo *window, 	XmAnyCallbackStruct *callData);static void rScopeSelCB(Widget w, WindowInfo *window, 	XmAnyCallbackStruct *callData);static void rScopeMultiCB(Widget w, WindowInfo *window, 	XmAnyCallbackStruct *callData);static void replaceAllScopeCB(Widget w, WindowInfo *window, 	XmAnyCallbackStruct *callData);#endifstatic void replaceArrowKeyCB(Widget w, WindowInfo *window, XKeyEvent *event);static void fUpdateActionButtons(WindowInfo *window);static void findTextValueChangedCB(Widget w, WindowInfo *window, XKeyEvent *event);static void findArrowKeyCB(Widget w, WindowInfo *window, XKeyEvent *event);static void replaceFindCB(Widget w, WindowInfo *window, XmAnyCallbackStruct *callData);static void findCB(Widget w, WindowInfo *window,XmAnyCallbackStruct *callData); static void replaceMultiFileCB(Widget w, WindowInfo *window,	XmAnyCallbackStruct *callData);static void rMultiFileReplaceCB(Widget w, WindowInfo *window,         XmAnyCallbackStruct * callData);static void rMultiFileCancelCB(Widget w, WindowInfo *window, caddr_t callData);static void rMultiFileSelectAllCB(Widget w, WindowInfo *window,        XmAnyCallbackStruct *callData);static void rMultiFileDeselectAllCB(Widget w, WindowInfo *window,        XmAnyCallbackStruct * callData);static void rMultiFilePathCB(Widget w, WindowInfo *window,  	XmAnyCallbackStruct *callData);static void uploadFileListItems(WindowInfo* window, Bool replace);static int countWindows(void);static int countWritableWindows(void);static void collectWritableWindows(WindowInfo* window);static void freeWritableWindowsCB(Widget* w, WindowInfo* window,                                  XmAnyCallbackStruct *callData);static void checkMultiReplaceListForDoomedW(WindowInfo* window,                                                      WindowInfo* doomedWindow);static void removeDoomedWindowFromList(WindowInfo* window, int index);static void unmanageReplaceDialogs(WindowInfo *window);static void flashTimeoutProc(XtPointer clientData, XtIntervalId *id);static void eraseFlash(WindowInfo *window);static int getReplaceDlogInfo(WindowInfo *window, int *direction,	char *searchString, char *replaceString, int *searchType);static int getFindDlogInfo(WindowInfo *window, int *direction,	char *searchString, int *searchType);static void selectedSearchCB(Widget w, XtPointer callData, Atom *selection,	Atom *type, char *value, int *length, int *format);static void iSearchTextActivateCB(Widget w, WindowInfo *window,	XmAnyCallbackStruct *callData);static void iSearchTextValueChangedCB(Widget w, WindowInfo *window,	XmAnyCallbackStruct *callData);static void iSearchTextKeyEH(Widget w, WindowInfo *window,	XKeyEvent *event, Boolean *continueDispatch);static int searchLiteral(const char *string, const char *searchString, int caseSense, 	int direction, int wrap, int beginPos, int *startPos, int *endPos,	int *searchExtentBW, int *searchExtentFW);static int searchLiteralWord(const char *string, const char *searchString, int caseSense, 	int direction, int wrap, int beginPos, int *startPos, int *endPos,         const char * delimiters);static int searchRegex(const char *string, const char *searchString, int direction,	int wrap, int beginPos, int *startPos, int *endPos, int *searchExtentBW,	int *searchExtentFW, const char *delimiters, int defaultFlags);static int forwardRegexSearch(const char *string, const char *searchString, int wrap,	int beginPos, int *startPos, int *endPos, int *searchExtentBW,        int *searchExtentFW, const char *delimiters, int defaultFlags);static int backwardRegexSearch(const char *string, const char *searchString, int wrap,	int beginPos, int *startPos, int *endPos, int *searchExtentBW,        int *searchExtentFW, const char *delimiters, int defaultFlags);static void upCaseString(char *outString, const char *inString);static void downCaseString(char *outString, const char *inString);static void resetFindTabGroup(WindowInfo *window);static void resetReplaceTabGroup(WindowInfo *window);static int searchMatchesSelection(WindowInfo *window, const char *searchString,	int searchType, int *left, int *right, int *searchExtentBW, 	int *searchExtentFW);static int findMatchingChar(WindowInfo *window, char toMatch,	void *toMatchStyle, int charPos, int startLimit, int endLimit, 	int *matchPos);static void replaceUsingRE(const char *searchStr, const char *replaceStr,	const char *sourceStr, int beginPos, char *destStr,         int maxDestLen, int prevChar, const char *delimiters, int defaultFlags);static void saveSearchHistory(const char *searchString,        const char *replaceString, int searchType, int isIncremental);static int historyIndex(int nCycles);static char *searchTypeArg(int searchType);static char *searchWrapArg(int searchWrap);static char *directionArg(int direction);static int isRegexType(int searchType);static int defaultRegexFlags(int searchType);static void findRegExpToggleCB(Widget w, XtPointer clientData, 	XtPointer callData);static void replaceRegExpToggleCB(Widget w, XtPointer clientData, 	XtPointer callData);static void iSearchRegExpToggleCB(Widget w, XtPointer clientData, 	XtPointer callData);static void findCaseToggleCB(Widget w, XtPointer clientData, 	XtPointer callData);static void replaceCaseToggleCB(Widget w, XtPointer clientData, 	XtPointer callData);static void iSearchCaseToggleCB(Widget w, XtPointer clientData, 	XtPointer callData);static void iSearchTryBeepOnWrap(WindowInfo *window, int direction,       	int beginPos, int startPos); static void iSearchRecordLastBeginPos(WindowInfo *window, int direction, 	int initPos); typedef struct _charMatchTable {    char c;    char match;    char direction;} charMatchTable;#define N_MATCH_CHARS 13#define N_FLASH_CHARS 6static charMatchTable MatchingChars[N_MATCH_CHARS] = {    {'{', '}', SEARCH_FORWARD},    {'}', '{', SEARCH_BACKWARD},    {'(', ')', SEARCH_FORWARD},    {')', '(', SEARCH_BACKWARD},    {'[', ']', SEARCH_FORWARD},    {']', '[', SEARCH_BACKWARD},    {'<', '>', SEARCH_FORWARD},    {'>', '<', SEARCH_BACKWARD},    {'/', '/', SEARCH_FORWARD},    {'"', '"', SEARCH_FORWARD},    {'\'', '\'', SEARCH_FORWARD},    {'`', '`', SEARCH_FORWARD},    {'\\', '\\', SEARCH_FORWARD},};/*** Definitions for the search method strings, used as arguments for ** macro search subroutines and search action routines*/static char *searchTypeStrings[] = {    "literal",          /* SEARCH_LITERAL         */    "case",             /* SEARCH_CASE_SENSE      */    "regex",            /* SEARCH_REGEX           */    "word",             /* SEARCH_LITERAL_WORD    */    "caseWord",         /* SEARCH_CASE_SENSE_WORD */    "regexNoCase",      /* SEARCH_REGEX_NOCASE    */    NULL};/*** Shared routine for replace and find dialogs and i-search bar to initialize** the state of the regex/case/word toggle buttons, and the sticky case ** sensitivity states.*/    static void initToggleButtons(int searchType, Widget regexToggle,                              Widget caseToggle, Widget* wordToggle,                              Bool* lastLiteralCase,                              Bool* lastRegexCase){    /* Set the initial search type and remember the corresponding case       sensitivity states in case sticky case sensitivity is required. */    switch (searchType) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -