diff options
Diffstat (limited to 'xorg-server/hw/xfree86/utils/xorgcfg/help.c')
-rw-r--r-- | xorg-server/hw/xfree86/utils/xorgcfg/help.c | 1785 |
1 files changed, 0 insertions, 1785 deletions
diff --git a/xorg-server/hw/xfree86/utils/xorgcfg/help.c b/xorg-server/hw/xfree86/utils/xorgcfg/help.c deleted file mode 100644 index cd5c2c2f4..000000000 --- a/xorg-server/hw/xfree86/utils/xorgcfg/help.c +++ /dev/null @@ -1,1785 +0,0 @@ -/* - * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * 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 - * CONECTIVA LINUX 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 Conectiva Linux shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization from - * Conectiva Linux. - * - * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> - * - */ - -#include <X11/IntrinsicP.h> -#include <X11/StringDefs.h> -#include <X11/Shell.h> -#include <X11/Xaw/AsciiText.h> -#include <X11/Xaw/Command.h> -#include <X11/Xaw/Form.h> -#include <X11/Xaw/Paned.h> - -#include <X11/Xaw/Text.h> -#include <X11/Xaw/TextSinkP.h> -#include <X11/Xaw/TextSrcP.h> -#include <X11/Xmu/SysUtil.h> -#include <X11/Xmu/Xmu.h> -#include <stdlib.h> /* for bsearch() */ -#include <ctype.h> -#include "help.h" -#include "options.h" - -/* - * Prototypes - */ -static void CloseCallback(Widget, XtPointer, XtPointer); -static void StartHelp(void); -void Html_ModeStart(Widget); - -/* - * Initialization - */ -static Widget shell, text; -static Bool popped_up = False; - -/* - * Implementation - */ -void -Help(char *topic) -{ - Widget source; - char *str = NULL; - Bool error = False; - static char *def_text = "<h2>Help Error</h2>" - "No help available for the topic <b>%s</b>."; - XtResource resource = { - NULL, "HelpMessage", XtRString, sizeof(char*), - 0, XtRString, NULL - }; - - StartHelp(); - source = XawTextGetSource(text); - XawTextSourceClearEntities(source, 0, - XawTextSourceScan(source, 0, XawstAll, - XawsdRight, 1, True)); - if (topic != NULL) { - resource.resource_name = topic; - XtGetApplicationResources(shell, (XtPointer)&str, - &resource, 1, NULL, 0); - } - if (str == NULL) { - int len; - - error = True; - if (topic == NULL) - topic = "(null argument)"; - str = XtMalloc(len = strlen(topic) + strlen(def_text) + 1); - XmuSnprintf(str, len, def_text, topic); - } - XtVaSetValues(text, XtNstring, str, NULL); - if (error) - XtFree(str); - - Html_ModeStart(source); - _XawTextBuildLineTable((TextWidget)text, - XawTextTopPosition(text), True); - XawTextDisplay(text); - if (popped_up == False) { - popped_up = True; - XtPopup(shell, XtGrabNone); - XtSetKeyboardFocus(shell, text); - } -} - -static void -StartHelp(void) -{ - static XtResource resource = { - "properties", "Properties", XtRString, sizeof(char*), - 0, XtRString, NULL - }; - - if (shell == NULL) { - Widget pane, commands, close; - char *props; - XawTextPropertyList *propl; - - shell = XtCreatePopupShell("help", transientShellWidgetClass, - toplevel, NULL, 0); - pane = XtCreateManagedWidget("pane", panedWidgetClass, - shell, NULL, 0); - text = XtVaCreateManagedWidget("text", asciiTextWidgetClass, - pane, XtNeditType, XawtextRead, NULL); - commands = XtCreateManagedWidget("commands", formWidgetClass, pane, - NULL, 0); - close = XtCreateManagedWidget("close", commandWidgetClass, - commands, NULL, 0); - XtAddCallback(close, XtNcallback, CloseCallback, NULL); - XtRealizeWidget(shell); - XSetWMProtocols(DPY, XtWindow(shell), &wm_delete_window, 1); - XtGetApplicationResources(text, (XtPointer)&props, - &resource, 1, NULL, 0); - propl = XawTextSinkConvertPropertyList("html", props, - toplevel->core.screen, - toplevel->core.colormap, - toplevel->core.depth); - XtVaSetValues(XawTextGetSink(text), XawNtextProperties, propl, NULL); - } -} - -/*ARGSUSED*/ -static void -CloseCallback(Widget w, XtPointer user_data, XtPointer call_data) -{ - XtPopdown(shell); - popped_up = False; -} - -/*ARGSUSED*/ -void -HelpCancelAction(Widget w, XEvent *event, String *params, Cardinal *num_params) -{ - CloseCallback(w, NULL, NULL); -} - - -/* bellow is a modified version of the html-mode.c I wrote for xedit - * (at least) temporarily dead. - */ - -/* - * Copyright (c) 1999 by The XFree86 Project, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * 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 XFREE86 PROJECT 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 XFree86 Project 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 - * XFree86 Project. - * - * Author: Paulo César Pereira de Andrade - */ - -#define Html_Peek(parser) ((parser)->next) - -/* - * Types - */ -typedef struct _Html_Parser Html_Parser; -typedef struct _Html_Item Html_Item; - -typedef struct _Html_TagInfo { - char *name; - unsigned int entity : 1; /* it changes the type of the text */ - unsigned int nest : 1; /* does not close tags automatically */ - unsigned int end : 1; /* need a close markup */ - unsigned int adnl : 1; /* add newline before/after tag contents */ - unsigned int para : 1; /* changes the paragraph formatting */ - unsigned long mask; /* enforce use of attributes of this tag-info */ - unsigned long xlfd_mask; - void (*parse_args)(Html_Parser*, Html_Item*); - XawTextProperty *override; - XrmQuark ident; -} Html_TagInfo; - -struct _Html_Item { - XrmQuark ident; - XawTextPosition start, end; - Html_TagInfo *info; - - XawTextProperty *combine; - Bool override; - int li; - - XtPointer replace; - - Html_Item *parent, *child, *next; -}; - -struct _Html_Parser { - Widget source; - XawTextBlock block, replace; - XawTextPosition position, offset, start, end, last; - XrmQuark quark; - int i, ch, next; - Html_Item *item, *head; - XmuScanline *mask; - int space, pre, adnl, list, desc, column; - Bool spc; - XawTextBlock *entity; - - Pixel alink; -}; - -typedef struct _Html_SourceInfo Html_SourceInfo; -struct _Html_SourceInfo { - Widget source; - XawTextBlock block; - XawTextPosition last; - Html_SourceInfo *next; -}; - -/* - * Proptotypes - */ -void Html_ModeEnd(Widget); -static void Html_ModeInit(void); -static void Html_ParseCallback(Widget, XtPointer, XtPointer); -static Html_TagInfo *Html_GetInfo(char*); -static int Html_Get(Html_Parser*); -static int Html_Parse1(Html_Parser*); -static int Html_Parse2(Html_Parser*); -static void Html_ParseTag(Html_Parser*); -static void Html_Commit(Html_Parser*); -static void Html_AddEntities(Html_Parser*, Html_Item*); - -static int Html_Put(Html_Parser*, int); -static void Html_Puts(Html_Parser*, char*); -static int Html_Format1(Html_Parser*); -static int Html_Format2(Html_Parser*); -static int Html_Format3(Html_Parser*); -static void Html_FormatTag(Html_Parser*); - -static void Html_AArgs(Html_Parser*, Html_Item*); -static void Html_FontArgs(Html_Parser*, Html_Item*); - -/* - * Initialization - */ -static XrmQuark - Qbr, - Qdefault, - Qdd, - Qdl, - Qdt, - Qentity, - Qetag, - Qhide, - Qli, - Qol, - Qp, - Qpre, - Qspace, - Qtag, - Qul; - -static Html_TagInfo tag_info[] = { - {"a", 1, 0, 1, 0, 0, - 0, 0, - Html_AArgs}, - {"address", 1, 0, 1, 0, 0, - 0, XAW_TPROP_SLANT, - }, - {"b", 1, 0, 1, 0, 0, - 0, XAW_TPROP_WEIGHT, - }, - {"blockquote", 0, 1, 1, 1, 1, - 0, 0, - }, - {"body", 0, 0, 1, 0, 0, - 0, 0, - }, - {"br", 0, 0, 0, 0, 0, - }, - {"code", 1, 0, 1, 0, 0, - 0, XAW_TPROP_FAMILY | XAW_TPROP_PIXELSIZE, - }, - {"dd", 0, 1, 1, 0, 1, - 0, 0}, - {"dl", 0, 1, 1, 0, 0, - 0, 0, - }, - {"dt", 0, 0, 1, 0, 0, - 0, 0}, - {"em", 1, 0, 1, 0, 0, - 0, XAW_TPROP_SLANT, - }, - {"font", 1, 1, 1, 0, 0, - 0, 0, - Html_FontArgs}, - {"h1", 1, 0, 1, 1, 0, - 0, XAW_TPROP_WEIGHT | XAW_TPROP_PIXELSIZE, - }, - {"h2", 1, 0, 1, 1, 0, - 0, XAW_TPROP_WEIGHT | XAW_TPROP_PIXELSIZE, - }, - {"h3", 1, 0, 1, 1, 0, - 0, XAW_TPROP_WEIGHT | XAW_TPROP_PIXELSIZE, - }, - {"h4", 1, 0, 1, 1, 0, - 0, XAW_TPROP_WEIGHT | XAW_TPROP_PIXELSIZE, - }, - {"h5", 1, 0, 1, 1, 0, - 0, XAW_TPROP_WEIGHT | XAW_TPROP_PIXELSIZE, - }, - {"h6", 1, 0, 1, 1, 0, - 0, XAW_TPROP_WEIGHT | XAW_TPROP_PIXELSIZE, - }, - {"head", 0, 0, 1, 0, 0, - 0, 0, - }, - {"html", 0, 0, 1, 0, 0, - 0, 0, - }, - {"i", 1, 0, 1, 0, 0, - 0, XAW_TPROP_SLANT, - }, - {"kbd", 1, 0, 1, 0, 0, - 0, XAW_TPROP_FAMILY | XAW_TPROP_PIXELSIZE, - }, - {"li", 0, 0, 0, 0, 0, - 0, 0}, - {"ol", 0, 1, 1, 0, 1, - 0, 0, - }, - {"p", 0, 0, 0, 1, 0, - }, - {"pre", 1, 0, 1, 1, 0, - 0, XAW_TPROP_FAMILY | XAW_TPROP_PIXELSIZE, - }, - {"samp", 1, 0, 1, 0, 0, - 0, XAW_TPROP_FAMILY | XAW_TPROP_PIXELSIZE, - }, - {"strong", 1, 0, 1, 0, 0, - 0, XAW_TPROP_WEIGHT, - }, - {"tt", 1, 0, 1, 0, 0, - 0, XAW_TPROP_FAMILY | XAW_TPROP_PIXELSIZE, - }, - {"ul", 0, 1, 1, 0, 1, - 0, 0, - }, -}; - -static char *pnl = "<p>\n", *nlpnl = "\n<p>\n"; -static Html_SourceInfo *source_info; - -/* - * Implementation - */ -static char * -Html_GetText(Widget src, XawTextPosition position) -{ - char *result, *tempResult; - XawTextPosition offset = 0; - XawTextBlock text; - - tempResult = result = XtMalloc((unsigned)(position + 1)); - - while (offset < position) { - offset = XawTextSourceRead(src, offset, &text, position - offset); - if (!text.length) - break; - memcpy(tempResult, text.ptr, (unsigned)text.length); - tempResult += text.length; - } - - *tempResult = '\0'; - - return (result); -} - -void -Html_ModeStart(Widget src) -{ - Html_Parser *parser = XtNew(Html_Parser); - Html_Item *next, *item; - XColor color, exact; - Html_SourceInfo *info = XtNew(Html_SourceInfo); - - if (XAllocNamedColor(XtDisplay(toplevel), toplevel->core.colormap, - "blue", &color, &exact)) - parser->alink = color.pixel; - else - parser->alink = 0L; - - XtVaSetValues(src, XtNeditType, XawtextEdit, NULL); - - Html_ModeInit(); - - /* initialize parser state */ - parser->source = src; - parser->position = XawTextSourceRead(parser->source, 0, - &parser->block, 4096); - parser->replace.ptr = NULL; - parser->replace.firstPos = 0; - parser->replace.length = 0; - parser->replace.format = FMT8BIT; - parser->offset = -1; - parser->quark = NULLQUARK; - parser->i = 0; - parser->i = parser->ch = parser->next = 0; - parser->last = XawTextSourceScan(src, 0, XawstAll, XawsdRight, 1, 1); - if (parser->block.length == 0) - parser->ch = parser->next = EOF; - else - (void)Html_Get(parser); - parser->pre = 0; - parser->adnl = 1; - parser->list = parser->desc = parser->column = 0; - parser->spc = True; - - info->source = src; - info->block.ptr = Html_GetText(src, parser->last); - info->block.length = parser->last; - info->block.format = FMT8BIT; - info->block.firstPos = 0; - info->next = NULL; - if (source_info == NULL) - source_info = info; - else { - Html_SourceInfo *tmp = source_info; - - while (tmp->next) - tmp = tmp->next; - tmp->next = info; - } - - while (Html_Format1(parser) != EOF) - ; - XawTextSourceReplace(parser->source, 0, parser->last, &parser->replace); - XtFree(parser->replace.ptr); - - /* re-initialize parser state */ - parser->position = XawTextSourceRead(parser->source, 0, - &parser->block, 4096); - parser->offset = -1; - parser->quark = NULLQUARK; - parser->i = parser->ch = parser->next = 0; - parser->last = XawTextSourceScan(src, 0, XawstAll, XawsdRight, 1, 1); - info->last = parser->last; - if (parser->block.length == 0) - parser->ch = parser->next = EOF; - else - (void)Html_Get(parser); - parser->adnl = 1; - parser->list = parser->desc = parser->column = 0; - parser->spc = True; - parser->head = parser->item = NULL; - - parser->mask = XmuNewScanline(0, 0, 0); - - /* build html structure information */ - while (Html_Parse1(parser) != EOF) - ; - - /* create top level entity mask */ - (void)XmuScanlineNot(parser->mask, 0, parser->last); - - item = parser->item; - while (item) { - next = item->next; - Html_AddEntities(parser, item); - if (item->combine) - XtFree((XtPointer)item->combine); - XtFree((XtPointer)item); - item = next; - } - XmuDestroyScanline(parser->mask); - - XtVaSetValues(src, XtNeditType, XawtextRead, NULL); - - XtFree((XtPointer)parser); - - /* add callbacks for interactive changes */ - XtAddCallback(src, XtNpropertyCallback, Html_ParseCallback, NULL); -} - -void -Html_ModeEnd(Widget src) -{ - Html_SourceInfo *info, *pinfo; - - XtRemoveCallback(src, XtNpropertyCallback, Html_ParseCallback, NULL); - for (pinfo = info = source_info; info; pinfo = info, info = info->next) - if (info->source == src) - break; - - if (info == NULL) - return; - - XawTextSourceClearEntities(src, 0, info->last); - XtVaSetValues(src, XtNeditType, XawtextEdit, NULL); - XawTextSourceReplace(src, 0, info->last, &info->block); - XtVaSetValues(src, XtNeditType, XawtextRead, NULL); - - if (info == source_info) - source_info = source_info->next; - else - pinfo->next = info->next; - XtFree(info->block.ptr); - XtFree((XtPointer)info); -} - -static void -Html_ParseCallback(Widget w, XtPointer client_data, XtPointer call_data) -{ -} - -static int -bcmp_tag_info(_Xconst void *left, _Xconst void *right) -{ - return (strcmp((char*)left, ((Html_TagInfo*)right)->name)); -} - -static Html_TagInfo * -Html_GetInfo(char *name) -{ - return (bsearch(name, tag_info, sizeof(tag_info) / sizeof(tag_info[0]), - sizeof(Html_TagInfo), bcmp_tag_info)); -} - -static int -Html_Get(Html_Parser *parser) -{ - if (parser->ch == EOF) - return (EOF); - if (parser->i >= parser->block.length) { - parser->i = 0; - parser->position = XawTextSourceRead(parser->source, parser->position, - &parser->block, 4096); - } - parser->ch = parser->next; - if (parser->block.length == 0) - parser->next = EOF; - else - parser->next = (unsigned char)parser->block.ptr[parser->i++]; - parser->offset++; - - return (parser->ch); -} - -static void -Html_ModeInit(void) -{ - static int initialized; - int i; - - if (initialized) - return; - - Qbr = XrmPermStringToQuark("br"); - Qdd = XrmPermStringToQuark("dd"); - Qdefault = XrmPermStringToQuark("default"); - Qdl = XrmPermStringToQuark("dl"); - Qdt = XrmPermStringToQuark("dt"); - Qentity = XrmPermStringToQuark("entity"); - Qetag = XrmPermStringToQuark("/tag"); - Qhide = XrmPermStringToQuark("hide"); - Qli = XrmPermStringToQuark("li"); - Qol = XrmPermStringToQuark("ol"); - Qp = XrmPermStringToQuark("p"); - Qpre = XrmPermStringToQuark("pre"); - Qspace = XrmPermStringToQuark("space"); - Qtag = XrmPermStringToQuark("tag"); - Qul = XrmPermStringToQuark("ul"); - - for (i = 0; i < sizeof(tag_info) / sizeof(tag_info[0]); i++) - tag_info[i].ident = XrmPermStringToQuark(tag_info[i].name); - - initialized = True; -} - -/************************************************************************/ -/* PARSE */ -/************************************************************************/ -static void -Html_AddEntities(Html_Parser *parser, Html_Item *item) -{ - Html_Item *parent, *next, *child = item->child; - XmuSegment segment, *ent; - XmuScanline *mask = XmuNewScanline(0, 0, 0); - XawTextProperty *tprop, *property = NULL; - Widget sink; - Bool changed = False; - - /* combine properties */ - if (item->info && - (item->info->entity || - (item->parent && item->parent->ident != item->parent->info->ident))) { - sink = XawTextGetSink(text); - parent = item->parent; - property = XawTextSinkCopyProperty(sink, item->ident); - property->mask = item->info->mask; - property->xlfd_mask = item->info->xlfd_mask; - if (parent) { - (void)XawTextSinkCombineProperty(sink, property, - XawTextSinkGetProperty(sink, parent->ident), False); - if (item->combine && parent->combine) - (void)XawTextSinkCombineProperty(sink, item->combine, - parent->combine, - item->override); - } - if (item->combine) - XawTextSinkCombineProperty(sink, property, item->combine, True); - tprop = property; - property = XawTextSinkAddProperty(sink, property); - XtFree((XtPointer)tprop); - if (property && item->ident != property->identifier) { - item->ident = property->identifier; - changed = True; - } - } - - if (item->end < 0) { - if (item->next) - item->end = item->next->start; - else if (item->parent) - item->end = item->parent->end; - else - item->end = parser->last; - } - - while (child) { - next = child->next; - segment.x1 = child->start; - segment.x2 = child->end; - (void)XmuScanlineOrSegment(mask, &segment); - Html_AddEntities(parser, child); - if (child->combine) - XtFree((XtPointer)child->combine); - XtFree((XtPointer)child); - child = next; - } - - /* build entity mask */ - (void)XmuScanlineNot(mask, item->start, item->end); - (void)XmuScanlineAnd(mask, parser->mask); - - /* add entities */ - if (item->info && changed) { - for (ent = mask->segment; ent; ent = ent->next) - (void)XawTextSourceAddEntity(parser->source, 0, 0, NULL, ent->x1, - ent->x2 - ent->x1, item->ident); - } - else if (item->info == NULL) - (void)XawTextSourceAddEntity(parser->source, 0, - XAW_TENTF_READ | XAW_TENTF_REPLACE, - item->replace, item->start, - item->end - item->start, - item->parent->ident); - - /* set mask for parent entities */ - (void)XmuScanlineOr(parser->mask, mask); - XmuDestroyScanline(mask); - -#if 0 - if (item->info && item->info->para) { - XawTextSourceSetParagraph(parser->source, item->start, item->end, - 40, /* arbitrary value, for testing */ - 0, 0); - } -#endif -} - -static void -Html_Commit(Html_Parser *parser) -{ - XawTextPosition position; - int length; - - position = parser->start; - length = parser->end - parser->start; - if (position < 0) { - length += position; - position = 0; - } - if (position + length > parser->last + 1) - length -= (position + length) - parser->last + 1; - - if (parser->quark != Qdefault && parser->quark != NULLQUARK && length > 0) { - XmuSegment segment; - Html_Item *head = parser->head; - XrmQuark quark = parser->quark; - - parser->quark = Qdefault; - - if (quark == Qli && head && - (head->info->ident == Qol || head->info->ident == Qul)) { - if (parser->head == NULL || head->info->ident != Qol) - XawTextSourceAddEntity(parser->source, 0, /*XAW_TENT_BULLET,*/ - XAW_TENTF_HIDE, NULL, - position, length, Qli); - else - XawTextSourceAddEntity(parser->source, 0, /*XAW_TENT_LITEM,*/ - XAW_TENTF_HIDE, - (XtPointer)(long)head->li++, - position, length, Qli); - } - else if (quark == Qhide) - XawTextSourceAddEntity(parser->source, 0, XAW_TENTF_HIDE, NULL, - position, length, quark); - else if (quark == Qentity) { - if (head && head->end == -1) { - Html_Item *item, *it; - - item = XtNew(Html_Item); - item->ident = Qentity; - item->start = position; - item->end = position + length; - item->info = NULL; - item->combine = NULL; - item->override = False; - item->replace = (XtPointer)parser->entity; - item->child = item->next = NULL; - - it = head->child; - - item->parent = head; - if (it == NULL) - head->child = item; - else { - while (it->next) - it = it->next; - it->next = item; - } - - return; - } - XawTextSourceAddEntity(parser->source, 0, - XAW_TENTF_READ | XAW_TENTF_REPLACE, - (XtPointer)parser->entity, - position, length, Qentity); - } - - segment.x1 = position; - segment.x2 = position + length; - (void)XmuScanlineOrSegment(parser->mask, &segment); - } -} - -static void -Html_ParseTag(Html_Parser *parser) -{ - int ch, sz; - char buf[32]; - Html_TagInfo *info; - Html_Item *item = NULL; - XawTextPosition offset = parser->offset - 1; - - switch (Html_Peek(parser)) { - case '!': - (void)Html_Get(parser); /* eat `!' */ - if (Html_Peek(parser) == '-') { - /* comment */ - (void)Html_Get(parser); /* eat `-' */ - if (Html_Peek(parser) == '-') { - int count = 0; - - (void)Html_Get(parser); - while ((ch = Html_Peek(parser)) != EOF) { - if (ch == '>' && count >= 2) - break; - else if (ch == '-') - ++count; - else - count = 0; - (void)Html_Get(parser); - } - } - } - break; - case '?': - break; - case '/': - (void)Html_Get(parser); /* eat `/' */ - sz = 0; - while (isalnum(Html_Peek(parser)) && - ((sz + 1) < sizeof(buf))) - buf[sz++] = tolower(Html_Get(parser)); - buf[sz] = '\0'; - if ((info = Html_GetInfo(buf)) != NULL) { - if (parser->head) { - Html_Item *it = parser->head; - - while (it) { - if (it->info == info) - break; - it = it->parent; - } - - if (it) { - if (it == parser->head) - parser->head->end = offset; - else { - it->end = offset; - do { - parser->head->end = offset; - parser->head = parser->head->parent; - } while (parser->head != it); - } - if (parser->head->parent) - parser->head = parser->head->parent; - else - parser->head = parser->item; - } - } - } - break; - default: - sz = 0; - while (isalnum(Html_Peek(parser)) && - ((sz + 1) < sizeof(buf))) - buf[sz++] = tolower(Html_Get(parser)); - buf[sz] = '\0'; - if ((info = Html_GetInfo(buf)) != NULL) { - if (info->end == False) { - if (info->ident == Qli) - parser->quark = Qli; - if (!info->para) - break; /* no more processing required */ - } - item = XtNew(Html_Item); - item->info = info; - item->ident = item->info->ident; - item->combine = NULL; - item->override = False; - item->start = item->end = -1; - if (info->ident == Qol) - item->li = 1; - else - item->li = 0; - item->parent = item->child = item->next = NULL; - if (parser->item == NULL) - parser->item = parser->head = item; - else if (parser->head->end == -1) { - if (parser->head->info != item->info || info->nest) { - Html_Item *it = parser->head; - - /* first, see if we need to close a long list of tags */ - if (info->ident == Qdd) { - if (parser->head && - parser->head->info->ident == Qdt) { - parser->head->end = offset; - parser->head = parser->head->parent; - } - } - else if (info->ident == Qdt) { - if (parser->head && - parser->head->info->ident == Qdd) { - parser->head->end = offset; - parser->head = parser->head->parent; - } - } - else if (!info->nest) { - while (it) { - if (it->info == info || it->info->end) - break; - it = it->parent; - } - if (it) { - /* close the items */ - while (parser->head != it) { - if (parser->head->info->ident == Qpre) - --parser->pre; - parser->head->end = offset; - parser->head = parser->head->parent; - } - } - } - - /* add child item */ - it = parser->head->child; - - item->parent = parser->head; - if (it == NULL) - parser->head->child = item; - else { - while (it->next) - it = it->next; - it->next = item; - } - parser->head = item; - } - else { - /* close the `head' item and start a new one */ - Html_Item *it; - - parser->head->end = offset; - if (parser->head->parent) - parser->head = parser->head->parent; - else - parser->head = parser->item; - - if ((it = parser->head->child) != NULL) { - item->parent = parser->head; - while (it->next) - it = it->next; - it->next = item; - parser->head = item; - } - else { - parser->head->child = item; - parser->head = item; - } - } - } - else { - /* this is not common, but handle it */ - Html_Item *it = parser->item; - - while (it->next) - it = it->next; - it->next = item; - parser->head = item; - } - if (info->parse_args) - (info->parse_args)(parser, item); - } - break; - } - - /* skip anything not processed */ - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) - (void)Html_Get(parser); - if (item && item->start == -1) - item->start = parser->offset + 1; -} - -/* tags */ -static int -Html_Parse2(Html_Parser *parser) -{ - int ch; - - for (;;) { - if ((ch = Html_Get(parser)) == '<') { - parser->end = parser->offset - 1; - Html_Commit(parser); - parser->quark = Qhide; - parser->start = parser->end; - - Html_ParseTag(parser); - - (void)Html_Get(parser); /* eat `>' */ - parser->end = parser->offset; - Html_Commit(parser); - } - else - return (ch); - } - /*NOTREACHED*/ -} - -/* entities */ -static int -Html_Parse1(Html_Parser *parser) -{ - static XawTextBlock *entities[256]; - static char chars[256]; - int ch; - - for (;;) { - if ((ch = Html_Parse2(parser)) == EOF) - return (EOF); - - if (ch == '&') { - unsigned char idx = '?'; - char buf[32]; - int sz = 0; - - /* the string comparisons need a big optmization! */ - parser->end = parser->offset - 1; - Html_Commit(parser); - parser->start = parser->end; - while ((ch = Html_Peek(parser)) != ';' - && ch != EOF && !isspace(ch)) { - ch = Html_Get(parser); - if (sz + 1 < sizeof(buf)) - buf[sz++] = ch; - } - buf[sz] = '\0'; - if (ch == ';') - (void)Html_Get(parser); - if (sz == 0) - idx = '&'; - else if (strcasecmp(buf, "lt") == 0) - idx = '<'; - else if (strcasecmp(buf, "gt") == 0) - idx = '>'; - else if (strcasecmp(buf, "nbsp") == 0) - idx = ' '; - else if (strcasecmp(buf, "amp") == 0) - idx = '&'; - else if (strcasecmp(buf, "quot") == 0) - idx = '"'; - else if (*buf == '#') { - if (sz == 1) - idx = '#'; - else { - char *tmp; - - idx = strtol(buf + 1, &tmp, 10); - if (*tmp) - idx = '?'; - } - } - else if (strcmp(buf + 1, "acute") == 0) { - switch (*buf) { - case 'a': idx = 0xe1; break; case 'e': idx = 0xe9; break; - case 'i': idx = 0xed; break; case 'o': idx = 0xf3; break; - case 'u': idx = 0xfa; break; case 'A': idx = 0xc1; break; - case 'E': idx = 0xc9; break; case 'I': idx = 0xcd; break; - case 'O': idx = 0xd3; break; case 'U': idx = 0xda; break; - case 'y': idx = 0xfd; break; case 'Y': idx = 0xdd; break; - } - } - else if (strcmp(buf + 1, "grave") == 0) { - switch (*buf) { - case 'a': idx = 0xe0; break; case 'e': idx = 0xe8; break; - case 'i': idx = 0xec; break; case 'o': idx = 0xf2; break; - case 'u': idx = 0xf9; break; case 'A': idx = 0xc0; break; - case 'E': idx = 0xc8; break; case 'I': idx = 0xcc; break; - case 'O': idx = 0xd2; break; case 'U': idx = 0xd9; break; - } - } - else if (strcmp(buf + 1, "tilde") == 0) { - switch (*buf) { - case 'a': idx = 0xe3; break; case 'o': idx = 0xf5; break; - case 'n': idx = 0xf1; break; case 'A': idx = 0xc3; break; - case 'O': idx = 0xd5; break; case 'N': idx = 0xd1; break; - } - } - else if (strcmp(buf + 1, "circ") == 0) { - switch (*buf) { - case 'a': idx = 0xe2; break; case 'e': idx = 0xea; break; - case 'i': idx = 0xee; break; case 'o': idx = 0xf4; break; - case 'u': idx = 0xfb; break; case 'A': idx = 0xc2; break; - case 'E': idx = 0xca; break; case 'I': idx = 0xce; break; - case 'O': idx = 0xd4; break; case 'U': idx = 0xdb; break; - } - } - else if (strcmp(buf + 1, "uml") == 0) { - switch (*buf) { - case 'a': idx = 0xe4; break; case 'e': idx = 0xeb; break; - case 'i': idx = 0xef; break; case 'o': idx = 0xf6; break; - case 'u': idx = 0xfc; break; case 'A': idx = 0xc4; break; - case 'E': idx = 0xcb; break; case 'I': idx = 0xfc; break; - case 'O': idx = 0xd6; break; case 'U': idx = 0xdc; break; - case 'y': idx = 0xff; break; - } - } - else if (strcmp(buf + 1, "cedil") == 0) { - switch (*buf) { - case 'c': idx = 0xe7; break; case 'C': idx = 0xc7; break; - } - } - else if (strcmp(buf + 1, "slash") == 0) { - switch (*buf) { - case 'o': idx = 0xf8; break; case 'O': idx = 0xd8; break; - } - } - else if (strcmp(buf + 1, "ring") == 0) { - switch (*buf) { - case 'a': idx = 0xe5; break; case 'A': idx = 0xc5; break; - } - } - else if (strcasecmp(buf, "iexcl") == 0) - idx = 0xa1; - else if (strcasecmp(buf, "cent") == 0) - idx = 0xa2; - else if (strcasecmp(buf, "pound") == 0) - idx = 0xa3; - else if (strcasecmp(buf, "curren") == 0) - idx = 0xa4; - else if (strcasecmp(buf, "yen") == 0) - idx = 0xa5; - else if (strcasecmp(buf, "brvbar") == 0) - idx = 0xa6; - else if (strcasecmp(buf, "sect") == 0) - idx = 0xa7; - else if (strcasecmp(buf, "uml") == 0) - idx = 0xa8; - else if (strcasecmp(buf, "copy") == 0) - idx = 0xa9; - else if (strcasecmp(buf, "ordf") == 0) - idx = 0xaa; - else if (strcasecmp(buf, "laquo") == 0) - idx = 0xab; - else if (strcasecmp(buf, "not") == 0) - idx = 0xac; - else if (strcasecmp(buf, "shy") == 0) - idx = 0xad; - else if (strcasecmp(buf, "reg") == 0) - idx = 0xae; - else if (strcasecmp(buf, "macr") == 0) - idx = 0xaf; - else if (strcasecmp(buf, "deg") == 0) - idx = 0xb0; - else if (strcasecmp(buf, "plusmn") == 0) - idx = 0xb1; - else if (strcasecmp(buf, "sup2") == 0) - idx = 0xb2; - else if (strcasecmp(buf, "sup3") == 0) - idx = 0xb3; - else if (strcasecmp(buf, "acute") == 0) - idx = 0xb4; - else if (strcasecmp(buf, "micro") == 0) - idx = 0xb5; - else if (strcasecmp(buf, "para") == 0) - idx = 0xb6; - else if (strcasecmp(buf, "middot") == 0) - idx = 0xb7; - else if (strcasecmp(buf, "cedil") == 0) - idx = 0xb8; - else if (strcasecmp(buf, "supl") == 0) - idx = 0xb9; - else if (strcasecmp(buf, "ordm") == 0) - idx = 0xba; - else if (strcasecmp(buf, "raquo") == 0) - idx = 0xbb; - else if (strcasecmp(buf, "frac14") == 0) - idx = 0xbc; - else if (strcasecmp(buf, "frac12") == 0) - idx = 0xbd; - else if (strcasecmp(buf, "frac34") == 0) - idx = 0xbe; - else if (strcasecmp(buf, "iquest") == 0) - idx = 0xbf; - else if (strcasecmp(buf, "AElig") == 0) - idx = 0xc6; - else if (strcasecmp(buf, "ETH") == 0) - idx = 0xd0; - else if (strcasecmp(buf, "THORN") == 0) - idx = 0xde; - else if (strcasecmp(buf, "szlig") == 0) - idx = 0xdf; - else if (strcasecmp(buf, "aelig") == 0) - idx = 0xe6; - else if (strcasecmp(buf, "eth") == 0) - idx = 0xf0; - else if (strcasecmp(buf, "thorn") == 0) - idx = 0xfe; - - parser->quark = Qentity; - if (entities[idx] == NULL) { - entities[idx] = XtNew(XawTextBlock); - entities[idx]->firstPos = 0; - entities[idx]->length = 1; - entities[idx]->ptr = chars + idx; - entities[idx]->format = FMT8BIT; - chars[idx] = idx; - } - parser->entity = entities[idx]; - parser->end = parser->offset; - Html_Commit(parser); - parser->start = parser->end; - } - } - /*NOTREACHED*/ -} - -/************************************************************************/ -/* FORMAT */ -/************************************************************************/ -static int -Html_Put(Html_Parser *parser, int ch) -{ - if (ch != '\r') { - if (parser->replace.length % 4096 == 0) - parser->replace.ptr = XtRealloc(parser->replace.ptr, - parser->replace.length + 4096); - parser->replace.ptr[parser->replace.length++] = ch; - } - - return (ch); -} - -static void -Html_Puts(Html_Parser *parser, char *str) -{ - int len = strlen(str); - - if (parser->replace.length % 4096 == 0 || - parser->replace.length + len > parser->replace.length + - (4096 - (parser->replace.length % 4096))) - parser->replace.ptr = XtRealloc(parser->replace.ptr, - parser->replace.length + 4096); - memcpy(parser->replace.ptr + parser->replace.length, str, len); - parser->replace.length += len; -} - -static void -Html_FormatTag(Html_Parser *parser) -{ - int ch = 0, sz = 0; - char buf[32]; - Html_TagInfo *info = NULL; - - switch (Html_Peek(parser)) { - case '!': - Html_Put(parser, '<'); - Html_Put(parser, Html_Get(parser)); /* eat `!' */ - if (Html_Peek(parser) == '-') { - /* comment */ - Html_Put(parser, Html_Get(parser)); /* eat `-' */ - if (Html_Peek(parser) == '-') { - int count = 0; - - Html_Put(parser, Html_Get(parser)); - while ((ch = Html_Peek(parser)) != EOF) { - if (ch == '>' && count >= 2) - break; - else if (ch == '-') - ++count; - else - count = 0; - Html_Put(parser, Html_Get(parser)); - } - (void)Html_Get(parser); /* eat `>' */ - Html_Put(parser, '>'); - return; - } - } - break; - case '?': - Html_Put(parser, '<'); - break; - case '/': - (void)Html_Get(parser); /* eat `/' */ - while (isalnum(Html_Peek(parser)) && - ((sz + 1) < sizeof(buf))) - buf[sz++] = ch = tolower(Html_Get(parser)); - buf[sz] = '\0'; - if ((info = Html_GetInfo(buf)) != NULL && info->adnl) { - if (info->ident == Qpre && parser->pre) { - if (--parser->pre == 0) - parser->column = 0; - } - parser->quark = Qetag; - parser->spc = True; - if (info->ident == Qp) { - while ((ch = Html_Peek(parser) != '>' && ch != EOF)) - (void)Html_Get(parser); - (void)Html_Get(parser); /* eat '>' */ - return; - } - } - else if (info) { - if (info->ident == Qol || info->ident == Qul) { - if (parser->list && --parser->list == 0 && - parser->desc == 0) { - parser->quark = Qetag; - Html_Put(parser, '\n'); - ++parser->adnl; - parser->column = 0; - } - } - else if (info->ident == Qdl) { - if (parser->desc && --parser->desc == 0 && - parser->list == 0) { - parser->quark = Qetag; - Html_Put(parser, '\n'); - ++parser->adnl; - parser->column = 0; - } - } - } - Html_Puts(parser, "</"); - Html_Puts(parser, buf); - break; - default: - while (isalnum(Html_Peek(parser)) && - ((sz + 1) < sizeof(buf))) - buf[sz++] = tolower(Html_Get(parser)); - buf[sz] = '\0'; - if ((info = Html_GetInfo(buf)) != NULL && info->adnl) { - if (info->ident == Qpre) - ++parser->pre; - if (parser->quark != Qtag) { - if (parser->adnl < 2) { - Html_Puts(parser, parser->adnl ? pnl : nlpnl); - parser->adnl = 2; - parser->spc = True; - parser->column = 0; - } - } - parser->quark = Qtag; - if (info->ident == Qp) { - while ((ch = Html_Peek(parser) != '>' && ch != EOF)) - (void)Html_Get(parser); - (void)Html_Get(parser); /* eat '>' */ - return; - } - } - else if (info) { - if (info->ident == Qol || info->ident == Qul) { - if (++parser->list == 1 && !parser->desc) { - if (parser->adnl < 2) { - Html_Puts(parser, parser->adnl ? pnl : nlpnl); - parser->adnl = 2; - parser->column = 0; - } - } - else if (parser->adnl == 0) { - Html_Put(parser, '\n'); - parser->adnl = 1; - parser->column = 0; - } - parser->spc = True; - } - else if (info->ident == Qli) { - if (parser->adnl == 0) { - Html_Put(parser, '\n'); - parser->adnl = 1; - parser->column = 0; - } - } - - else if (info->ident == Qdl) { - if (++parser->desc == 1 && !parser->list) { - if (parser->adnl < 2) { - Html_Puts(parser, parser->adnl ? pnl : nlpnl); - parser->adnl = 2; - parser->column = 0; - } - } - else if (parser->adnl == 0) { - Html_Put(parser, '\n'); - parser->adnl = 1; - parser->column = 0; - } - parser->spc = True; - } - else if (info->ident == Qdd) { - if (parser->desc == 0) { - if (parser->adnl < 2) { - Html_Puts(parser, parser->adnl ? pnl : nlpnl); - parser->adnl = 2; - parser->column = 0; - } - } - else if (parser->adnl == 0) { - Html_Put(parser, '\n'); - parser->adnl = 1; - parser->column = 0; - } - parser->spc = True; - } - else if (info->ident == Qdt) { - if (parser->adnl == 0) { - Html_Put(parser, '\n'); - parser->adnl = 1; - parser->spc = True; - parser->column = 0; - } - } - } - Html_Put(parser, '<'); - Html_Puts(parser, buf); - break; - } - - sz = 0; - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) { - if (isspace(ch)) { - (void)Html_Get(parser); - ++sz; - continue; - } - else if (sz) { - Html_Put(parser, ' '); - sz = 0; - } - Html_Put(parser, Html_Get(parser)); - } - Html_Put(parser, Html_Get(parser)); /* eat `>' */ - if (info && info->ident == Qbr) { - ++parser->adnl; - parser->spc = True; - Html_Put(parser, '\n'); - parser->quark = info->ident; - parser->column = 0; - } -} - -/* tags */ -static int -Html_Format3(Html_Parser *parser) -{ - int ch; - - for (;;) { - if ((ch = Html_Get(parser)) == '<') { - if (parser->quark == Qspace && parser->spc == False) { - Html_Put(parser, ' '); - parser->spc = True; - } - -/* parser->quark = Qhide;*/ - Html_FormatTag(parser); - } - else - return (ch); - } - /*NOTREACHED*/ -} - -/* entities */ -static int -Html_Format2(Html_Parser *parser) -{ - int ch; - - for (ch = Html_Format3(parser); ch == '&'; ch = Html_Format3(parser)) { - Html_Put(parser, '&'); - while ((ch = Html_Peek(parser)) != ';') { - if (isspace(ch) || ch == EOF) - break; - Html_Put(parser, Html_Get(parser)); - } - if (ch != EOF) - Html_Put(parser, Html_Get(parser)); - else - break; - if (parser->pre) - ++parser->column; - } - - return (ch); -} - -/* spaces */ -static int -Html_Format1(Html_Parser *parser) -{ - int ch; - - for (;;) { - if ((ch = Html_Format2(parser)) == EOF) - return (ch); - - if (parser->quark == Qetag) { - if (parser->adnl < 2) { - Html_Puts(parser, parser->adnl ? pnl : nlpnl); - parser->adnl = 2; - parser->spc = True; - } - } - else if (parser->quark == Qspace && parser->spc == False) { - Html_Put(parser, ' '); - parser->spc = True; - } - - if (!parser->pre && isspace(ch)) - parser->quark = Qspace; - else { - if (parser->pre) { - if (parser->spc) { - /* did not yet see any non space character */ - if (isspace(ch)) { - if (ch == '\n') { - parser->column = 0; - parser->spc = False; - parser->adnl = 1; - } - else if (ch == '\t') - parser->column += 8 - (parser->column % 8); - else - ++parser->column; - continue; - } - else { - int column = parser->column; - - while (column-- > 0) - Html_Put(parser, ' '); - parser->spc = False; - parser->adnl = 0; - } - } - else if (ch == '\n') { - ++parser->adnl; - parser->column = 0; - } - else if (ch == '\t') { - int column = parser->column + (8 - (parser->column % 8)); - - parser->adnl = 0; - while (parser->column < column) { - Html_Put(parser, ' '); - ++parser->column; - } - continue; - } - else { - parser->adnl = 0; - ++parser->column; - } - } - else - parser->adnl = 0; - Html_Put(parser, ch); - parser->quark = Qdefault; - parser->spc = False; - } - } -} - -/************************************************************************/ -/* ARGUMENTS */ -/************************************************************************/ -static void -Html_AArgs(Html_Parser *parser, Html_Item *item) -{ - int ch, sz; - char buf[32]; - - /*CONSTCOND*/ - while (True) { - sz = 0; - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) { - if (isalnum(ch)) - break; - else - (void)Html_Get(parser); - } - - if (ch == '>' || ch == EOF) - return; - buf[sz++] = tolower(Html_Get(parser)); - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) - if (isalnum(ch)) - buf[sz++] = tolower(Html_Get(parser)); - else - break; - buf[sz] = '\0'; - if (strcmp(buf, "href") == 0) { - item->combine = XawTextSinkCopyProperty(XawTextGetSink(text), - item->info->ident); - item->override = True; - item->combine->xlfd_mask = 0L; - item->combine->mask = XAW_TPROP_UNDERLINE | XAW_TPROP_FOREGROUND; - item->combine->foreground = parser->alink; - return; - } - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) { - if (isspace(ch)) - break; - else - (void)Html_Get(parser); - } - } -} - -static void -Html_FontArgs(Html_Parser *parser, Html_Item *item) -{ - int ch, sz; - char name[32], value[256], xlfd[128]; - - item->combine = XawTextSinkCopyProperty(XawTextGetSink(text), - Qdefault); - item->override = True; - item->combine->mask = item->combine->xlfd_mask = 0L; - - /*CONSTCOND*/ - while (True) { - /* skip white spaces */ - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) { - if (isalnum(ch)) - break; - else - (void)Html_Get(parser); - } - - if (ch == '>' || ch == EOF) - return; - - /* read option name */ - sz = 0; - name[sz++] = tolower(Html_Get(parser)); - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) - if (isalnum(ch) && (sz + 1 < sizeof(name))) - name[sz++] = tolower(Html_Get(parser)); - else - break; - name[sz] = '\0'; - - if (ch != '=') - continue; - (void)Html_Get(parser); /* skip `=' */ - if (Html_Peek(parser) == '"') - (void)Html_Get(parser); - - sz = 0; - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) { - if (!isspace(ch) && (sz + 1 < sizeof(value))) - value[sz++] = Html_Get(parser); - else - break; - } - value[sz] = '\0'; - if (sz > 0 && value[sz - 1] == '"') - value[--sz] = '\0'; - - if (strcmp(name, "color") == 0) { - XColor color, exact; - - if (XAllocNamedColor(XtDisplay(toplevel), toplevel->core.colormap, - value, &color, &exact)) { - item->combine->mask |= XAW_TPROP_FOREGROUND; - item->combine->foreground = color.pixel; - } - } - else if (strcmp(name, "face") == 0) { - int count = 0; - char *ptr, *family, **font_list; - - ptr = value; - do { - family = ptr; - ptr = strchr(ptr, ','); - if (ptr) - *ptr++ = '\0'; - XmuSnprintf(xlfd, sizeof(xlfd), "-*-%s-*-*-*-*-*-*-*-*-*-*-*-*", - family); - font_list = XListFonts(XtDisplay(toplevel), xlfd, 1, &count); - if (font_list) - XFreeFontNames(font_list); - if (count) - break; - } while (ptr); - if (count) { - item->combine->xlfd_mask |= XAW_TPROP_FAMILY; - item->combine->family = XrmStringToQuark(family); - } - } - else if (strcmp(name, "size") == 0) { - int size, sign = 0; - - if (isalnum(*value)) { - size = atoi(value); - sign = 0; - } - else { - char *str = XrmQuarkToString(item->combine->pixel_size); - - size = str ? atoi(str) : 12; - if (*value == '+') { - size += atoi(value + 1); - sign = 1; - } - else if (*value == '-') { - size -= atoi(value + 1); - sign = -1; - } - } - - if (item->combine->xlfd != NULLQUARK) { - int count, ucount, dcount, usize, dsize; - char **current, **result, **up, **down; - - current = result = up = down = NULL; - /* try to load an appropriate font */ - XmuSnprintf(value, sizeof(value), - "-*-%s-%s-%s-*--%%d-*-*-*-*-*-%s-%s", - XrmQuarkToString(item->combine->family), - XrmQuarkToString(item->combine->weight), - XrmQuarkToString(item->combine->slant), - XrmQuarkToString(item->combine->registry), - XrmQuarkToString(item->combine->encoding)); - XmuSnprintf(xlfd, sizeof(xlfd), value, - atoi(XrmQuarkToString(item->combine->pixel_size))); - current = XListFonts(XtDisplay(toplevel), xlfd, 1, &count); - if (count) { - ucount = dcount = usize = dsize = 0; - - XmuSnprintf(xlfd, sizeof(xlfd), value, size); - result = XListFonts(XtDisplay(toplevel), xlfd, 1, &count); - if (count == 0 || strstr(*result, "-0-")) { - if (sign <= 0) { - sz = dsize = size; - while (dcount == 0 && --sz > size - 8 && sz > 1) { - XmuSnprintf(xlfd, sizeof(xlfd), value, sz); - down = XListFonts(XtDisplay(toplevel), xlfd, - 1, &dcount); - if (dcount && strstr(*down, "-0-") != NULL) { - XFreeFontNames(down); - down = NULL; - dcount = 0; - } - } - if (dcount) - dsize = sz; - } - if (sign >= 0) { - sz = usize = size; - while (ucount == 0 && ++sz < size + 8) { - XmuSnprintf(xlfd, sizeof(xlfd), value, sz); - up = XListFonts(XtDisplay(toplevel), xlfd, - 1, &ucount); - if (ucount && strstr(*up, "-0-") != NULL) { - XFreeFontNames(up); - up = NULL; - ucount = 0; - } - } - if (ucount) - usize = sz; - } - if (ucount && dcount) - size = size - dsize < usize - size ? dsize : usize; - else if (ucount) - size = usize; - else if (dcount) - size = dsize; - } - if (current) - XFreeFontNames(current); - if (result) - XFreeFontNames(result); - if (up) - XFreeFontNames(up); - if (down) - XFreeFontNames(down); - } - } - - XmuSnprintf(value, sizeof(value), "%d", size); - item->combine->xlfd_mask |= XAW_TPROP_PIXELSIZE; - item->combine->pixel_size = XrmStringToQuark(value); - } - - while ((ch = Html_Peek(parser)) != '>' && ch != EOF) { - if (isspace(ch)) - break; - else - (void)Html_Get(parser); - } - } -} |