int x_types_init(void) { size_t i; size_t nr[2] = { 0, 0 }; size_t k_nr_hint; TRACE("sizeof(struct x_node) %zu\n", sizeof(struct x_node)); TRACE("sizeof(struct k_node) %zu\n", sizeof(struct k_node)); for (i = 0; i < NR_X_TYPES; i++) { if (hash_table_init(&x_types[i].x_hash_table, x_types[i].x_nr_hint) < 0) return -1; nr[x_types[i].x_which] += x_types[i].x_nr_hint; } for (i = 0; i < 2; i++) { x_all[i] = x_lookup((i == 0) ? X_U : X_V, (i == 0) ? X_U_NAME : X_V_NAME, NULL, L_CREATE); if (x_all[i] == NULL) return -1; } k_nr_hint = nr[0] * nr[1]; TRACE("nr[0] %zu, nr[1] %zu, k_nr_hint %zu\n", nr[0], nr[1], k_nr_hint); if (hash_table_init(&k_hash_table, k_nr_hint) < 0) return -1; return 0; }
struct x_node *x_lookup_str(const char *str) { size_t i; /* "host:i101-101.ranger.tacc.utexas.edu" => x_lookup(X_HOST, "i101-...") */ for (i = 0; i < NR_X_TYPES; i++) { size_t len = strlen(x_types[i].x_type_name); if (strncmp(str, x_types[i].x_type_name, len) == 0 && (str[len] == ':' || str[len] == '=')) return x_lookup(i, str + len + 1, NULL, 0); } return NULL; }
static void x_analyze(x_display *xdpy, int fam) { int i, j, n, face, pixsize, nsizes; char *name; if (tmp_fonts) tmp_free(); tmp_fonts = XListFonts(xdpy->dpy, pattern[((unsigned int)fam)>>2], 1024, &n); for (i=0 ; i<n ; i++) { name = x_face(tmp_fonts[i], &face); if (!name) continue; /* extract pixels field */ pixsize = 0; if (name[0]!='*') while (name[0] && name[0]>='0' && name[0]<='9') pixsize = 10*pixsize + *(name++) - '0'; else name++; if (name[0]!='-') continue; /* protect against superlong font names */ if (!pixsize && strlen(tmp_fonts[i])>120) continue; face += fam; nsizes = xdpy->available[face].nsizes; if (x_lookup(pixsize, xdpy->available[face].sizes, nsizes)) continue; if (nsizes%12==0) { int *sizes = xdpy->available[face].sizes; char **names = xdpy->available[face].names; xdpy->available[face].sizes = p_realloc(sizes, sizeof(int)*(nsizes+12)); if (!xdpy->available[face].sizes) { xdpy->available[face].sizes = sizes; return; } xdpy->available[face].names = p_realloc(names,sizeof(char*)*(nsizes+13)); if (!xdpy->available[face].names) { xdpy->available[face].names = names; return; } } j = x_insert(pixsize, xdpy->available[face].sizes, xdpy->available[face].names, nsizes); xdpy->available[face].nsizes++; if (pixsize) { xdpy->available[face].names[j] = p_strcpy(tmp_fonts[i]); } else { /* scalable font needs wildcard name */ char nm[128], *pnm = nm; int n = 7; name = tmp_fonts[i]; while (n--) while ((*(pnm++)= *(name++))!='-'); /* skip over pixels, points fields */ *(pnm++)= '*'; *(pnm++)= '-'; *(pnm++)= '*'; *(pnm++)= '-'; for (n=2 ; n-- ;) while (name[0] && *(name++)!='-'); /* copy hres, vres, spacing fields */ for (n=3 ; n-- ;) while (name[0] && (*(pnm++)= *(name++))!='-'); /* skip over average width field */ *(pnm++)= '*'; *(pnm++)= '-'; while (name[0] && *(name++)!='-'); /* copy remainder (character set fields) */ while ((*(pnm++)= *(name++))); xdpy->available[face].names[j] = p_strcpy(nm); } } tmp_free(); }