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

📄 ext.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:
 * If action == NULL, it returns NULL if there are no user defined commands
 * or an allocated space separated list of user defined Actions.
 *
 * If action == "Icon", we are doing again something special. We return
 * icon name and we set the variable regex_command_title to Title for
 * that icon.
 *
 * If action == "View" then a parameter is checked in the form of "View:%d",
 * if the value for %d exists, then the viewer is started up at that line number.
 */
char *regex_command_title = NULL;
char *regex_command (char *filename, char *action, char **drops, int *move_dir)
{
    char *extension_file;
    char *p, *q, *r, c;
    char *buffer;
    int  file_len = strlen (filename);
    int found = 0;
    char content_string [2048];
    int content_shift = 0;
    char *to_return = NULL;
    int old_patterns;
    struct stat mystat;
    int asked_file;
    int view_at_line_number;
    char *include_target;
    int include_target_len;

#ifdef FILE_STDIN
    int file_supports_stdin = 1;
#else
    int file_supports_stdin = 0;
#endif

    /* Check for the special View:%d parameter */
    if (action && strncmp (action, "View:", 5) == 0){
	view_at_line_number = atoi (action + 5);
	action [4] = 0;
    } else {
	view_at_line_number = 0;
    }
    /* Have we asked file for the file contents? */
    asked_file = 0;

    if (data == NULL) {
        int home_error = 0;

        buffer = concat_dir_and_file (home_dir, MC_USER_EXT);
    	if (exist_file (buffer))
	    extension_file = buffer;
        else
check_stock_mc_ext:
	    extension_file = concat_dir_and_file (mc_home, MC_LIB_EXT);
        if ((data = load_file (extension_file)) == NULL) {
	    free (buffer);
	    return 0;
	}
	if (!strstr (data, "default/")) {
	    if (!strstr (data, "regex/") && !strstr (data, "shell/") &&
	        !strstr (data, "type/")) {
	        free (data);
	        data = NULL;
	        if (extension_file == buffer) {
		    home_error = 1;
		    goto check_stock_mc_ext;
	        } else {
                    char *msg;
                    char *msg2;
                    msg = copy_strings(" ", mc_home, MC_LIB_EXT, _(" file error"), NULL);
                    msg2 = copy_strings(_("Format of the "),
                                         mc_home,
("mc.ext file has changed\n\
with version 3.0. It seems that installation\n\
failed. Please fetch a fresh new copy from the\n\
Midnight Commander package or in case you don't\n\
have any, get it from ftp://ftp.nuclecu.unam.mx."), 0);
	            message (1, msg, msg2);
                    free (msg);
                    free (msg2);
		    free (buffer);
		    return 0;
	        }
	    }
	}
	if (home_error) {
            char *msg;
            char *msg2;
            msg = copy_strings(" ~/", MC_USER_EXT, _(" file error "), NULL);
            msg2 = copy_strings(_("Format of the ~/"), MC_USER_EXT, _(" file has changed\n\
with version 3.0. You may want either to\n\
copy it from "), mc_home, _("mc.ext or use that\n\
file as an example of how to write it.\n\
"), mc_home,  _("mc.ext will be used for this moment."), 0);
	    message (1, msg, msg2);
            free (msg);
            free (msg2);
        }
        free (buffer);
    }
    mc_stat (filename, &mystat);

    if (regex_command_title){
	free (regex_command_title);
	regex_command_title = NULL;
    }
    old_patterns = easy_patterns;
    easy_patterns = 0; /* Real regular expressions are needed :) */
    include_target = NULL;
    for (p = data; *p; p++) {
    	for (q = p; *q == ' ' || *q == '\t'; q++)
		;
    	if (*q == '\n' || !*q)
    	    p = q; /* empty line */
    	if (*p == '#') /* comment */
    	    while (*p && *p != '\n')
    	    	p++;
	if (*p == '\n')
	    continue;
	if (!*p)
	    break;
	if (p == q) { /* i.e. starts in the first column, should be
	               * keyword/descNL
	               */
	    if (found && action == NULL) /* We have already accumulated all
	    				  * the user actions
	    				  */
	        break;
	    found = 0;
	    q = strchr (p, '\n');
	    if (q == NULL)
	        q = strchr (p, 0);
	    c = *q;
	    *q = 0;
	    if (include_target){
		if ((strncmp (p, "include/", 8) == 0) &&
		    (strncmp (p+8, include_target, include_target_len) == 0))
		    found = 1;
	    } else if (!strncmp (p, "regex/", 6)) {
	        p += 6;
	        /* Do not transform shell patterns, you can use shell/ for
	         * that
	         */
	        if (regexp_match (p, filename, match_normal))
	            found = 1;
	    } else if (!strncmp (p, "directory/", 10)) {
	        if (S_ISDIR (mystat.st_mode) && regexp_match (p+10, filename, match_normal))
	            found = 1;
	    } else if (!strncmp (p, "shell/", 6)) {
	        p += 6;
	        if (*p == '.') {
	            if (!strncmp (p, filename + file_len - (q - p),
	                q - p))
	                found = 1;
	        } else {
	            if (q - p == file_len && !strncmp (p, filename, q - p))
	                found = 1;
	        }
	    } else if (!strncmp (p, "type/", 5)) {
		int islocal = vfs_file_is_local (filename);
	        p += 5;

	        if (islocal || file_supports_stdin) {
	    	    char *pp;
	    	    int hasread = use_file_to_check_type;

		    if (asked_file || !use_file_to_check_type)
			goto match_file_output;

		    hasread = 0;
	    	    if (islocal) {
			char *tmp = name_quote (filename, 0);
	    	        char *command =
			    copy_strings (FILE_CMD, tmp, NULL);
	    	        FILE *f = popen (command, "r");

			free (tmp);
	    	        free (command);
	    	        if (f != NULL) {
	    	            hasread = (fgets (content_string, 2047, f)
	    	                != NULL);
	    	    	    if (!hasread)
	    	    	        content_string [0] = 0;
	    	    	    pclose (f);
#ifdef SCO_FLAVOR
	    	    	    /*
	    	    	    **	SCO 3.2 does has a buggy pclose(), so
	    	    	    **	<command> become zombie (alex)
	    	    	    */
	    	    	    waitpid(-1,NULL,WNOHANG);
#endif /* SCO_FLAVOR */
	    	        }
	    	    } else {
#ifdef _OS_NT
			message (1, " Win32 ", " Unimplemented file prediction ");
#else
	    	        int pipehandle, remotehandle;
	    	        pid_t p;

	    	        remotehandle = mc_open (filename, O_RDONLY);
		        if (remotehandle != -1) {
		        /* 8192 is HOWMANY hardcoded value in the file-3.14
		         * sources. Tell me if any other file uses larger
		         * chunk from beginning
		         */
	    	            pipehandle = mc_doublepopen
			    (remotehandle, 8192, &p,"file", "file", "-", NULL);
			    if (pipehandle != -1) {
	    	                int i;
	    	                while ((i = read (pipehandle, content_string
	    	                     + hasread, 2047 - hasread)) > 0)
	    	                    hasread += i;
	    	    	        mc_doublepclose (pipehandle, p);
	    	    	        content_string [hasread] = 0;
	    	            }
	    	            mc_close (remotehandle);
	    	        }
#endif /* _OS_NT */
	    	    }
		    asked_file = 1;
match_file_output:
	    	    if (hasread) {
	    	        if ((pp = strchr (content_string, '\n')) != 0)
	    	    	    *pp = 0;
	    	        if (islocal && !strncmp (content_string,
	    	            filename, file_len)) {
	    	    	    content_shift = file_len;
	    	    	    if (content_string [content_shift] == ':')
	    	    	        for (content_shift++;
	    	    	            content_string [content_shift] == ' ';
	    	    	            content_shift++);
	    	        } else if (!islocal
				   && !strncmp (content_string,
						"standard input:", 15)) {
	    	            for (content_shift = 15;
	    	                content_string [content_shift] == ' ';
	    	                content_shift++);
	    	        }
	    		if (content_string &&
	    		    regexp_match (p, content_string +
	    		        content_shift, match_normal)){
	    		    found = 1;
	    		}
	    	    }
	        }
	    } else if (!strncmp (p, "default/", 8)) {
	        p += 8;
	        found = 1;
	    }
	    *q = c;
	    p = q;
	    if (!*p)
	        break;
    	} else { /* List of actions */
    	    p = q;
    	    q = strchr (p, '\n');
    	    if (q == NULL)
    	        q = strchr (p, 0);
    	    if (found) {
    	        r = strchr (p, '=');
    	        if (r != NULL) {
    	            c = *r;
    	            *r = 0;
		    if (strcmp (p, "Include") == 0){
			char *t;

			include_target = p + 8;
			t = strchr (include_target, '\n');
			if (t) *t = 0;
			include_target_len = strlen (include_target);
			if (t) *t = '\n';

			*r = c;
			p = q;
			found = 0;

			if (!*p)
			    break;
			continue;
		    }
    	            if (action == NULL) {
    	                if (strcmp (p, "Open") &&
    	                    strcmp (p, "View") &&
    	                    strcmp (p, "Edit") &&
    	                    strcmp (p, "Drop") &&
    	                    strcmp (p, "Icon") &&
			    strcmp (p, "Include") &&
    	                    strcmp (p, "Title")) {
    	                    /* I.e. this is a name of a user defined action */
    	                        static char *q;

    	                        if (to_return == NULL) {
    	                            to_return = xmalloc (512, "Action list");
    	                            q = to_return;
    	                        } else
    	                            *(q++) = '='; /* Mark separator */
    	                        strcpy (q, p);
    	                        q = strchr (q, 0);
    	                }
    	                *r = c;
    	            } else if (!strcmp (action, "Icon")) {
    	                if (!strcmp (p, "Icon") && to_return == NULL) {
    	            	    *r = c;
    	            	    c = *q;
    	            	    *q = 0;
    	                    to_return = strdup (r + 1);
    	                } else if (!strcmp (p, "Title") && regex_command_title == NULL) {
    	            	    *r = c;
    	            	    c = *q;
    	            	    *q = 0;
    	                    regex_command_title = strdup (r + 1);
    	                } else {
    	                    *r = c;
    	                    c = *q;
    	                }
    	                *q = c;
    	                if (to_return != NULL && regex_command_title != NULL)
    	                    break;
    	            } else if (!strcmp (action, p)) {
    	                *r = c;
    	                for (p = r + 1; *p == ' ' || *p == '\t'; p++)
			    ;

			/* Empty commands just stop searching
			 * through, they don't do anything
			 *
			 * We need to copy the filename because exec_extension
			 * may end up invoking update_panels thus making the
			 * filename parameter invalid (ie, most of the time,
			 * we get filename as a pointer from cpanel->dir).
			 */
    	                if (p < q) {
			    char *filename_copy = strdup (filename);
			    exec_extension (filename_copy, r + 1, drops, move_dir, view_at_line_number);
			    free (filename_copy);

    	                    to_return = "Success";
    	                }
    	                break;
    	            } else
    	            	*r = c;
    	        }
    	    }
    	    p = q;
    	    if (!*p)
    	        break;
    	}
    }
    easy_patterns = old_patterns;
    return to_return;
}

⌨️ 快捷键说明

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