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

📄 types.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 3 页
字号:
/* types.c * (c) 2002 Mikulas Patocka * This file is a part of the Links program, released under GPL. */#include "links.h"/*------------------------ ASSOCIATIONS -----------------------*//* DECLARATIONS */void assoc_edit_item(struct dialog_data *,void *,void (*)(struct dialog_data *,void *,void *,struct list_description *),void *, unsigned char);void assoc_copy_item(void *, void *);void *assoc_default_value(struct session*, unsigned char);void *assoc_new_item(void *);void assoc_delete_item(void *);void *assoc_find_item(void *start, unsigned char *str, int direction);unsigned char *assoc_type_item(struct terminal *, void *, int);void assoc_edit_item_fn(struct dialog_data *);void assoc_edit_done(void *);void assoc_edit_abort(struct dialog_data *);void ext_edit_item_fn(struct dialog_data *);void ext_edit_done(void *);void ext_edit_abort(struct dialog_data *);int is_in_list(unsigned char *, unsigned char *, int);unsigned char *get_content_type_by_extension(unsigned char *url);unsigned char *get_extension_by_content_type(unsigned char *ct);unsigned char *get_filename_from_header(unsigned char *head);struct list assoc={&assoc,&assoc,0,-1,NULL};struct history assoc_search_history = { 0, { &assoc_search_history.items, &assoc_search_history.items } };struct assoc_ok_struct{	void (*fn)(struct dialog_data *,void *,void *,struct list_description *);	void *data;		struct dialog_data *dlg;};struct list_description assoc_ld={	0,  /* 0= flat; 1=tree */	&assoc,  /* list */	assoc_new_item,	assoc_edit_item,	assoc_default_value,	assoc_delete_item,	assoc_copy_item,	assoc_type_item,	assoc_find_item,	&assoc_search_history,	0,		/* this is set in init_assoc function */	50,  /* width of main window */	10,  /* # of items in main window */	T_ASSOCIATION,	T_ASSOCIATIONS_ALREADY_IN_USE,	T_ASSOCIATIONS_MANAGER,	T_DELETE_ASSOCIATION,	0,	/* no button */	NULL,	/* no button */	0,0,0,0,  /* internal vars */	0, /* modified */	NULL,	NULL,	1,};void *assoc_default_value(struct session* ses, unsigned char type){	type=type;	ses=ses;	return NULL;}void *assoc_new_item(void *ignore){	struct assoc *new;	ignore=ignore;	new = mem_calloc(sizeof(struct assoc));	new->label = stracpy("");	new->ct = stracpy("");	new->prog = stracpy("");	new->block = new->xwin = new->cons = 1;	new->ask = 1;	new->accept_http = 0;	new->accept_ftp = 0;	new->type = 0;	new->system = SYSTEM_ID;	return new;}void assoc_delete_item(void *data){	struct assoc *del=(struct assoc *)data;	struct assoc *next=del->next;	struct assoc *prev=del->prev;	if (del->label)mem_free(del->label);	if (del->ct)mem_free(del->ct);	if (del->prog)mem_free(del->prog);	if (next)next->prev=del->prev;	if (prev)prev->next=del->next;	mem_free(del);}void assoc_copy_item(void *in, void *out){	struct assoc *item_in=(struct assoc *)in;	struct assoc *item_out=(struct assoc *)out;	item_out->cons=item_in->cons;	item_out->xwin=item_in->xwin;	item_out->block=item_in->block;	item_out->ask=item_in->ask;	item_out->accept_http=item_in->accept_http;	item_out->accept_ftp=item_in->accept_ftp;	item_out->system=item_in->system;	if (item_out->label)mem_free(item_out->label);	if (item_out->ct)mem_free(item_out->ct);	if (item_out->prog)mem_free(item_out->prog);	item_out->label=stracpy(item_in->label);	item_out->ct=stracpy(item_in->ct);	item_out->prog=stracpy(item_in->prog);}/* allocate string and print association into it *//* x: 0=type all, 1=type title only */unsigned char *assoc_type_item(struct terminal *term, void *data, int x){	unsigned char *txt, *txt1;	struct conv_table *table;	struct assoc* item=(struct assoc*)data;	if ((struct list*)item==(&assoc))return stracpy(_(TEXT(T_ASSOCIATIONS),term));	txt=stracpy("");	if (item->system != SYSTEM_ID) add_to_strn(&txt, "XX ");	add_to_strn(&txt, item->label);	if (item->ct){add_to_strn(&txt,": ");add_to_strn(&txt,item->ct);}	if (!x)	{		add_to_strn(&txt," -> ");		if (item->prog)add_to_strn(&txt,item->prog);	}	table=get_translation_table(assoc_ld.codepage,term->spec->charset);	txt1=convert_string(table,txt,strlen(txt),NULL);	mem_free(txt);				return txt1;}void menu_assoc_manager(struct terminal *term,void *fcp,struct session *ses){	create_list_window(&assoc_ld,&assoc,term,ses);}unsigned char *ct_msg[] = {	TEXT(T_LABEL),	TEXT(T_CONTENT_TYPES),	TEXT(T_PROGRAM__IS_REPLACED_WITH_FILE_NAME),#ifdef ASSOC_BLOCK	TEXT(T_BLOCK_TERMINAL_WHILE_PROGRAM_RUNNING),#endif#ifdef ASSOC_CONS_XWIN	TEXT(T_RUN_ON_TERMINAL),	TEXT(T_RUN_IN_XWINDOW),#endif	TEXT(T_ASK_BEFORE_OPENING),	TEXT(T_ACCEPT_HTTP),	TEXT(T_ACCEPT_FTP),};void assoc_edit_item_fn(struct dialog_data *dlg){	struct terminal *term = dlg->win->term;	int max = 0, min = 0;	int w, rw;	int y = gf_val(-1, -G_BFU_FONT_SIZE);	int p = 3;	if (dlg->win->term->spec->braille) y += gf_val(1, G_BFU_FONT_SIZE);#ifdef ASSOC_BLOCK	p++;#endif#ifdef ASSOC_CONS_XWIN	p += 2;#endif	max_text_width(term, ct_msg[0], &max, AL_LEFT);	min_text_width(term, ct_msg[0], &min, AL_LEFT);	max_text_width(term, ct_msg[1], &max, AL_LEFT);	min_text_width(term, ct_msg[1], &min, AL_LEFT);	max_text_width(term, ct_msg[2], &max, AL_LEFT);	min_text_width(term, ct_msg[2], &min, AL_LEFT);	max_group_width(term, ct_msg + 3, dlg->items + 3, p, &max);	min_group_width(term, ct_msg + 3, dlg->items + 3, p, &min);	max_buttons_width(term, dlg->items + 3 + p, 2, &max);	min_buttons_width(term, dlg->items + 3 + p, 2, &min);	w = term->x * 9 / 10 - 2 * DIALOG_LB;	if (w > max) w = max;	if (w < min) w = min;	if (w > term->x - 2 * DIALOG_LB) w = term->x - 2 * DIALOG_LB;	if (w < 1) w = 1;	rw = 0;	dlg_format_text_and_field(dlg, NULL, _(ct_msg[0], term), &dlg->items[0], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT);	y += gf_val(1, G_BFU_FONT_SIZE * 1);	dlg_format_text_and_field(dlg, NULL, _(ct_msg[1], term), &dlg->items[1], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT);	y += gf_val(1, G_BFU_FONT_SIZE * 1);	dlg_format_text_and_field(dlg, NULL, _(ct_msg[2], term), &dlg->items[2], 0, &y, w, &rw, COLOR_DIALOG_TEXT, AL_LEFT);	y += gf_val(1, G_BFU_FONT_SIZE * 1);	dlg_format_group(dlg, NULL, ct_msg + 3, dlg->items + 3, p, 0, &y, w, &rw);	y += gf_val(1, G_BFU_FONT_SIZE);	dlg_format_buttons(dlg, NULL, dlg->items + 3 + p, 2, 0, &y, w, &rw, AL_CENTER);	w = rw;	dlg->xw = w + 2 * DIALOG_LB;	dlg->yw = y + 2 * DIALOG_TB;	center_dlg(dlg);	draw_dlg(dlg);	y = dlg->y + DIALOG_TB;	if (dlg->win->term->spec->braille) y += gf_val(1, G_BFU_FONT_SIZE);	dlg_format_text_and_field(dlg, term, ct_msg[0], &dlg->items[0], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT);	y += gf_val(1, G_BFU_FONT_SIZE);	dlg_format_text_and_field(dlg, term, ct_msg[1], &dlg->items[1], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT);	y += gf_val(1, G_BFU_FONT_SIZE);	dlg_format_text_and_field(dlg, term, ct_msg[2], &dlg->items[2], dlg->x + DIALOG_LB, &y, w, NULL, COLOR_DIALOG_TEXT, AL_LEFT);	y += gf_val(1, G_BFU_FONT_SIZE);	dlg_format_group(dlg, term, ct_msg + 3, &dlg->items[3], p, dlg->x + DIALOG_LB, &y, w, NULL);	y += gf_val(1, G_BFU_FONT_SIZE);	dlg_format_buttons(dlg, term, &dlg->items[3 + p], 2, dlg->x + DIALOG_LB, &y, w, NULL, AL_CENTER);}/* Puts url and title into the bookmark item */void assoc_edit_done(void *data){	struct dialog *d=(struct dialog*)data;	struct assoc *item=(struct assoc *)d->udata;	struct assoc_ok_struct* s=(struct assoc_ok_struct*)d->udata2;	unsigned char *txt;	struct conv_table *table;	unsigned char *label, *ct, *prog;	label=(unsigned char *)&d->items[12];	ct=label+MAX_STR_LEN;	prog=ct+MAX_STR_LEN;	table=get_translation_table(s->dlg->win->term->spec->charset,assoc_ld.codepage);	txt=convert_string(table,label,strlen(label),NULL);	mem_free(item->label); item->label=txt;	txt=convert_string(table,ct,strlen(ct),NULL);	mem_free(item->ct); item->ct=txt;	txt=convert_string(table,prog,strlen(prog),NULL);	mem_free(item->prog); item->prog=txt;	s->fn(s->dlg,s->data,item,&assoc_ld);	d->udata=0;  /* for abort function */}/* destroys an item, this function is called when edit window is aborted */void assoc_edit_abort(struct dialog_data *data){	struct assoc *item=(struct assoc*)data->dlg->udata;	struct dialog *dlg=data->dlg;	mem_free(dlg->udata2);	if (item)assoc_delete_item(item);}void assoc_edit_item(struct dialog_data *dlg, void *data, void (*ok_fn)(struct dialog_data *, void *, void *, struct list_description *), void *ok_arg, unsigned char dlg_title){	int p;	struct assoc *new=(struct assoc*)data;	struct terminal *term=dlg->win->term;	struct dialog *d;	struct assoc_ok_struct *s;	unsigned char *ct, *prog, *label;	d = mem_calloc(sizeof(struct dialog) + 12 * sizeof(struct dialog_item) + 3 * MAX_STR_LEN);	label=(unsigned char *)&d->items[12];	ct=label+MAX_STR_LEN;	prog=ct+MAX_STR_LEN;	if (new->label)strncpy(label,new->label,MAX_STR_LEN);	if (new->ct)strncpy(ct,new->ct,MAX_STR_LEN);	if (new->prog)strncpy(prog,new->prog,MAX_STR_LEN);		/* Create the dialog */	s=mem_alloc(sizeof(struct assoc_ok_struct));	s->fn=ok_fn;	s->data=ok_arg;	s->dlg=dlg;			switch (dlg_title)	{		case TITLE_EDIT:		d->title=TEXT(T_EDIT_ASSOCIATION);		break;		case TITLE_ADD:		d->title=TEXT(T_ADD_ASSOCIATION);		break;		default:		internal("Unsupported dialog title.\n");	}	d->udata=data;	d->udata2=s;	d->fn = assoc_edit_item_fn;	d->abort=assoc_edit_abort;	d->refresh=assoc_edit_done;	d->refresh_data = d;	d->items[0].type = D_FIELD;	d->items[0].dlen = MAX_STR_LEN;	d->items[0].data = label;	d->items[0].fn = check_nonempty;	d->items[1].type = D_FIELD;	d->items[1].dlen = MAX_STR_LEN;	d->items[1].data = ct;	d->items[1].fn = check_nonempty;	d->items[2].type = D_FIELD;	d->items[2].dlen = MAX_STR_LEN;	d->items[2].data = prog;	d->items[2].fn = check_nonempty;	p = 3;#ifdef ASSOC_BLOCK	d->items[p].type = D_CHECKBOX;	d->items[p].data = (unsigned char *)&new->block;	d->items[p++].dlen = sizeof(int);#endif#ifdef ASSOC_CONS_XWIN	d->items[p].type = D_CHECKBOX;	d->items[p].data = (unsigned char *)&new->cons;	d->items[p++].dlen = sizeof(int);	d->items[p].type = D_CHECKBOX;	d->items[p].data = (unsigned char *)&new->xwin;	d->items[p++].dlen = sizeof(int);#endif	d->items[p].type = D_CHECKBOX;	d->items[p].data = (unsigned char *)&new->ask;	d->items[p++].dlen = sizeof(int);	d->items[p].type = D_CHECKBOX;	d->items[p].data = (unsigned char *)&new->accept_http;	d->items[p++].dlen = sizeof(int);	d->items[p].type = D_CHECKBOX;	d->items[p].data = (unsigned char *)&new->accept_ftp;	d->items[p++].dlen = sizeof(int);	d->items[p].type = D_BUTTON;	d->items[p].gid = B_ENTER;	d->items[p].fn = ok_dialog;	d->items[p++].text = TEXT(T_OK);	d->items[p].type = D_BUTTON;	d->items[p].gid = B_ESC;	d->items[p].text = TEXT(T_CANCEL);	d->items[p++].fn = cancel_dialog;	d->items[p++].type = D_END;	do_dialog(term, d, getml(d, NULL));}void *assoc_find_item(void *start, unsigned char *str, int direction){	struct assoc *a,*s=(struct assoc *)start;		if (direction==1)	{		for (a=s->next; a!=s; a=a->next)			if (a->depth>-1)			{				if (a->label && casestrstr(a->label,str)) return a;				if (a->ct && casestrstr(a->ct,str)) return a;

⌨️ 快捷键说明

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