Annotation of Amaya/amaya/fetchXMLname.c, revision 1.70
1.1 cvs 1: /*
2: *
1.65 vatton 3: * (c) COPYRIGHT INRIA and W3C, 1996-2004
1.1 cvs 4: * Please first read the full copyright statement in file COPYRIGHT.
5: *
6: */
7:
8: /*
9: *
10: * fetchXMLname
11: *
1.46 cvs 12: * Authors: I. Vatton
13: * L. Carcone
1.1 cvs 14: *
15: */
16:
17: #define THOT_EXPORT extern
18: #include "amaya.h"
19: #include "parser.h"
1.24 cvs 20: #include "HTMLnames.h"
21: #include "MathMLnames.h"
1.49 vatton 22: #include "SVGnames.h"
1.24 cvs 23: #include "XLinknames.h"
24:
1.35 cvs 25: /* define some pointers to let other parser functions access the local table */
1.24 cvs 26: int HTML_ENTRIES = (sizeof(XHTMLElemMappingTable) / sizeof(ElemMapping));
27: ElemMapping *pHTMLGIMapping = XHTMLElemMappingTable;
28: AttributeMapping *pHTMLAttributeMapping = XHTMLAttributeMappingTable;
1.14 cvs 29:
1.35 cvs 30: XmlEntity *pXhtmlEntityTable = XhtmlEntityTable;
31: XmlEntity *pMathEntityTable = MathEntityTable;
1.1 cvs 32:
33: #include "fetchXMLname_f.h"
34:
1.39 cvs 35: /* Global variables used by the entity mapping */
36: static int XHTMLSup = 0;
37: static int MathSup = 0;
38:
1.1 cvs 39: /*----------------------------------------------------------------------
1.14 cvs 40: GetXHTMLSSchema returns the XHTML Thot schema for document doc.
41: ----------------------------------------------------------------------*/
1.55 vatton 42: SSchema GetXHTMLSSchema (Document doc)
1.14 cvs 43: {
44: SSchema XHTMLSSchema;
45:
1.43 cvs 46: XHTMLSSchema = TtaGetSSchema ("HTML", doc);
1.14 cvs 47: if (XHTMLSSchema == NULL)
1.17 cvs 48: XHTMLSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
1.46 cvs 49: "HTML", "HTMLP");
1.14 cvs 50: return (XHTMLSSchema);
51: }
52:
1.54 cvs 53: /*----------------------------------------------------------------------
1.1 cvs 54: GetMathMLSSchema returns the MathML Thot schema for document doc.
55: ----------------------------------------------------------------------*/
1.55 vatton 56: SSchema GetMathMLSSchema (Document doc)
1.1 cvs 57: {
58: SSchema MathMLSSchema;
59:
1.43 cvs 60: MathMLSSchema = TtaGetSSchema ("MathML", doc);
1.13 cvs 61: if (MathMLSSchema == NULL)
1.17 cvs 62: MathMLSSchema = TtaNewNature(doc,
1.46 cvs 63: TtaGetDocumentSSchema(doc),
64: "MathML", "MathMLP");
1.13 cvs 65: return (MathMLSSchema);
1.1 cvs 66: }
67:
68: /*----------------------------------------------------------------------
1.49 vatton 69: GetSVGSSchema returns the SVG Thot schema for document doc.
1.1 cvs 70: ----------------------------------------------------------------------*/
1.55 vatton 71: SSchema GetSVGSSchema (Document doc)
1.1 cvs 72:
73: {
1.49 vatton 74: SSchema SVGSSchema;
1.1 cvs 75:
1.49 vatton 76: SVGSSchema = TtaGetSSchema ("SVG", doc);
77: if (SVGSSchema == NULL)
78: SVGSSchema = TtaNewNature(doc,
1.46 cvs 79: TtaGetDocumentSSchema(doc),
1.49 vatton 80: "SVG", "SVGP");
81: return (SVGSSchema);
1.1 cvs 82: }
83:
84: /*----------------------------------------------------------------------
1.13 cvs 85: GetXLinkSSchema returns the XLink Thot schema for document doc.
86: ----------------------------------------------------------------------*/
1.55 vatton 87: SSchema GetXLinkSSchema (Document doc)
1.13 cvs 88:
89: {
90: SSchema XLinkSSchema;
91:
1.43 cvs 92: XLinkSSchema = TtaGetSSchema ("XLink", doc);
1.13 cvs 93: if (XLinkSSchema == NULL)
1.46 cvs 94: XLinkSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
95: "XLink", "XLinkP");
1.13 cvs 96: return (XLinkSSchema);
97: }
98:
99: /*----------------------------------------------------------------------
1.57 kahan 100: GetTextSSchema returns the TextFile Thot schema for document doc.
101: (this is not XML, but its useful to have this function here).
102: ----------------------------------------------------------------------*/
1.66 vatton 103: SSchema GetTextSSchema (Document doc)
1.57 kahan 104:
105: {
106: SSchema XLinkSSchema;
107:
108: XLinkSSchema = TtaGetSSchema ("TextFile", doc);
109: if (XLinkSSchema == NULL)
110: XLinkSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
111: "TextFile", "TextFileP");
112: return (XLinkSSchema);
113: }
114:
1.61 cvs 115: /*----------------------------------------------------------------------
116: GetGenericXMLSSchema
117: Returns the XML Thot schema of name schemaName for the document doc.
118: ----------------------------------------------------------------------*/
119: SSchema GetGenericXMLSSchema (char *schemaName, Document doc)
120:
121: {
122: SSchema XMLSSchema;
123:
124: XMLSSchema = TtaGetSSchema (schemaName, doc);
125: if (XMLSSchema == NULL)
126: XMLSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
127: "XML", "XMLP");
128: return (XMLSSchema);
129: }
1.57 kahan 130:
131: /*----------------------------------------------------------------------
1.61 cvs 132: GetGenericXMLSSchemaByUri
133: Returns the XML Thot schema for the document doc.
1.46 cvs 134: ----------------------------------------------------------------------*/
1.55 vatton 135: SSchema GetGenericXMLSSchemaByUri (char *uriName, Document doc, ThotBool *isnew)
1.46 cvs 136:
137: {
138: SSchema XMLSSchema;
139:
140: XMLSSchema = TtaGetSSchemaByUri (uriName, doc);
141: if (XMLSSchema == NULL)
142: {
143: XMLSSchema = TtaNewNature(doc, TtaGetDocumentSSchema(doc),
144: "XML", "XMLP");
145: *isnew = TRUE;
146: }
147: return (XMLSSchema);
148: }
149:
150: /*----------------------------------------------------------------------
1.13 cvs 151: GetXMLSSchema returns the XML Thot schema for document doc.
1.1 cvs 152: ----------------------------------------------------------------------*/
1.45 cvs 153: SSchema GetXMLSSchema (int XMLtype, Document doc)
1.38 cvs 154:
1.1 cvs 155: {
1.14 cvs 156: if (XMLtype == XHTML_TYPE)
157: return GetXHTMLSSchema (doc);
158: else if (XMLtype == MATH_TYPE)
1.13 cvs 159: return GetMathMLSSchema (doc);
1.51 cvs 160: else if (XMLtype == SVG_TYPE)
1.49 vatton 161: return GetSVGSSchema (doc);
1.13 cvs 162: else if (XMLtype == XLINK_TYPE)
1.15 cvs 163: return GetXLinkSSchema (doc);
1.13 cvs 164: else
165: return NULL;
1.1 cvs 166: }
167:
168: /*----------------------------------------------------------------------
1.22 cvs 169: MapXMLElementType
170: Generic function which searchs in the Element Mapping table, selected
171: by the parameter XMLtype, the entry XMLname and returns the corresponding
172: Thot element type.
1.55 vatton 173: Returns:
1.22 cvs 174: - ElTypeNum and ElSSchema into elType ElTypeNum = 0 if not found.
1.55 vatton 175: - content information about this entry
176: - checkProfile TRUE if the entry is valid for the current Doc profile.
1.1 cvs 177: ----------------------------------------------------------------------*/
1.55 vatton 178: void MapXMLElementType (int XMLtype, char *XMLname, ElementType *elType,
179: char **mappedName, char *content,
180: ThotBool *checkProfile, Document doc)
1.1 cvs 181: {
1.56 vatton 182: ElemMapping *ptr;
183: char c;
1.66 vatton 184: int i, profile;
1.68 vatton 185: ThotBool xmlformat;
1.1 cvs 186:
1.56 vatton 187: /* Initialize variables */
188: *mappedName = NULL;
189: *checkProfile = TRUE;
190: elType->ElTypeNum = 0;
1.66 vatton 191: profile = TtaGetDocumentProfile (doc);
1.70 ! vatton 192: if (profile == L_Annot)
! 193: profile = L_Other;
1.68 vatton 194: /* case sensitive comparison for xml documents */
195: xmlformat = (DocumentMeta[doc] && DocumentMeta[doc]->xmlformat);
196:
1.56 vatton 197: /* Select the right table */
198: if (XMLtype == XHTML_TYPE)
1.69 vatton 199: {
200: ptr = XHTMLElemMappingTable;
201: /* no case sensitive whent there is an explicit "text/html" content_type */
202: if (xmlformat && DocumentMeta[doc] && DocumentMeta[doc]->content_type &&
203: !strcmp (DocumentMeta[doc]->content_type, "text/html"))
204: xmlformat = FALSE;
205: }
1.56 vatton 206: else if (XMLtype == MATH_TYPE)
207: {
1.66 vatton 208: if (profile == L_Basic && DocumentTypes[doc] == docHTML)
1.56 vatton 209: {
210: /* Maths are not allowed in this document */
211: ptr = NULL;
212: *checkProfile = FALSE;
213: }
214: else
215: ptr = MathMLElemMappingTable;
216: }
217: else if (XMLtype == SVG_TYPE)
218: {
1.66 vatton 219: if (profile == L_Basic && DocumentTypes[doc] == docHTML)
1.56 vatton 220: {
221: /* Graphics are not allowed in this document */
222: ptr = NULL;
223: *checkProfile = FALSE;
224: }
225: else
226: ptr = SVGElemMappingTable;
227: }
228: else
229: ptr = NULL;
1.32 cvs 230:
1.56 vatton 231: if (ptr)
232: {
233: /* search in the ElemMappingTable */
234: i = 0;
235: /* case insensitive for HTML */
1.68 vatton 236: if (!xmlformat && ptr == XHTMLElemMappingTable)
1.56 vatton 237: c = tolower (XMLname[0]);
238: else
239: c = XMLname[0];
240: /* look for the first concerned entry in the table */
241: while (ptr[i].XMLname[0] < c && ptr[i].XMLname[0] != EOS)
242: i++;
243: /* look at all entries starting with the right character */
244: do
1.68 vatton 245: if (!xmlformat && ptr == XHTMLElemMappingTable &&
246: strcasecmp (ptr[i].XMLname, XMLname))
1.56 vatton 247: /* it's not the tag */
248: i++;
1.68 vatton 249: else if ((xmlformat || ptr != XHTMLElemMappingTable) &&
250: strcmp (ptr[i].XMLname, XMLname))
1.56 vatton 251: /* it's not the tag */
252: i++;
1.66 vatton 253: else if (profile != L_Other && !(ptr[i].Level & profile))
1.56 vatton 254: {
255: /* this tag is not valid in the document profile */
256: *checkProfile = FALSE;
257: i++;
258: }
259: else
260: {
261: elType->ElTypeNum = ptr[i].ThotType;
262: if (elType->ElSSchema == NULL)
263: elType->ElSSchema = GetXMLSSchema (XMLtype, doc);
264: *mappedName = ptr[i].XMLname;
265: *content = ptr[i].XMLcontents;
266: }
267: while (elType->ElTypeNum <= 0 && ptr[i].XMLname[0] == c);
268: }
1.1 cvs 269: }
270:
271:
272: /*----------------------------------------------------------------------
273: GetXMLElementName
1.52 cvs 274: Generic function which searchs in the mapping tables the XML name for
1.22 cvs 275: a given Thot type.
1.1 cvs 276: ----------------------------------------------------------------------*/
1.55 vatton 277: char *GetXMLElementName (ElementType elType, Document doc)
1.1 cvs 278: {
1.46 cvs 279: ElemMapping *ptr;
280: char *name;
1.66 vatton 281: int i, profile;
1.46 cvs 282: ThotBool invalid = FALSE;
1.27 cvs 283:
284: if (elType.ElTypeNum > 0)
285: {
286: i = 0;
287: /* Select the table which matches with the element schema */
288: name = TtaGetSSchemaName (elType.ElSSchema);
1.44 cvs 289: if (strcmp ("MathML", name) == 0)
1.27 cvs 290: ptr = MathMLElemMappingTable;
1.49 vatton 291: else if (strcmp ("SVG", name) == 0)
292: ptr = SVGElemMappingTable;
1.63 quint 293: else if (strcmp ("HTML", name) == 0)
294: ptr = XHTMLElemMappingTable;
1.27 cvs 295: else
1.63 quint 296: ptr = NULL;
297:
1.66 vatton 298: profile = TtaGetDocumentProfile (doc);
1.70 ! vatton 299: if (profile == L_Annot)
! 300: profile = L_Other;
1.27 cvs 301: if (ptr)
302: do
303: {
304: if (ptr[i].ThotType == elType.ElTypeNum)
305: {
1.37 cvs 306: if (doc == 0 ||
1.66 vatton 307: profile == L_Other || (ptr[i].Level & profile))
1.27 cvs 308: return ptr[i].XMLname;
309: else
310: invalid = TRUE;
311: }
312: i++;
313: }
1.44 cvs 314: while (ptr[i].XMLname[0] != EOS);
1.27 cvs 315: }
316: if (invalid)
1.43 cvs 317: return "";
1.27 cvs 318: else
1.43 cvs 319: return "???";
1.22 cvs 320: }
1.25 cvs 321:
322:
1.29 cvs 323:
324: /*----------------------------------------------------------------------
1.30 cvs 325: IsXMLElementInline
1.52 cvs 326: Generic function which searchs in the mapping tables if a given
1.29 cvs 327: Thot type is an inline character or not
328: ----------------------------------------------------------------------*/
1.55 vatton 329: ThotBool IsXMLElementInline (ElementType elType, Document doc)
1.29 cvs 330: {
1.34 cvs 331: int i;
332: ThotBool ret = FALSE;
1.45 cvs 333: char *name;
1.34 cvs 334: ElemMapping *ptr;
1.29 cvs 335:
336: if (elType.ElTypeNum > 0)
337: {
338: i = 0;
339: /* Select the table which matches with the element schema */
340: name = TtaGetSSchemaName (elType.ElSSchema);
1.44 cvs 341: if (strcmp ("MathML", name) == 0)
1.29 cvs 342: ptr = MathMLElemMappingTable;
1.49 vatton 343: else if (strcmp ("SVG", name) == 0)
344: ptr = SVGElemMappingTable;
1.52 cvs 345: else if (strcmp ("HTML", name) == 0)
346: ptr = XHTMLElemMappingTable;
1.29 cvs 347: else
1.52 cvs 348: ptr = NULL;
1.29 cvs 349:
350: if (ptr)
351: {
1.44 cvs 352: while (ptr[i].XMLname[0] != EOS &&
1.29 cvs 353: ptr[i].ThotType != elType.ElTypeNum)
354: i++;
355: if (ptr[i].ThotType == elType.ElTypeNum)
1.58 quint 356: ret = ptr[i].InlineElem;
1.29 cvs 357: }
358: }
359: return ret;
360: }
361:
1.22 cvs 362: /*----------------------------------------------------------------------
1.59 vatton 363: MapMathMLAttributeValue
364: Search in the Attribute Value Mapping Table the entry for the attribute
365: ThotAtt and its value attVal. Returns the corresponding Thot value.
366: ----------------------------------------------------------------------*/
1.64 gully 367: void MapXMLAttributeValue (int XMLtype, char *attVal, const AttributeType *attrType,
1.59 vatton 368: int *value)
369: {
370: AttrValueMapping *ptr;
371: int i;
372:
373: /* Select the right table */
374: if (XMLtype == XHTML_TYPE)
1.60 vatton 375: ptr = XhtmlAttrValueMappingTable;
1.59 vatton 376: else if (XMLtype == MATH_TYPE)
377: ptr = MathMLAttrValueMappingTable;
378: else if (XMLtype == SVG_TYPE)
1.60 vatton 379: ptr = SVGAttrValueMappingTable;
1.59 vatton 380: else
381: ptr = NULL;
382:
383: *value = 0;
384: i = 0;
385: if (ptr == NULL)
386: return;
1.64 gully 387: while (ptr[i].ThotAttr != attrType->AttrTypeNum && ptr[i].ThotAttr != 0)
1.59 vatton 388: i++;
1.64 gully 389: if (ptr[i].ThotAttr == attrType->AttrTypeNum)
1.59 vatton 390: do
391: if (!strcmp (ptr[i].XMLattrValue, attVal))
392: *value = ptr[i].ThotAttrValue;
393: else
394: i++;
1.64 gully 395: while (*value == 0 && ptr[i].ThotAttr == attrType->AttrTypeNum);
1.59 vatton 396: }
397:
398:
399: /*----------------------------------------------------------------------
1.24 cvs 400: MapXMLAttribute
1.22 cvs 401: Generic function which searchs in the Attribute Mapping Table (table)
402: the entry attrName associated to the element elementName.
1.24 cvs 403: Returns the corresponding entry or -1.
1.22 cvs 404: ----------------------------------------------------------------------*/
1.55 vatton 405: int MapXMLAttribute (int XMLtype, char *attrName, char *elementName,
406: ThotBool *checkProfile, Document doc, int *thotType)
1.22 cvs 407: {
1.56 vatton 408: AttributeMapping *ptr;
409: char c;
1.66 vatton 410: int i, profile;
1.68 vatton 411: ThotBool xmlformat;
1.24 cvs 412:
1.33 cvs 413: /* Initialization */
1.55 vatton 414: *checkProfile = TRUE;
1.33 cvs 415: i = 1;
416: *thotType = 0;
1.68 vatton 417: /* case sensitive comparison for xml documents */
418: xmlformat = (DocumentMeta[doc] && DocumentMeta[doc]->xmlformat);
1.50 cvs 419:
420: /* Select the right table */
421: if (XMLtype == XHTML_TYPE)
1.69 vatton 422: {
423: ptr = XHTMLAttributeMappingTable;
424: /* no case sensitive whent there is an explicit "text/html" content_type */
425: if (xmlformat && DocumentMeta[doc] && DocumentMeta[doc]->content_type &&
426: !strcmp (DocumentMeta[doc]->content_type, "text/html"))
427: xmlformat = FALSE;
428: }
1.50 cvs 429: else if (XMLtype == MATH_TYPE)
430: ptr = MathMLAttributeMappingTable;
1.51 cvs 431: else if (XMLtype == SVG_TYPE)
1.50 cvs 432: ptr = SVGAttributeMappingTable;
433: else if (XMLtype == XLINK_TYPE)
434: ptr = XLinkAttributeMappingTable;
435: else
436: ptr = NULL;
1.24 cvs 437: if (ptr == NULL)
438: return -1;
1.50 cvs 439: if (strcmp (attrName, "unknown_attr") == 0)
440: {
441: *thotType = ptr[0].ThotAttribute;
442: return 0;
443: }
1.22 cvs 444:
1.56 vatton 445: /* case insensitive for HTML */
1.68 vatton 446: if (!xmlformat && ptr == XHTMLAttributeMappingTable)
1.56 vatton 447: c = tolower (attrName[0]);
448: else
449: c = attrName[0];
1.66 vatton 450:
451: profile = TtaGetDocumentProfile (doc);
1.70 ! vatton 452: if (profile == L_Annot)
! 453: profile = L_Other;
1.22 cvs 454: /* look for the first concerned entry in the table */
1.56 vatton 455: while (ptr[i].XMLattribute[0] < c && ptr[i].XMLattribute[0] != EOS)
1.22 cvs 456: i++;
1.56 vatton 457: while (ptr[i].XMLattribute[0] == c)
1.22 cvs 458: {
1.68 vatton 459: if (!xmlformat && ptr == XHTMLAttributeMappingTable &&
1.56 vatton 460: (strcasecmp (ptr[i].XMLattribute, attrName) ||
461: (ptr[i].XMLelement[0] != EOS &&
462: strcasecmp (ptr[i].XMLelement, elementName))))
463: i++;
1.68 vatton 464: else if ((xmlformat || ptr != XHTMLAttributeMappingTable) &&
1.56 vatton 465: (strcmp (ptr[i].XMLattribute, attrName) ||
466: (ptr[i].XMLelement[0] != EOS &&
467: strcmp (ptr[i].XMLelement, elementName))))
1.22 cvs 468: i++;
1.66 vatton 469: else if (profile != L_Other && !(ptr[i].Level & profile))
1.33 cvs 470: {
1.55 vatton 471: *checkProfile = FALSE;
1.33 cvs 472: i++;
473: }
1.22 cvs 474: else
1.24 cvs 475: {
1.67 cvs 476: /* Special case for the 'name' attribute for
477: elements 'a' and 'map' in xhtml1.1 profile */
478: if ((profile == L_Xhtml11) &&
479: !strcmp (attrName, "name") &&
480: (!strcmp (elementName, "a") || !strcmp (elementName, "map")))
481: *checkProfile = FALSE;
482: else
483: *thotType = ptr[i].ThotAttribute;
1.24 cvs 484: return (i);
485: }
1.22 cvs 486: }
1.24 cvs 487: return (-1);
1.25 cvs 488: }
489:
490:
491: /*----------------------------------------------------------------------
1.37 cvs 492: GetXMLAttributeName
1.52 cvs 493: Generic function which searchs in the mapping tables the XML name for
1.25 cvs 494: a given Thot type.
495: ----------------------------------------------------------------------*/
1.55 vatton 496: char *GetXMLAttributeName (AttributeType attrType, ElementType elType,
497: Document doc)
1.25 cvs 498: {
499: AttributeMapping *ptr;
1.45 cvs 500: char *name, *tag;
1.66 vatton 501: int i, profile;
1.27 cvs 502: ThotBool invalid = FALSE;
1.25 cvs 503:
1.27 cvs 504: if (attrType.AttrTypeNum > 0)
505: {
1.28 cvs 506: /* get the specific element tag */
507: if (elType.ElTypeNum > 0)
508: tag = GetXMLElementName (elType, doc);
509: else
1.43 cvs 510: tag = "";
1.28 cvs 511:
1.27 cvs 512: i = 0;
513: /* Select the table which matches with the element schema */
514: name = TtaGetSSchemaName (attrType.AttrSSchema);
1.44 cvs 515: if (strcmp ("MathML", name) == 0)
1.27 cvs 516: ptr = MathMLAttributeMappingTable;
1.49 vatton 517: else if (strcmp ("SVG", name) == 0)
518: ptr = SVGAttributeMappingTable;
1.44 cvs 519: else if (strcmp ("XLink", name) == 0)
1.27 cvs 520: ptr = XLinkAttributeMappingTable;
521: else
522: ptr = XHTMLAttributeMappingTable;
523:
1.66 vatton 524: profile = TtaGetDocumentProfile (doc);
1.70 ! vatton 525: if (profile == L_Annot)
! 526: profile = L_Other;
1.27 cvs 527: if (ptr)
528: do
529: {
1.28 cvs 530: if (ptr[i].ThotAttribute == attrType.AttrTypeNum &&
1.44 cvs 531: (ptr[i].XMLelement[0] == EOS ||
532: !strcmp (ptr[i].XMLelement, tag)))
1.25 cvs 533: {
1.48 cvs 534: if (doc != 0 &&
1.66 vatton 535: profile != L_Other &&
536: !(ptr[i].Level & profile))
1.48 cvs 537: invalid = TRUE;
538: else
1.25 cvs 539: return ptr[i].XMLattribute;
540: }
541: i++;
1.27 cvs 542: }
1.44 cvs 543: while (ptr[i].XMLattribute[0] != EOS);
1.27 cvs 544: }
545: if (invalid)
1.43 cvs 546: return "";
1.27 cvs 547: else
1.43 cvs 548: return "???";
1.36 cvs 549: }
550:
551: /*----------------------------------------------------------------------
552: MapXMLEntity
553: Generic function which searchs in the Entity Mapping Table (table)
554: the entry entityName and give the corresponding decimal value.
555: Returns FALSE if entityName is not found.
556: ----------------------------------------------------------------------*/
1.46 cvs 557: ThotBool MapXMLEntity (int XMLtype, char *entityName, int *entityValue)
1.36 cvs 558: {
559: XmlEntity *ptr;
560: ThotBool found;
1.38 cvs 561: int inf, sup, med, rescomp;
1.36 cvs 562:
1.38 cvs 563: /* Initialization */
1.36 cvs 564: found = FALSE;
1.42 cvs 565: sup = 0;
1.36 cvs 566:
567: /* Select the right table */
568: if (XMLtype == XHTML_TYPE)
1.39 cvs 569: {
570: ptr = XhtmlEntityTable;
571: if (XHTMLSup == 0)
572: for (XHTMLSup = 0; ptr[XHTMLSup].charCode > 0; XHTMLSup++);
573: sup = XHTMLSup;
574: }
1.36 cvs 575: else if (XMLtype == MATH_TYPE)
1.39 cvs 576: {
577: ptr = MathEntityTable;
578: if (MathSup == 0)
579: for (MathSup = 0; ptr[MathSup].charCode > 0; MathSup++);
580: sup = MathSup;
581: }
1.36 cvs 582: else
583: ptr = NULL;
584:
585: if (ptr == NULL)
1.38 cvs 586: return found;
587:
588: inf = 0;
589: while (sup >= inf && !found)
590: /* Dichotomic research */
1.36 cvs 591: {
1.38 cvs 592: med = (sup + inf) / 2;
1.44 cvs 593: rescomp = strcmp (ptr[med].charName, entityName);
1.38 cvs 594: if (rescomp == 0)
595: {
596: /* entity found */
597: *entityValue = ptr[med].charCode;
598: found = TRUE;
599: }
600: else
601: {
602: if (rescomp > 0)
603: sup = med - 1;
604: else
605: inf = med + 1;
606: }
1.36 cvs 607: }
1.38 cvs 608: return found;
609: }
1.39 cvs 610:
611: /*----------------------------------------------------------------------
612: MapEntityByCode
613: Generic function which searchs in the Entity Mapping Table (table)
614: the entry with code entityValue and give the corresponding name.
615: Returns FALSE if entityValue is not found.
616: ----------------------------------------------------------------------*/
1.40 cvs 617: void MapEntityByCode (int entityValue, char **entityName)
1.39 cvs 618: {
619: XmlEntity *ptr;
620: ThotBool found;
621: int i;
622:
623: /* Select the right table */
1.40 cvs 624: ptr = XhtmlEntityTable;
625: if (ptr)
626: {
1.41 cvs 627: /* look for in the HTML entities table */
1.40 cvs 628: found = FALSE;
1.41 cvs 629: while (ptr && !found)
630: {
631: for (i = 0; ptr[i].charCode >= 0 && !found; i++)
632: found = (ptr[i].charCode == entityValue);
1.39 cvs 633:
1.41 cvs 634: if (found)
635: {
636: /* entity value found */
637: i--;
638: *entityName = (char *) (ptr[i].charName);
639: }
640: else if (ptr != MathEntityTable)
641: /* look for in the Math entities table */
642: ptr = MathEntityTable;
643: else
644: {
645: *entityName = NULL;
646: ptr = NULL;
647: }
1.40 cvs 648: }
649: }
1.39 cvs 650: else
1.40 cvs 651: *entityName = NULL;
1.39 cvs 652: }
Webmaster