summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:52 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 15:54:52 +0000
commit0f93bed073a9dbc1b436f26a5f55ffbedea4471f (patch)
tree9315572566988f6c46328f568c629caa0901ffb6
R6.6 is the Xorg base-lineXORG-MAINXORG-STABLE
-rw-r--r--fslsfonts.c498
-rw-r--r--fslsfonts.man94
2 files changed, 592 insertions, 0 deletions
diff --git a/fslsfonts.c b/fslsfonts.c
new file mode 100644
index 0000000..f7a927f
--- /dev/null
+++ b/fslsfonts.c
@@ -0,0 +1,498 @@
+/* $Xorg: fslsfonts.c,v 1.4 2001/02/09 02:05:30 xorgcvs Exp $ */
+/*
+
+Copyright 1990, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+ * Copyright 1990 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices, or Digital
+ * not be used in advertising or publicity pertaining to distribution
+ * of the software without specific, written prior permission.
+ *
+ * NETWORK COMPUTING DEVICES, AND DIGITAL DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES,
+ * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+
+#include "FSlib.h"
+#include <stdio.h>
+#include <X11/Xos.h>
+
+#ifndef N_START
+#define N_START 1000 /* Maximum # of fonts to start with */
+#endif
+
+int max_output_line_width = 79;
+int output_line_padding = 3;
+int columns = 0;
+
+#define L_SHORT 0
+#define L_MEDIUM 1
+#define L_LONG 2
+#define L_VERYLONG 3
+
+Bool sort_output = True;
+int long_list = L_SHORT;
+int nnames = N_START;
+int font_cnt;
+int min_max;
+typedef struct {
+ char *name;
+ FSXFontInfoHeader *info;
+ FSPropInfo *pi;
+ FSPropOffset *po;
+ unsigned char *pd;
+} FontList;
+FontList *font_list;
+
+FSServer *svr;
+
+char *program_name;
+
+
+usage()
+{
+ fprintf(stderr, "usage: %s [-options] [-fn pattern]\n", program_name);
+ fprintf(stderr, "where options include:\n");
+
+ fprintf(stderr,
+ " -l[l[l]] give long info about each font\n");
+ fprintf(stderr,
+ " -m give character min and max bounds\n");
+
+ fprintf(stderr,
+ " -C force columns\n");
+ fprintf(stderr,
+ " -1 force single column\n");
+ fprintf(stderr,
+ " -u keep output unsorted\n");
+ fprintf(stderr,
+ " -w width maximum width for multiple columns\n");
+ fprintf(stderr,
+ " -n columns number of columns if multi column\n");
+ fprintf(stderr,
+ " -server servername font server to contact\n");
+ fprintf(stderr,
+ "\n");
+ exit(1);
+}
+
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int argcnt = 0,
+ i;
+ char *servername = NULL;
+
+ program_name = argv[0];
+
+ for (i = 1; i < argc; i++) {
+ if (strncmp(argv[i], "-s", 2) == 0) {
+ if (++i >= argc)
+ usage();
+ servername = argv[i];
+ }
+ }
+
+ if ((svr = FSOpenServer(servername)) == NULL) {
+ fprintf(stderr, "%s: unable to open server \"%s\"\n",
+ program_name, FSServerName(servername));
+ exit(0);
+ }
+ /* Handle command line arguments, open display */
+ for (argv++, argc--; argc; argv++, argc--) {
+ if (argv[0][0] == '-') {
+ if (argcnt > 0)
+ usage();
+ for (i = 1; argv[0][i]; i++)
+ switch (argv[0][i]) {
+ case 'l':
+ long_list++;
+ break;
+ case 'm':
+ min_max++;
+ break;
+ case 'C':
+ columns = 0;
+ break;
+ case '1':
+ columns = 1;
+ break;
+ case 'f':
+ if (--argc <= 0)
+ usage();
+ argcnt++;
+ argv++;
+ get_list(argv[0]);
+ goto next;
+ case 'w':
+ if (--argc <= 0)
+ usage();
+ argv++;
+ max_output_line_width = atoi(argv[0]);
+ goto next;
+ case 'n':
+ if (--argc <= 0)
+ usage();
+ argv++;
+ columns = atoi(argv[0]);
+ goto next;
+ case 'u':
+ sort_output = False;
+ break;
+ case 's': /* eat -s */
+ if (--argc <= 0)
+ usage();
+ argv++;
+ goto next;
+ default:
+ usage();
+ break;
+ }
+ if (i == 1)
+ usage();
+ } else {
+ argcnt++;
+ get_list(argv[0]);
+ }
+next: ;
+ }
+ if (argcnt == 0)
+ get_list("*");
+ FSCloseServer(svr);
+ show_fonts();
+ exit(0);
+}
+
+get_list(pattern)
+ char *pattern;
+{
+ int available = nnames + 1,
+ i;
+ char **fonts;
+ FSXFontInfoHeader **info;
+ FSPropInfo **props;
+ FSPropOffset **offsets;
+ unsigned char **pdata;
+
+ /* Get list of fonts matching pattern */
+ for (;;) {
+
+ if (long_list >= L_MEDIUM)
+ fonts = FSListFontsWithXInfo(svr,
+ pattern, nnames, &available, &info, &props, &offsets, &pdata);
+ else
+ fonts = FSListFonts(svr, pattern, nnames, &available);
+ if (fonts == NULL || available < nnames)
+ break;
+
+ if (long_list >= L_MEDIUM) {
+ for (i = 0; i < available; i++) {
+ FSFree((char *) fonts[i]);
+ FSFree((char *) info[i]);
+ FSFree((char *) props[i]);
+ FSFree((char *) offsets[i]);
+ FSFree((char *) pdata[i]);
+ }
+ FSFree((char *) fonts);
+ FSFree((char *) info);
+ FSFree((char *) props);
+ FSFree((char *) offsets);
+ FSFree((char *) pdata);
+ } else {
+ FSFreeFontNames(fonts);
+ }
+ nnames = available * 2;
+ }
+
+ if (fonts == NULL) {
+ fprintf(stderr, "%s: pattern \"%s\" unmatched\n",
+ program_name, pattern);
+ return;
+ }
+ if (font_list)
+ font_list = (FontList *) realloc(font_list,
+ (font_cnt + available) * sizeof(FontList));
+ else
+ font_list = (FontList *) malloc((unsigned)
+ (font_cnt + available) * sizeof(FontList));
+ for (i = 0; i < available; i++) {
+ font_list[font_cnt].name = fonts[i];
+
+ if (long_list >= L_MEDIUM) {
+ font_list[font_cnt].info = info[i];
+ font_list[font_cnt].pi = props[i];
+ font_list[font_cnt].po = offsets[i];
+ font_list[font_cnt].pd = pdata[i];
+ } else
+ font_list[font_cnt].info = NULL;
+ font_cnt++;
+ }
+}
+
+compare(f1, f2)
+ FontList *f1,
+ *f2;
+{
+ char *p1 = f1->name,
+ *p2 = f2->name;
+
+ while (*p1 && *p2 && *p1 == *p2)
+ p1++, p2++;
+ return (*p1 - *p2);
+}
+
+show_fonts()
+{
+ int i;
+
+ if (font_cnt == 0)
+ return;
+
+ /* first sort the output */
+ if (sort_output)
+ qsort(font_list, font_cnt, sizeof(FontList), compare);
+
+ if (long_list > L_MEDIUM) {
+ print_font_header();
+ for (i = 0; i < font_cnt; i++) {
+ show_font_header(&font_list[i]);
+ show_font_props(&font_list[i]);
+ }
+ return;
+ }
+ if (long_list == L_MEDIUM) {
+ print_font_header();
+
+ for (i = 0; i < font_cnt; i++) {
+ show_font_header(&font_list[i]);
+ }
+
+ return;
+ }
+ if ((columns == 0 && isatty(1)) || columns > 1) {
+ int width,
+ max_width = 0,
+ lines_per_column,
+ j,
+ index;
+
+ for (i = 0; i < font_cnt; i++) {
+ width = strlen(font_list[i].name);
+ if (width > max_width)
+ max_width = width;
+ }
+ if (max_width == 0) {
+ fprintf(stderr, "all %d fontnames listed are zero length",
+ font_cnt);
+ exit(-1);
+ }
+ if (columns == 0) {
+ if ((max_width * 2) + output_line_padding >
+ max_output_line_width) {
+ columns = 1;
+ } else {
+ max_width += output_line_padding;
+ columns = ((max_output_line_width +
+ output_line_padding) / max_width);
+ }
+ } else {
+ max_width += output_line_padding;
+ }
+ if (columns <= 1)
+ goto single_column;
+
+ if (font_cnt < columns)
+ columns = font_cnt;
+ lines_per_column = (font_cnt + columns - 1) / columns;
+
+ for (i = 0; i < lines_per_column; i++) {
+ for (j = 0; j < columns; j++) {
+ index = j * lines_per_column + i;
+ if (index >= font_cnt)
+ break;
+ if (j + 1 == columns)
+ printf("%s", font_list[index].name);
+ else
+ printf("%-*s",
+ max_width,
+ font_list[index].name);
+ }
+ printf("\n");
+ }
+ return;
+ }
+single_column:
+ for (i = 0; i < font_cnt; i++)
+ printf("%s\n", font_list[i].name);
+}
+
+print_font_header()
+{
+ printf("DIR ");
+ printf("MIN ");
+ printf("MAX ");
+ printf("EXIST ");
+ printf("DFLT ");
+ printf("ASC ");
+ printf("DESC ");
+ printf("NAME");
+ printf("\n");
+}
+
+show_font_header(list)
+ FontList *list;
+{
+ char *string;
+ FSXFontInfoHeader *pfh;
+
+ pfh = list->info;
+ if (!pfh) {
+ fprintf(stderr,
+ "%s: no font information for font \"%s\".\n",
+ program_name, list->name ? list->name : "");
+ return;
+ }
+ if (pfh->draw_direction == LeftToRightDrawDirection)
+ string = "-->";
+ else
+ string = "<--";
+ printf("%-4s", string);
+ if (pfh->char_range.min_char.high == 0
+ && pfh->char_range.max_char.high == 0) {
+ printf(" %3d ", pfh->char_range.min_char.low);
+ printf(" %3d ", pfh->char_range.max_char.low);
+ } else {
+ printf("*%3d ", pfh->char_range.min_char.high);
+ printf("*%3d ", pfh->char_range.max_char.high);
+ }
+ printf("%5s ", (pfh->flags & FontInfoAllCharsExist) ? "all" : "some");
+ printf("%4d ", (pfh->default_char.high << 8) + pfh->default_char.low);
+ printf("%3d ", pfh->font_ascent);
+ printf("%4d ", pfh->font_descent);
+ printf("%s\n", list->name);
+ if (min_max) {
+ char min[BUFSIZ],
+ max[BUFSIZ];
+ char *pmax = max,
+ *pmin = min;
+
+ strcpy(pmin, " min(l,r,w,a,d) = (");
+ strcpy(pmax, " max(l,r,w,a,d) = (");
+ pmin += strlen(pmin);
+ pmax += strlen(pmax);
+
+ copy_number(&pmin, &pmax,
+ pfh->min_bounds.left,
+ pfh->max_bounds.left);
+ *pmin++ = *pmax++ = ',';
+ copy_number(&pmin, &pmax,
+ pfh->min_bounds.right,
+ pfh->max_bounds.right);
+ *pmin++ = *pmax++ = ',';
+ copy_number(&pmin, &pmax,
+ pfh->min_bounds.width,
+ pfh->max_bounds.width);
+ *pmin++ = *pmax++ = ',';
+ copy_number(&pmin, &pmax,
+ pfh->min_bounds.ascent,
+ pfh->max_bounds.ascent);
+ *pmin++ = *pmax++ = ',';
+ copy_number(&pmin, &pmax,
+ pfh->min_bounds.descent,
+ pfh->max_bounds.descent);
+ *pmin++ = *pmax++ = ')';
+ *pmin = *pmax = '\0';
+ printf("%s\n", min);
+ printf("%s\n", max);
+ }
+}
+
+#define max(a, b) ((a) > (b) ? (a) : (b))
+
+copy_number(pp1, pp2, n1, n2)
+ char **pp1,
+ **pp2;
+ int n1,
+ n2;
+{
+ char *p1 = *pp1;
+ char *p2 = *pp2;
+ int w;
+
+ sprintf(p1, "%d", n1);
+ sprintf(p2, "%d", n2);
+ w = max(strlen(p1), strlen(p2));
+ sprintf(p1, "%*d", w, n1);
+ sprintf(p2, "%*d", w, n2);
+ p1 += strlen(p1);
+ p2 += strlen(p2);
+ *pp1 = p1;
+ *pp2 = p2;
+}
+
+show_font_props(list)
+ FontList *list;
+{
+ int i;
+ char buf[1000];
+ FSPropInfo *pi = list->pi;
+ FSPropOffset *po = list->po;
+ unsigned char *pd = list->pd;
+ int num_props;
+
+ num_props = pi->num_offsets;
+ for (i = 0; i < num_props; i++, po++) {
+ strncpy(buf, (char *) (pd + po->name.position), po->name.length);
+ buf[po->name.length] = '\0';
+ printf("%s\t", buf);
+ switch (po->type) {
+ case PropTypeString:
+ strncpy(buf, (char *)pd + po->value.position, po->value.length);
+ buf[po->value.length] = '\0';
+ printf("%s\n", buf);
+ break;
+ case PropTypeUnsigned:
+ printf("%d\n", (unsigned long) po->value.position);
+ break;
+ case PropTypeSigned:
+ printf("%d\n", (long) po->value.position);
+ break;
+ default:
+ fprintf(stderr, "bogus property\n");
+ break;
+ }
+
+ }
+}
diff --git a/fslsfonts.man b/fslsfonts.man
new file mode 100644
index 0000000..b555aee
--- /dev/null
+++ b/fslsfonts.man
@@ -0,0 +1,94 @@
+.\" $Xorg: fslsfonts.man,v 1.4 2001/02/09 02:05:30 xorgcvs Exp $
+.\" Copyright 1991, Network Computing Devices, Inc
+.\" Copyright 1993, 1994, 1998 The Open Group
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this software and its
+.\" documentation for any purpose is hereby granted without fee, provided that
+.\" the above copyright notice appear in all copies and that both that
+.\" copyright notice and this permission notice appear in supporting
+.\" documentation.
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of The Open Group shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from The Open Group.
+.TH FSLSFONTS 1 "Release 6.4" "X Version 11"
+.SH NAME
+fslsfonts \- list fonts served by X font server
+.SH SYNOPSIS
+.B fslsfonts
+[\-options ...] [\-fn pattern]
+.SH DESCRIPTION
+.I Fslsfonts
+lists the fonts that match the given \fIpattern\fP.
+The wildcard character "*" may be used to match any sequence of
+characters (including none), and "?" to match any single character.
+If no pattern is given, "*" is assumed.
+.PP
+The "*" and "?" characters must be quoted to prevent them from
+being expanded by the shell.
+.SH "OPTIONS"
+.PP
+.TP 8
+.B \-server \fIhost\fP:\fIport\fP
+This option specifies the X font server to contact.
+.PP
+.TP 8
+.B \-l
+Lists some attributes of the font on one line in addition to its name.
+.TP 8
+.B \-ll
+Lists font properties in addition to \fB\-l\fP output.
+.TP 8
+.B \-lll
+Supported for compatibility with \fIxlsfonts\fP, but output is the
+same as for \fB\-ll\fP.
+.TP 8
+.B \-m
+This option indicates that long listings should also print the minimum and
+maximum bounds of each font.
+.TP 8
+.B \-C
+This option indicates that listings should use multiple columns. This is the
+same as \fB\-n 0\fP.
+.TP 8
+.B \-1
+This option indicates that listings should use a single column. This is the
+same as \fB\-n 1\fP.
+.TP 8
+.B \-w \fIwidth\fP
+This option specifies the width in characters that should be used in
+figuring out how many columns to print. The default is 79.
+.TP 8
+.B \-n \fIcolumns\fP
+This option specifies the number of columns to use in displaying the output.
+The default is 0, which
+will attempt to fit as many columns of font names into the
+number of character specified by \fB\-w\fP \fIwidth\fP.
+.TP 8
+.B \-u
+This option indicates that the output should be left unsorted.
+.PP
+.SH "SEE ALSO"
+xfs(1), showfont(1), xlsfonts(1)
+.SH ENVIRONMENT
+.TP 8
+.B FONTSERVER
+to get the default host and port to use.
+.SH BUGS
+Doing ``fslsfonts \-l'' can tie up your server for a very long time.
+This is really a bug with single-threaded non-preemptable servers, not with
+this program.
+.SH AUTHOR
+Dave Lemke, Network Computing Devices, Inc