📄 xrm.c
字号:
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 + -