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

📄 xrm.c

📁 Nxlib,一个模拟xlib的程序。使用microwindows的库来运行需要xlib支持的程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
		alloc_chars += BUFSIZ/10;				temp_str = Xrealloc(rhs, sizeof(char) * alloc_chars);		if (!temp_str) {		    Xfree(rhs);		    if (lhs != lhs_s) Xfree (lhs);		    (*db->methods->mbfinish)(db->mbstate);		    return;		}		ptr = temp_str + (ptr - rhs); /* reset pointer. */		rhs = temp_str;		ptr_max = rhs + alloc_chars - 4;	    }	}	/*	 * Lastly: Terminate the value string, and store this entry 	 * 	   into the database.	 */	*ptr++ = '\0';	/* Store it in database */	value.size = ptr - rhs;	value.addr = (XPointer) rhs;		PutEntry(db, bindings, quarks, XrmQString, &value);    }    if (lhs != lhs_s) Xfree (lhs);    Xfree (rhs);    (*db->methods->mbfinish)(db->mbstate);}#if NeedFunctionPrototypesvoid XrmPutStringResource(    XrmDatabase *pdb,    _Xconst char*specifier,    _Xconst char*str)#elsevoid XrmPutStringResource(pdb, specifier, str)    XrmDatabase *pdb;    char	*specifier;    char	*str;#endif{    XrmValue	value;    XrmBinding	bindings[MAXDBDEPTH+1];    XrmQuark	quarks[MAXDBDEPTH+1];    if (!*pdb) *pdb = NewDatabase();    XrmStringToBindingQuarkList(specifier, bindings, quarks);    value.addr = (XPointer) str;    value.size = strlen(str)+1;    _XLockMutex(&(*pdb)->linfo);    PutEntry(*pdb, bindings, quarks, XrmQString, &value);    _XUnlockMutex(&(*pdb)->linfo);}#if NeedFunctionPrototypesvoid XrmPutLineResource(    XrmDatabase *pdb,    _Xconst char*line)#elsevoid XrmPutLineResource(pdb, line)    XrmDatabase *pdb;    char	*line;#endif{    if (!*pdb) *pdb = NewDatabase();    _XLockMutex(&(*pdb)->linfo);    GetDatabase(*pdb, line, (char *)NULL, False);    _XUnlockMutex(&(*pdb)->linfo);}#if NeedFunctionPrototypesXrmDatabase XrmGetStringDatabase(    _Xconst char    *data)#elseXrmDatabase XrmGetStringDatabase(data)    char	    *data;#endif{    XrmDatabase     db;    db = NewDatabase();    _XLockMutex(&db->linfo);    GetDatabase(db, data, (char *)NULL, True);    _XUnlockMutex(&db->linfo);    return db;}/*	Function Name: ReadInFile *	Description: Reads the file into a buffer. *	Arguments: filename - the name of the file. *	Returns: An allocated string containing the contents of the file. */static char *ReadInFile(filename)char * filename;{    register int fd, size;    char * filebuf;#ifdef __EMX__    filename = __XOS2RedirRoot(filename);#endif    /*     * MS-Windows and OS/2 note: Default open mode includes O_TEXT     */    if ( (fd = _XOpenFile (filename, O_RDONLY)) == -1 )	return (char *)NULL;    /*     * MS-Windows and OS/2 note: depending on how the sources are     * untarred, the newlines in resource files may or may not have     * been expanded to CRLF. Either way the size returned by fstat     * is sufficient to read the file into because in text-mode any     * CRLFs in a file will be converted to newlines (LF) with the     * result that the number of bytes actually read with be <=     * to the size returned by fstat.     */    GetSizeOfFile(fd, size);    if (!(filebuf = Xmalloc(size + 1))) { /* leave room for '\0' */	close(fd);	return (char *)NULL;    }    size = read (fd, filebuf, size);#ifdef __EMX__    { /* kill CRLF */      int i,k;      for (i=k=0; i<size; i++)	if (filebuf[i] != 0x0d) {	   filebuf[k++] = filebuf[i];	}	filebuf[k] = 0;    }#endif    if (size < 0) {	close (fd);	Xfree(filebuf);	return (char *)NULL;    }    close (fd);    filebuf[size] = '\0';	/* NULL terminate it. */    return filebuf;}static voidGetIncludeFile(db, base, fname, fnamelen)    XrmDatabase db;    char *base;    char *fname;    int fnamelen;{    int len;    char *str;    char realfname[BUFSIZ];    if (fnamelen <= 0 || fnamelen >= BUFSIZ)	return;    if (*fname != '/' && base && (str = strrchr(base, '/'))) {	len = str - base + 1;	if (len + fnamelen >= BUFSIZ)	    return;	strncpy(realfname, base, len);	strncpy(realfname + len, fname, fnamelen);	realfname[len + fnamelen] = '\0';    } else {	strncpy(realfname, fname, fnamelen);	realfname[fnamelen] = '\0';    }    if (!(str = ReadInFile(realfname)))	return;    GetDatabase(db, str, realfname, True);    Xfree(str);}#if NeedFunctionPrototypesXrmDatabase XrmGetFileDatabase(    _Xconst char    *filename)#elseXrmDatabase XrmGetFileDatabase(filename)    char 	    *filename;#endif{    XrmDatabase db;    char *str;    if (!(str = ReadInFile(filename)))	return (XrmDatabase)NULL;    db = NewDatabase();    _XLockMutex(&db->linfo);    GetDatabase(db, str, filename, True);    _XUnlockMutex(&db->linfo);    Xfree(str);    return db;}#if NeedFunctionPrototypesStatus XrmCombineFileDatabase(    _Xconst char    *filename,    XrmDatabase     *target,    Bool             override)#elseStatus XrmCombineFileDatabase(filename, target, override)    char        *filename;    XrmDatabase *target;    Bool         override;#endif{    XrmDatabase db;    char *str;    if (!(str = ReadInFile(filename)))	return 0;    if (override) {	db = *target;	if (!db)	    *target = db = NewDatabase();    } else	db = NewDatabase();    _XLockMutex(&db->linfo);    GetDatabase(db, str, filename, True);    _XUnlockMutex(&db->linfo);    Xfree(str);    if (!override)	XrmCombineDatabase(db, target, False);    return 1;}/* call the user proc for every value in the table, arbitrary order. * stop if user proc returns True.  level is current depth in database. *//*ARGSUSED*/static Bool EnumLTable(table, names, classes, level, closure)    LTable		table;    XrmNameList		names;    XrmClassList 	classes;    register int	level;    register EClosure	closure;{    register VEntry *bucket;    register int i;    register VEntry entry;    XrmValue value;    XrmRepresentation type;    Bool tightOk;    closure->bindings[level] = (table->table.tight ?				XrmBindTightly : XrmBindLoosely);    closure->quarks[level] = table->table.name;    level++;    tightOk = !*names;    closure->quarks[level + 1] = NULLQUARK;    for (i = table->table.mask, bucket = table->buckets;	 i >= 0;	 i--, bucket++) {	for (entry = *bucket; entry; entry = entry->next) {	    if (entry->tight && !tightOk)		continue;	    closure->bindings[level] = (entry->tight ?					XrmBindTightly : XrmBindLoosely);	    closure->quarks[level] = entry->name;	    value.size = entry->size;	    if (entry->string) {		type = XrmQString;		value.addr = StringValue(entry);	    } else {		type = RepType(entry);		value.addr = DataValue(entry);	    }	    if ((*closure->proc)(&closure->db, closure->bindings+1,				 closure->quarks+1, &type, &value,				 closure->closure))		return True;	}    }    return False;}static Bool EnumAllNTable(table, level, closure)    NTable		table;    register int	level;    register EClosure	closure;{    register NTable *bucket;    register int i;    register NTable entry;    XrmQuark empty = NULLQUARK;    if (level >= MAXDBDEPTH)	return False;    for (i = table->mask, bucket = NodeBuckets(table);	 i >= 0;	 i--, bucket++) {	for (entry = *bucket; entry; entry = entry->next) {	    if (entry->leaf) {		if (EnumLTable((LTable)entry, &empty, &empty, level, closure))		    return True;	    } else {		closure->bindings[level] = (entry->tight ?					    XrmBindTightly : XrmBindLoosely);		closure->quarks[level] = entry->name;		if (EnumAllNTable(entry, level+1, closure))		    return True;	    }	}    }    return False;}/* recurse on every table in the table, arbitrary order. * stop if user proc returns True.  level is current depth in database. */static Bool EnumNTable(table, names, classes, level, closure)    NTable		table;    XrmNameList		names;    XrmClassList 	classes;    register int	level;    register EClosure	closure;{    register NTable	entry;    register XrmQuark	q;    register unsigned int leaf;    Bool (*get)();    Bool bilevel;/* find entries named ename, leafness leaf, tight or loose, and call get */#define ITIGHTLOOSE(ename) \    NFIND(ename); \    if (entry) { \	if (leaf == entry->leaf) { \	    if (!leaf && !entry->tight && entry->next && \		entry->next->name == q && entry->next->tight && \		(bilevel || entry->next->hasloose) && \		EnumLTable((LTable)entry->next, names+1, classes+1, \			   level, closure)) \		return True; \	    if ((*get)(entry, names+1, classes+1, level, closure)) \		return True; \	    if (entry->tight && (entry = entry->next) && \		entry->name == q && leaf == entry->leaf && \		(*get)(entry, names+1, classes+1, level, closure)) \		return True; \	} else if (entry->leaf) { \	    if ((bilevel || entry->hasloose) && \		EnumLTable((LTable)entry, names+1, classes+1, level, closure))\		return True; \	    if (entry->tight && (entry = entry->next) && \		entry->name == q && (bilevel || entry->hasloose) && \		EnumLTable((LTable)entry, names+1, classes+1, level, closure))\		return True; \	} \    }/* find entries named ename, leafness leaf, loose only, and call get */#define ILOOSE(ename) \    NFIND(ename); \    if (entry && entry->tight && (entry = entry->next) && entry->name != q) \	entry = (NTable)NULL; \    if (entry) { \	if (leaf == entry->leaf) { \	    if ((*get)(entry, names+1, classes+1, level, closure)) \		return True; \	} else if (entry->leaf && (bilevel || entry->hasloose)) { \	    if (EnumLTable((LTable)entry, names+1, classes+1, level, closure))\		return True; \	} \    }    if (level >= MAXDBDEPTH)	return False;    closure->bindings[level] = (table->tight ?				XrmBindTightly : XrmBindLoosely);    closure->quarks[level] = table->name;    level++;    if (!*names) {	if (EnumAllNTable(table, level, closure))	    return True;    } else {	if (names[1] || closure->mode == XrmEnumAllLevels) {	    get = EnumNTable; /* recurse */	    leaf = 0;	    bilevel = !names[1];	} else {	    get = EnumLTable; /* bottom of recursion */	    leaf = 1;	    bilevel = False;	}	if (table->hasloose && closure->mode == XrmEnumAllLevels) {	    NTable *bucket;	    int i;	    XrmQuark empty = NULLQUARK;	    for (i = table->mask, bucket = NodeBuckets(table);		 i >= 0;		 i--, bucket++) {		q = NULLQUARK;		for (entry = *bucket; entry; entry = entry->next) {		    if (!entry->tight && entry->name != q &&			entry->name != *names && entry->name != *classes) {			q = entry->name;			if (entry->leaf) {			    if (EnumLTable((LTable)entry, &empty, &empty,					   level, closure))				return True;			} else {			    if (EnumNTable(entry, &empty, &empty,					   level, closure))				return True;			}		    }		}	    }	}	ITIGHTLOOSE(*names);   /* do name, tight and loose */	ITIGHTLOOSE(*classes); /* do class, tight and loose */	if (table->hasany) {	    ITIGHTLOOSE(XrmQANY); /* do ANY, tight and loose */	}	if (table->hasloose) {	    while (1) {		names++;		classes++;		if (!*names)		    break;		if (!names[1] && closure->mode != XrmEnumAllLevels) {		    get = EnumLTable; /* bottom of recursion */		    leaf = 1;		}		ILOOSE(*names);   /* loose names */		ILOOSE(*classes); /* loose classes */		if (table->hasany) {		    ILOOSE(XrmQANY); /* loose ANY */		}	    }	    names--;	    classes--;	}    }    /* now look for matching leaf nodes */    entry = table->next;    if (!entry)	return False;    if (entry->leaf) {	if (entry->tight && !table->tight)	    entry = entry->next;    } else {	entry = entry->next;	if (!entry || !entry->tight)	    return False;    }    if (!entry || entry->name != table->name)	return False;    /* found one */    level--;    if ((!*names || entry->hasloose) &&	EnumLTable((LTable)entry, names, classes, level, closure))	return True;    if (entry->tight && entry == table->next && (entry = entry->next) &&	entry->name == table->name && (!*names || entry->hasloose))	return EnumLTable((LTable)entry, names, classes, level, closure);    return False;#undef ITIGHTLOOSE#undef ILOOSE}/* call the proc for every value in the database, arbitrary order. * stop if the proc returns True. */Bool XrmEnumerateDatabase(db, names, classes, mode, proc, closure)    XrmDatabase		db;    XrmNameList		names;    XrmClassList	classes;    int			mode;    DBEnumProc		proc;    XPointer		closure;{    XrmBinding  bindings[MAXDBDEPTH+2];    XrmQuark	quarks[MAXDBDEPTH+2];    register NTable table;    EClosureRec	eclosure;    Bool retval = False;

⌨️ 快捷键说明

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