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

📄 listfonts.c

📁 Nxlib,一个模拟xlib的程序。使用microwindows的库来运行需要xlib支持的程序。
💻 C
字号:
#include "nxlib.h"#include <stdlib.h>#include <string.h>struct _list {	char **list;	int alloc;	int used;	struct _list *next;};static struct _list *g_fontlist = 0;static struct _list *_createFontList(void){	struct _list *ptr;	if (!g_fontlist)		ptr = g_fontlist =			(struct _list *)Xcalloc(sizeof(struct _list), 1);	else {		struct _list *t;		for (t = g_fontlist; t->next; t = t->next)			continue;		ptr = t->next =			(struct _list *)Xcalloc(sizeof(struct _list), 1);	}	return ptr;}static int_addFontToList(struct _list *list, char *font){	if (list->alloc == 0) {		list->list = Xmalloc(5 * sizeof(char *));		list->alloc = 5;	} else if (list->used == list->alloc) {		list->list = Xrealloc(list->list,				(list->alloc + 5) * sizeof(char *));		list->alloc += 5;	}	list->list[list->used++] = strdup(font);	return list->used;}static char **_getFontList(struct _list *list, int *size){	if (!list->list) {		*size = 0;		return 0;	}	if (list->alloc != list->used)		list->list =			Xrealloc(list->list, (list->used) * sizeof(char *));	*size = list->used;	return list->list;}static void_freeFontList(char **fontlist){	struct _list *ptr = g_fontlist;	struct _list *prev = 0;	if (!fontlist)		return;	while (ptr) {		if (ptr->list == fontlist) {			int i;			for (i = 0; i < ptr->used; i++)				Xfree(ptr->list[i]);			Xfree(ptr->list);			if (ptr == g_fontlist)				g_fontlist = ptr->next;			else				prev->next = ptr->next;			return;		}		prev = ptr;		ptr = ptr->next;	}}#if 1static intdashcount(char *name){	int	ndashes = 0;	while (*name)		if (*name++ == '-')			++ndashes;	return ndashes;}static intpatternmatch(char *pat, int patdashes, char *string, int stringdashes){	int c, t;	if (stringdashes < patdashes)		return 0;	for (;;) {	    switch (c = *pat++) {	    case '*':		if (!(c = *pat++))			return 1;		if (c == '-') {			patdashes--;			for (;;) {				while ((t = *string++) != '-')					if (!t)						return 0;				stringdashes--;				if (patternmatch(pat, patdashes, string, stringdashes))					return 1;				if (stringdashes == patdashes)					return 0;			}		} else {			for (;;) {				while ((t = *string++) != c) {					if (!t)						return 0;					if (t == '-') {						if (stringdashes-- < patdashes)							return 0;					}				}				if (patternmatch(pat, patdashes, string, stringdashes))					return 1;			}		}	    case '?':		if (*string++ == '-')			stringdashes--;		break;	    case '\0':		return (*string == '\0');	    case '-':		if (*string++ == '-') {			patdashes--;			stringdashes--;			break;		}		return 0;	    default:		if (c == *string++)			break;		return 0;	    }	}}static intmatch(char *pat, char *string){	return patternmatch(pat, dashcount(pat), string, dashcount(string));}#elsestatic intmatch(char *pattern, char *font){	char *src = pattern;	char *dst = font;	int m = 0;	if (!strcmp(pattern, "-*"))		pattern = "*"; //"-*-*-*-*-*-*-*-*-*-*-*-*-*-*";	if (!strcmp(pattern, "*"))		return 1;	while (1) {		char *s, *e;		src++;		dst++;		/* Skip any wildcardish stuff */		if (*src == '*') {			src++;			if (!*src)				break;			for (; *dst && *dst != '-'; dst++)				continue;			if (!*dst)				break;			continue;		}		/* Find the end of the compare */		s = src;		e = src;		for (; *e && *e != '-'; e++)			continue;		if (strncmp(s, dst, (int) (e - s)) == 0) {			m = 1;		} else {			m = 0;			break;		}		src += (int) (e - s);		dst += (int) (e - s);	}	return m;}#endifstatic char **_findFontPattern(char *pattern, int maxnames, int *count){	struct _list *flist = _createFontList();	int fcount = 0, i = 0, f;	char buffer[128];	if (!_nxfontlist)		_nxSetDefaultFontDir();	for (f = 0; f < _nxfontcount; f++) {		FILE *fontdir = _nxLoadFontDir(_nxfontlist[f]);		if (!fontdir)			continue;		fgets(buffer, 128, fontdir);		fcount = atoi(buffer);		if (!fcount) {			fclose(fontdir);			continue;		}		for (i = 0; i < fcount; i++) {			char *font;			memset(buffer, 0, 128);			fgets(buffer, 128, fontdir);			/* Remove the end 'o line */			buffer[strlen(buffer) - 1] = '\0';			/* Find the field seperator */			font = strchr(buffer, ' ');			*font++ = '\0';			if (match(pattern, font))				if (_addFontToList(flist, font) == maxnames)					break;		}		fclose(fontdir);	}	return _getFontList(flist, count);}/* * Compare two strings just like strcmp, but preserve decimal integer * sorting order, i.e. "2" < "10" or "iso8859-2" < "iso8859-10" < * "iso10646-1". Strings are sorted as if sequences of digits were * prefixed by a length indicator (i.e., does not ignore leading zeroes). * * Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk> */#define isdigit(c) ('0' <= (c) && (c) <= '9')static intstrcmpn(unsigned char *s1, unsigned char *s2){	int digits, predigits = 0;	unsigned char *ss1, *ss2;	while (1) {		if (*s1 == 0 && *s2 == 0)			return 0;		digits = isdigit(*s1) && isdigit(*s2);		if (digits && !predigits) {			ss1 = s1;			ss2 = s2;			while (isdigit(*ss1) && isdigit(*ss2))				ss1++, ss2++;			if (!isdigit(*ss1) && isdigit(*ss2))				return -1;			if (isdigit(*ss1) && !isdigit(*ss2))				return 1;		}		if (*s1 < *s2)			return -1;		if (*s1 > *s2)			return 1;		predigits = digits;		s1++, s2++;	}}static intcomparefunc(const void* a, const void* b){	char *aa = *(char **)a;	char *bb = *(char **)b;	return strcmpn(aa, bb);}char **XListFonts(Display * display, _Xconst char *pattern, int maxnames,	int *actual_count_return){	int count;	char **ret;	ret = _findFontPattern((char *)pattern, maxnames, &count);	*actual_count_return = count;	/* sort the return, helps for lack of locale info at end of XLFD*/	qsort((char *)ret, count, sizeof(char *), comparefunc);	return ret;}intXFreeFontNames(char **list){	_freeFontList(list);	return 1;}

⌨️ 快捷键说明

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