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

📄 gettext.c

📁 举世闻名的joe记事本源程序
💻 C
字号:
/* JOE's gettext() library.  Why?  Once again we can not rely on the * system's or GNU's gettext being installed properly *//* One modification from standard gettext: comments are allowed at * the start of strings: "|comment|comment|comment|foo".  The leading * '|' is required to indicate the comment. * * Comments can be used to make two otherwise identical strings distinct. */#include "types.h"HASH *gettext_ht;unsigned char *ignore_prefix(unsigned char *set){	unsigned char *s = zrchr(set, '|');	if (s)		++s;	else		s = set;	return s;}unsigned char *my_gettext(unsigned char *s){	if (gettext_ht) {		unsigned char *r = htfind(gettext_ht, s);		if (r)			s = r;	}	if (s[0] == '|')		return ignore_prefix(s);	else		return s;}/* Load a .po file, convert entries to local character set and add them to * hash table */int load_po(FILE *f){	unsigned char buf[1024];	unsigned char msgid[1024];	unsigned char msgstr[1024];	unsigned char bf[8192];	struct charmap *po_map = locale_map;	int preload_flag = 0;	msgid[0] = 0;	msgstr[0] = 0;	while (preload_flag || fgets((char *)buf,sizeof(buf)-1,f)) {		unsigned char *p;		preload_flag = 0;		p = buf;		parse_ws(&p, '#');		if (!parse_field(&p, USTR "msgid")) {			int ofst = 0;			int len;			msgid[0] = 0;			parse_ws(&p, '#');			while ((len = parse_string(&p, msgid + ofst, sizeof(msgid)-ofst)) >= 0) {				preload_flag = 0;				ofst += len;				parse_ws(&p, '#');				if (!*p) {					if (fgets((char *)buf,sizeof(buf) - 1,f)) {						p = buf;						preload_flag = 1;						parse_ws(&p, '#');					} else {						goto bye;					}				}			}		} else if (!parse_field(&p, USTR "msgstr")) {			int ofst = 0;			int len;			msgstr[0] = 0;			parse_ws(&p, '#');			while ((len = parse_string(&p, msgstr + ofst, sizeof(msgstr)-ofst)) >= 0) {				preload_flag = 0;				ofst += len;				parse_ws(&p, '#');				if (!*p) {					if (fgets((char *)buf,sizeof(buf) - 1,f)) {						p = buf;						preload_flag = 1;						parse_ws(&p, '#');					} else {						break;					}				}			}			if (msgid[0] && msgstr[0]) {				/* Convert to locale character map */				my_iconv(bf,locale_map,msgstr,po_map);				/* Add to hash table */				htadd(gettext_ht, zdup(msgid), zdup(bf));			} else if (!msgid[0] && msgstr[0]) {				unsigned char *p = (unsigned char *)strstr((char *)msgstr, "charset=");				if (p) {					/* Copy character set name up to next delimiter */					int x;					p += sizeof("charset=") - 1;					while (*p == ' ' || *p == '\t') ++p;					for (x = 0; p[x] && p[x] !='\n' && p[x] != '\r' && p[x] != ' ' &&					            p[x] != '\t' && p[x] != ';' && p[x] != ','; ++x)					            msgid[x] = p[x];					msgid[x] = 0;					po_map = find_charmap(msgid);					if (!po_map)						po_map = locale_map;				}			}		}	}	bye:	fclose(f);	return 0;}/* Initialize my_gettext().  Call after locale_map has been set. */void init_gettext(unsigned char *s){	FILE *f;	unsigned char buf[1024];	joe_snprintf_2(buf, sizeof(buf), "%slang/%s.po",JOERC,s);	if ((f = fopen((char *)buf, "r"))) {		/* Try specific language, like en_GB */		gettext_ht = htmk(256);		load_po(f);	} else if (s[0] && s[1]) {		/* Try generic language, like en */		joe_snprintf_3(buf, sizeof(buf), "%slang/%c%c.po",JOERC,s[0],s[1]);		if ((f = fopen((char *)buf, "r"))) {			gettext_ht = htmk(256);			load_po(f);		}	}}

⌨️ 快捷键说明

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