Annotation of researchv9/X11/src/X.V11R1/clients/xlsfonts/xlsfonts.c, revision 1.1

1.1     ! root        1: #include <X11/Xlib.h>
        !             2: #include <X11/Xutil.h>
        !             3: #include <stdio.h>
        !             4: #include "dsimple.h"
        !             5: 
        !             6: #define N_START 1000  /* Maximum # of fonts to start with */
        !             7: 
        !             8: int    long_list;
        !             9: int    force_columns;
        !            10: int    force_1column;
        !            11: int    nnames = N_START;
        !            12: int    font_cnt;
        !            13: int    min_max;
        !            14: typedef struct {
        !            15:        char            *name;
        !            16:        XFontStruct     *info;
        !            17: } FontList;
        !            18: FontList       *font_list;
        !            19: 
        !            20: 
        !            21: usage()
        !            22: {
        !            23:        fprintf(stderr,"%s: usage: %s [host:display] [pattern]\n", program_name,
        !            24:                program_name);
        !            25:        exit(1);
        !            26: }
        !            27: 
        !            28: main(argc, argv)
        !            29: int argc;
        !            30: char **argv;    
        !            31: {
        !            32:        int     argcnt, i;
        !            33: 
        !            34:        INIT_NAME;
        !            35: 
        !            36:        /* Handle command line arguments, open display */
        !            37:        Setup_Display_And_Screen(&argc, argv);
        !            38:        for (argv++, argc--; argc; argv++, argc--) {
        !            39:                if (argv[0][0] == '-') {
        !            40:                        for (i=1; argv[0][i]; i++)
        !            41:                                switch(argv[0][i]) {
        !            42:                                case 'l':
        !            43:                                        long_list++;
        !            44:                                        break;
        !            45:                                case 'm':
        !            46:                                        min_max++;
        !            47:                                        break;
        !            48:                                case 'C':
        !            49:                                        force_columns++;
        !            50:                                        force_1column = 0;
        !            51:                                        break;
        !            52:                                case '1':
        !            53:                                        force_1column++;
        !            54:                                        force_columns = 0;
        !            55:                                        break;
        !            56:                                default:
        !            57:                                        usage();
        !            58:                                        break;
        !            59:                                }
        !            60:                        if (i == 1)
        !            61:                                usage();
        !            62:                } else {
        !            63:                        argcnt++;
        !            64:                        get_list(argv[0]);
        !            65:                }
        !            66:        }
        !            67:        if (argcnt == 0)
        !            68:                get_list("*");
        !            69:        show_fonts();
        !            70:        exit(0);
        !            71: }
        !            72: 
        !            73: get_list(pattern)
        !            74:        char    *pattern;
        !            75: {
        !            76:        int     available = nnames+1,
        !            77:                i;
        !            78:        char    **fonts;
        !            79:        XFontStruct     *info;
        !            80: 
        !            81:        /* Get list of fonts matching pattern */
        !            82:        for (;;) {
        !            83:                if (long_list)
        !            84:                        fonts = XListFontsWithInfo(dpy,
        !            85:                                pattern, nnames, &available, &info);
        !            86:                else
        !            87:                        fonts = XListFonts(dpy, pattern, nnames, &available);
        !            88:                if (fonts == NULL || available < nnames)
        !            89:                        break;
        !            90:                if (long_list)
        !            91:                        XFreeFontInfo(fonts, info, available);
        !            92:                else
        !            93:                        XFreeFontNames(fonts);
        !            94:                nnames = available * 2;
        !            95:        }
        !            96: 
        !            97:        if (fonts == NULL) {
        !            98:                fprintf(stderr, "%s: pattern \"%s\" unmatched\n",
        !            99:                        program_name, pattern);
        !           100:                return;
        !           101:        }
        !           102: 
        !           103:        font_list = (FontList *)Realloc(font_list,
        !           104:                (font_cnt + available) * sizeof(FontList));
        !           105:        for (i=0; i<available; i++) {
        !           106:                font_list[font_cnt].name = fonts[i];
        !           107:                if (long_list)
        !           108:                        font_list[font_cnt].info = info + i;
        !           109:                else
        !           110:                        font_list[font_cnt].info = NULL;
        !           111:                font_cnt++;
        !           112:        }
        !           113: }
        !           114: 
        !           115: compare(f1, f2)
        !           116:        FontList        *f1, *f2;
        !           117: {
        !           118:        char    *p1 = f1->name,
        !           119:                *p2 = f2->name;
        !           120: 
        !           121:        while (*p1 && *p2 && *p1 == *p2)
        !           122:                p1++, p2++;
        !           123:        return(*p1 - *p2);
        !           124: }
        !           125: 
        !           126: show_fonts()
        !           127: {
        !           128:        int     i;
        !           129: 
        !           130:        if (font_cnt == 0)
        !           131:                return;
        !           132: 
        !           133:        /* first sort the output */
        !           134:        qsort(font_list, font_cnt, sizeof(FontList), compare);
        !           135: 
        !           136:        if (long_list) {
        !           137:                XFontStruct     *pfi;
        !           138:                char            *string;
        !           139: 
        !           140:                printf("DIR  ");
        !           141:                printf("MIN  ");
        !           142:                printf("MAX ");
        !           143:                printf("EXIST ");
        !           144:                printf("DFLT ");
        !           145:                printf("PROP ");
        !           146:                printf("ASC ");
        !           147:                printf("DESC ");
        !           148:                printf("NAME");
        !           149:                printf("\n");
        !           150:                for (i=0; i<font_cnt; i++) {
        !           151:                        pfi = font_list[i].info;
        !           152:                        switch(pfi->direction) {
        !           153:                        case FontLeftToRight: string = "-->"; break;
        !           154:                        case FontRightToLeft: string = "<--"; break;
        !           155:                        default:              string = "???"; break;
        !           156:                        }
        !           157:                        printf("%-4s", string);
        !           158:                        if (pfi->min_byte1 == 0
        !           159:                         && pfi->max_byte1 == 0) {
        !           160:                                printf(" %3d ", pfi->min_char_or_byte2);
        !           161:                                printf(" %3d ", pfi->max_char_or_byte2);
        !           162:                        } else {
        !           163:                                printf("*%3d ", pfi->min_byte1);
        !           164:                                printf("*%3d ", pfi->max_byte1);
        !           165:                        }
        !           166:                        printf("%5s ", pfi->all_chars_exist ? "all" : "some");
        !           167:                        printf("%4d ", pfi->default_char);
        !           168:                        printf("%4d ", pfi->n_properties);
        !           169:                        printf("%3d ", pfi->ascent);
        !           170:                        printf("%4d ", pfi->descent);
        !           171:                        printf("%s\n", font_list[i].name);
        !           172:                        if (min_max) {
        !           173:                                char    min[ BUFSIZ ],
        !           174:                                        max[ BUFSIZ ];
        !           175:                                char    *pmax = max,
        !           176:                                        *pmin = min;
        !           177:                                int     w;
        !           178: 
        !           179:                                strcpy(pmin, "     min(l,r,w,a,d) = (");
        !           180:                                strcpy(pmax, "     max(l,r,w,a,d) = (");
        !           181:                                pmin += strlen(pmin);
        !           182:                                pmax += strlen(pmax);
        !           183: 
        !           184:                                copy_number(&pmin, &pmax,
        !           185:                                        pfi->min_bounds.lbearing,
        !           186:                                        pfi->max_bounds.lbearing);
        !           187:                                *pmin++ = *pmax++ = ',';
        !           188:                                copy_number(&pmin, &pmax,
        !           189:                                        pfi->min_bounds.rbearing,
        !           190:                                        pfi->max_bounds.rbearing);
        !           191:                                *pmin++ = *pmax++ = ',';
        !           192:                                copy_number(&pmin, &pmax,
        !           193:                                        pfi->min_bounds.width,
        !           194:                                        pfi->max_bounds.width);
        !           195:                                *pmin++ = *pmax++ = ',';
        !           196:                                copy_number(&pmin, &pmax,
        !           197:                                        pfi->min_bounds.ascent,
        !           198:                                        pfi->max_bounds.ascent);
        !           199:                                *pmin++ = *pmax++ = ',';
        !           200:                                copy_number(&pmin, &pmax,
        !           201:                                        pfi->min_bounds.descent,
        !           202:                                        pfi->max_bounds.descent);
        !           203:                                *pmin++ = *pmax++ = ')';
        !           204:                                *pmin = *pmax = '\0';
        !           205:                                printf("%s\n", min);
        !           206:                                printf("%s\n", max);
        !           207:                        }
        !           208:                }
        !           209:                return;
        !           210:        }
        !           211: 
        !           212:        if ((!force_1column && isatty(1)) || force_columns) {
        !           213:                int     width,
        !           214:                        max_width = 0,
        !           215:                        columns,
        !           216:                        lines_per_column,
        !           217:                        j,
        !           218:                        index;
        !           219: 
        !           220:                for (i=0; i<font_cnt; i++) {
        !           221:                        width = strlen(font_list[i].name);
        !           222:                        if (width > max_width)
        !           223:                                max_width = width;
        !           224:                }
        !           225:                if (max_width == 0)
        !           226:                        Fatal_Error("Max width of font names is 0!");
        !           227:                max_width += 3;
        !           228:                columns = (79 + max_width - 1) / max_width;
        !           229:                if (font_cnt < columns)
        !           230:                        columns = font_cnt;
        !           231:                lines_per_column = (font_cnt + columns - 1) / columns;
        !           232: 
        !           233:                for (i=0; i<lines_per_column; i++) {
        !           234:                        for (j=0; j<columns; j++) {
        !           235:                                index = j * lines_per_column + i;
        !           236:                                if (index >= font_cnt)
        !           237:                                        break;
        !           238:                                if (j+1 == columns)
        !           239:                                        printf("%s", font_list[ index ]);
        !           240:                                else
        !           241:                                        printf("%-*s",
        !           242:                                                max_width, font_list[ index ]);
        !           243:                        }
        !           244:                        printf("\n");
        !           245:                }
        !           246:                return;
        !           247:        }
        !           248: 
        !           249:        for (i=0; i<font_cnt; i++)
        !           250:                printf("%s\n", font_list[i].name);
        !           251: }
        !           252: 
        !           253: max(i, j)
        !           254:        int     i, j;
        !           255: {
        !           256:        if (i > j)
        !           257:                return (i);
        !           258:        return(j);
        !           259: }
        !           260: 
        !           261: copy_number(pp1, pp2, n1, n2)
        !           262:        char    **pp1, **pp2;
        !           263:        int     n1, n2;
        !           264: {
        !           265:        char    *p1 = *pp1;
        !           266:        char    *p2 = *pp2;
        !           267:        int     w;
        !           268: 
        !           269:        sprintf(p1, "%d", n1);
        !           270:        sprintf(p2, "%d", n2);
        !           271:        w = max(strlen(p1), strlen(p2));
        !           272:        sprintf(p1, "%*d", w, n1);
        !           273:        sprintf(p2, "%*d", w, n2);
        !           274:        p1 += strlen(p1);
        !           275:        p2 += strlen(p2);
        !           276:        *pp1 = p1;
        !           277:        *pp2 = p2;
        !           278: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.