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

📄 default.c

📁 一个很有名的浏览器
💻 C
字号:
/* Option system based mime backend *//* $Id: default.c,v 1.36.2.1 2004/12/26 18:59:09 jonas Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <string.h>#include "elinks.h"#include "config/options.h"#include "intl/gettext/libintl.h"#include "mime/backend/common.h"#include "mime/backend/default.h"#include "mime/mime.h"#include "modules/module.h"#include "osdep/osdep.h"		/* For get_system_str() */#include "terminal/terminal.h"#include "util/conv.h"#include "util/memory.h"#include "util/string.h"static struct option_info default_mime_options[] = {	INIT_OPT_TREE("mime", N_("MIME type associations"),		"type", OPT_AUTOCREATE,		N_("Handler <-> MIME type association. The first sub-tree is the MIME\n"		"class while the second sub-tree is the MIME type (ie. image/gif\n"		"handler will reside at mime.type.image.gif). Each MIME type option\n"		"should contain (case-sensitive) name of the MIME handler (its\n"		"properties are stored at mime.handler.<name>).")),	INIT_OPT_TREE("mime.type", NULL,		"_template_", OPT_AUTOCREATE,		N_("Handler matching this MIME-type class ('*' is used here in place\n"		"of '.').")),	INIT_OPT_STRING("mime.type._template_", NULL,		"_template_", 0, "",		N_("Handler matching this MIME-type name ('*' is used here in place\n"		"of '.').")),	INIT_OPT_TREE("mime", N_("File type handlers"),		"handler", OPT_AUTOCREATE,		N_("A file type handler is a set of information about how to use\n"		"an external program to view a file. It is possible to refer to it\n"		"for several MIME types -- e.g., you can define an 'image' handler\n"		"to which mime.type.image.png, mime.type.image.jpeg, and so on will\n"		"refer; or one might define a handler for a more specific type of file\n"		"-- e.g., PDF files.\n"		"Note you must define both a MIME handler and a MIME type association\n"		"for it to work.")),	INIT_OPT_TREE("mime.handler", NULL,		"_template_", OPT_AUTOCREATE,		N_("Description of this handler.")),	INIT_OPT_TREE("mime.handler._template_", NULL,		"_template_", 0,		N_("System-specific handler description (ie. unix, unix-xwin, ...).")),	INIT_OPT_BOOL("mime.handler._template_._template_", N_("Ask before opening"),		"ask", 0, 1,		N_("Ask before opening.")),	INIT_OPT_BOOL("mime.handler._template_._template_", N_("Block terminal"),		"block", 0, 1,		N_("Block the terminal when the handler is running.")),	INIT_OPT_STRING("mime.handler._template_._template_", N_("Program"),		"program", 0, "",		/* xgettext:no-c-format */		N_("External viewer for this file type. '%' in this string will be\n"		"substituted by a file name.")),	INIT_OPT_TREE("mime", N_("File extension associations"),		"extension", OPT_AUTOCREATE,		N_("Extension <-> MIME type association.")),	INIT_OPT_STRING("mime.extension", NULL,		"_template_", 0, "",		N_("MIME-type matching this file extension ('*' is used here in place\n"		"of '.').")),#define INIT_OPT_MIME_EXTENSION(extension, type) \	INIT_OPT_STRING("mime.extension", NULL, extension, 0, type, NULL)	INIT_OPT_MIME_EXTENSION("gif",	"image/gif"),	INIT_OPT_MIME_EXTENSION("jpg",	"image/jpg"),	INIT_OPT_MIME_EXTENSION("jpeg",	"image/jpeg"),	INIT_OPT_MIME_EXTENSION("png",	"image/png"),	INIT_OPT_MIME_EXTENSION("txt",	"text/plain"),	INIT_OPT_MIME_EXTENSION("htm",	"text/html"),	INIT_OPT_MIME_EXTENSION("html",	"text/html"),	NULL_OPTION_INFO,};static unsigned char *get_content_type_default(unsigned char *extension){	struct option *opt_tree;	struct option *opt;	unsigned char *extend = extension + strlen(extension) - 1;	if (extend < extension)	return NULL;	opt_tree = get_opt_rec_real(config_options, "mime.extension");	foreach (opt, *opt_tree->value.tree) {		unsigned char *namepos = opt->name + strlen(opt->name) - 1;		unsigned char *extpos = extend;		/* Match the longest possible part of URL.. */#define star2dot(achar)	((achar) == '*' ? '.' : (achar))		while (extension <= extpos && opt->name <= namepos		       && *extpos == star2dot(*namepos)) {			extpos--;			namepos--;		}#undef star2dot		/* If we matched whole extension and it is really an		 * extension.. */		if (namepos < opt->name		    && (extpos < extension || *extpos == '.'))			return stracpy(opt->value.string);	}	return NULL;}static unsigned char *get_mime_type_name(unsigned char *type){	struct string name;	int oldlength;	if (!init_string(&name)) return NULL;	add_to_string(&name, "mime.type.");	oldlength = name.length;	if (add_optname_to_string(&name, type, strlen(type))) {		unsigned char *pos = name.source + oldlength;		/* Search for end of the base type. */		pos = strchr(pos, '/');		if (pos) {			*pos = '.';			return name.source;		}	}	done_string(&name);	return NULL;}static inline unsigned char *get_mime_handler_name(unsigned char *type, int xwin){	struct option *opt;	unsigned char *name = get_mime_type_name(type);	if (!name) return NULL;	opt = get_opt_rec_real(config_options, name);	mem_free(name);	if (!opt) return NULL;	return straconcat("mime.handler.", opt->value.string,			  ".", get_system_str(xwin), NULL);}static struct mime_handler *get_mime_handler_default(unsigned char *type, int have_x){	struct option *opt_tree;	unsigned char *handler_name = get_mime_handler_name(type, have_x);	if (!handler_name) return NULL;	opt_tree = get_opt_rec_real(config_options, handler_name);	mem_free(handler_name);	if (opt_tree) {		unsigned char *desc = "";		unsigned char *mt = get_mime_type_name(type);		/* Try to find some description to assing to @name */		if (mt) {			struct option *opt;			opt = get_opt_rec_real(config_options, mt);			mem_free(mt);			if (opt) desc = opt->value.string;		}		return init_mime_handler(get_opt_str_tree(opt_tree, "program"),					 desc, default_mime_module.name,					 get_opt_bool_tree(opt_tree, "ask"),					 get_opt_bool_tree(opt_tree, "block"));	}	return NULL;}struct mime_backend default_mime_backend = {	/* get_content_type: */	get_content_type_default,	/* get_mime_handler: */	get_mime_handler_default,};struct module default_mime_module = struct_module(	/* name: */		N_("Option system"),	/* options: */		default_mime_options,	/* hooks: */		NULL,	/* submodules: */	NULL,	/* data: */		NULL,	/* init: */		NULL,	/* done: */		NULL);

⌨️ 快捷键说明

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