/*==================================================================*/ /* */ /* SGMLAnchorTextObject */ /* */ /* T.Johnson - (TonyJ@Slacvx.Slac.Stanford.Edu) June.92 */ /* */ /* Defines a anchortext segment for the SGMLHyper widget */ /* */ /* Revision history: */ /* */ /* Nov 29 1992 Temporary hack to support quoted urls. TonyJ */ /* */ /*==================================================================*/ #ifdef VAX #include ctype #endif #include #include #include #include "SGMLAnchorTextP.h" #include /* Private functions */ /* Widget class methods */ static void Initialize(); static void Destroy(); #define Offset(field) XtOffsetOf(SGMLAnchorTextRec,sgml_anchortext.field) static XtResource resources[] = { {SGMLNhref, SGMLCHref, XtRString, sizeof(String), Offset(href), XtRString, ""}, {SGMLNname, SGMLCName, XtRString, sizeof(String), Offset(name), XtRString, ""}, {SGMLNhrefLength, SGMLCHrefLength, XtRInt, sizeof(int), Offset(href_length), XtRImmediate, 0}, {SGMLNnameLength, SGMLCNameLength, XtRInt, sizeof(int), Offset(name_length), XtRImmediate, 0} }; #undef Offset /*---------------------------------------------------------------*/ /* Static initialisation of the class record */ /*---------------------------------------------------------------*/ SGMLAnchorTextClassRec sGMLAnchorTextClassRec = { { (WidgetClass) &sGMLFormattedTextClassRec, /* superclass */ "SGMLAnchorText", /* class_name */ sizeof(SGMLAnchorTextRec), /* widget_size */ NULL, /* class_initialize */ NULL, /* class_part_initialize */ FALSE, /* class_inited */ Initialize, /* initialize */ NULL, /* initialize_hook */ NULL, /* obj1 */ NULL, /* obj2 */ 0, /* obj3 */ resources, /* resources */ XtNumber(resources), /* num_resources */ NULLQUARK, /* xrm_class */ 0, /* obj4 */ 0, /* obj5 */ 0, /* obj6 */ 0, /* obj7 */ Destroy, /* destroy */ NULL, /* obj8 */ NULL, /* obj9 */ NULL, /* set_values */ NULL, /* set_values_hook */ NULL, /* obj10 */ NULL, /* get_values_hook */ NULL, /* obj11 */ XtVersion, /* version */ NULL, /* callback private */ NULL, /* obj12 */ NULL, /* obj13 */ NULL, /* obj14 */ NULL, /* extension */ }, { SGMLInheritComputeSize, /* compute_size */ SGMLInheritAdjustSize, /* adjust_size */ SGMLInheritAdjustPosition, /* adjust_position */ SGMLInheritExpose, /* expose */ SGMLInheritActivate, /* activate */ SGMLInheritHilite, /* hilite */ SGMLInheritContains, /* contains */ SGMLInheritCallCreateCallback, /* call_create_callback */ SGMLInheritCallMapCallback, /* call_map_callback */ SGMLInheritMakeVisible, /* make_visible */ NULL, /* extension */ } }; WidgetClass sGMLAnchorTextObjectClass = (WidgetClass) &sGMLAnchorTextClassRec; /*--------------------------------------------------------------*/ /* Initialize: */ /*--------------------------------------------------------------*/ static void Initialize (request, new) SGMLAnchorTextObject request, new; { char *key1 = "href"; char *key2 = "name"; char *whiteSpace = " \t"; char *delim = " \n\t"; char *delim2 = "\""; char quote = '"'; char equal = '='; char *p, *q; int l; q = XtNewString(new->sgml_text.param); for (p = q ; *p != '\0' ; p++) if (isupper(*p)) *p = tolower(*p); p = strstr(q,key1); if (p) { p += strlen(key1); p += strspn(p,whiteSpace); if (*p++ == equal) { p += strspn(p,whiteSpace); if (*p == quote) { p++; new->sgml_anchortext.href_length = l = strcspn(p,delim2); new->sgml_anchortext.href = strncpy((char *)XtMalloc(l+1),new->sgml_text.param+(p-q),l); *(new->sgml_anchortext.href + l) = '\0'; } else { new->sgml_anchortext.href_length = l = strcspn(p,delim); new->sgml_anchortext.href = strncpy((char *)XtMalloc(l+1),new->sgml_text.param+(p-q),l); *(new->sgml_anchortext.href + l) = '\0'; } } else new->sgml_anchortext.href = XtNewString(""); } else new->sgml_anchortext.href = XtNewString(""); p = strstr(q,key2); if (p) { p += strlen(key2); p += strspn(p,whiteSpace); if (*p++ == equal) { p += strspn(p,whiteSpace); if (*p == quote) { p++; new->sgml_anchortext.name_length = l = strcspn(p,delim2); new->sgml_anchortext.name = strncpy((char *)XtMalloc(l+1),new->sgml_text.param+(p-q),l); *(new->sgml_anchortext.name + l) = '\0'; } else { new->sgml_anchortext.name_length = l = strcspn(p,delim); new->sgml_anchortext.name = strncpy((char *)XtMalloc(l+1),new->sgml_text.param+(p-q),l); *(new->sgml_anchortext.name + l) = '\0'; } } else new->sgml_anchortext.name = XtNewString(""); } else new->sgml_anchortext.name = XtNewString(""); XtFree(q); } /*--------------------------------------------------------------*/ /* Destroy the widget: release all memory allocated */ /*--------------------------------------------------------------*/ static void Destroy (w) SGMLAnchorTextObject w; { XtFree(w->sgml_anchortext.href); XtFree(w->sgml_anchortext.name); } /*-----------------------------------------------------------------------*/ /* Create a new SGMLAnchorTextObject */ /*-----------------------------------------------------------------------*/ Widget SGMLCreateAnchorText(parent,name,al,ac) Widget parent; char *name; ArgList al; int ac; { return XtCreateWidget(name,sGMLAnchorTextObjectClass,parent,al,ac); }