Annotation of Amaya/amaya/AHTURLTools.c, revision 1.22
1.7 cvs 1: /*
2: *
3: * (c) COPYRIGHT MIT and INRIA, 1996.
4: * Please first read the full copyright statement in file COPYRIGHT.
5: *
6: */
1.9 cvs 7:
1.10 cvs 8: /*
9: * AHTURLTools.c: contains all the functions for testing, manipulating,
10: * and normalizing URLs.
11: *
12: * Authors: J. Kahan, I. Vatton
13: *
14: */
1.7 cvs 15:
1.8 cvs 16: /* Amaya includes */
1.15 cvs 17: #define THOT_EXPORT extern
1.3 cvs 18: #include "amaya.h"
19:
1.8 cvs 20:
21: #include "init_f.h"
22: #include "AHTURLTools_f.h"
23:
1.22 ! cvs 24: /* Private functions */
! 25: #ifdef __STDC__
! 26: static void ConvertToLowerCase (char *string);
! 27: #else
! 28: static void ConvertToLowerCase (/*char *string*/);
! 29: #endif
! 30:
1.8 cvs 31: /*----------------------------------------------------------------------
1.11 cvs 32: ExplodeURL
1.8 cvs 33: ----------------------------------------------------------------------*/
34:
35: #ifdef __STDC__
36: void ExplodeURL (char *url, char **proto, char **host, char **dir, char **file)
37: #else
38: void ExplodeURL (url, proto, host, dir, file)
39: char *url;
40: char **proto;
41: char **host;
42: char **dir;
43: char **file;
44:
45: #endif
46: {
1.9 cvs 47: char *curr, *temp;
1.8 cvs 48:
49: if ((url == NULL) || (proto == NULL) || (host == NULL) ||
50: (dir == NULL) || (file == NULL))
51: return;
52:
53: /* initialize every pointer */
54: *proto = *host = *dir = *file = NULL;
55:
56: /* skip any leading space */
57: while ((*url == SPACE) || (*url == TAB))
58: url++;
1.9 cvs 59: curr = url;
60: if (*curr == 0)
1.8 cvs 61: goto finished;
62:
63: /* go to the end of the URL */
1.9 cvs 64: while ((*curr != 0) && (*curr != SPACE) && (*curr != '\b') &&
65: (*curr != '\r') && (*curr != EOL))
66: curr++;
1.8 cvs 67:
68: /* mark the end of the chain */
1.9 cvs 69: *curr = EOS;
70: curr--;
71: if (curr <= url)
1.8 cvs 72: goto finished;
73:
74: /* search the next DIR_SEP indicating the beginning of the file name */
75: do
1.11 cvs 76: curr--;
1.9 cvs 77: while ((curr >= url) && (*curr != DIR_SEP));
1.11 cvs 78:
1.9 cvs 79: if (curr < url)
1.8 cvs 80: goto finished;
1.9 cvs 81: *file = curr + 1;
1.8 cvs 82:
83: /* mark the end of the dir */
1.9 cvs 84: *curr = EOS;
85: curr--;
86: if (curr < url)
1.8 cvs 87: goto finished;
88:
89: /* search for the "/" indicating the host name start */
1.9 cvs 90: while ((curr > url) && ((*curr != DIR_SEP) || (*(curr + 1) != DIR_SEP)))
91: curr--;
1.8 cvs 92:
93: /* if we found it, separate the host name from the directory */
1.9 cvs 94: if ((*curr == DIR_SEP) && (*(curr + 1) == DIR_SEP))
1.8 cvs 95: {
1.9 cvs 96: *host = temp = curr + 2;
1.8 cvs 97: while ((*temp != 0) && (*temp != DIR_SEP))
98: temp++;
99: if (*temp == DIR_SEP)
100: {
101: *temp = EOS;
102: *dir = temp + 1;
103: }
104: }
105: else
1.11 cvs 106: *dir = curr;
107:
1.9 cvs 108: if (curr <= url)
1.8 cvs 109: goto finished;
110:
111: /* mark the end of the proto */
1.9 cvs 112: *curr = EOS;
113: curr--;
114: if (curr < url)
1.8 cvs 115: goto finished;
116:
1.9 cvs 117: if (*curr == ':')
1.8 cvs 118: {
1.9 cvs 119: *curr = EOS;
120: curr--;
1.8 cvs 121: }
122: else
123: goto finished;
1.11 cvs 124:
1.9 cvs 125: if (curr < url)
1.8 cvs 126: goto finished;
1.9 cvs 127: while ((curr > url) && (isalpha (*curr)))
128: curr--;
129: *proto = curr;
1.8 cvs 130:
131: finished:;
132:
133: #ifdef AMAYA_DEBUG
134: fprintf (stderr, "ExplodeURL(%s)\n\t", url);
135: if (*proto)
136: fprintf (stderr, "proto : %s, ", *proto);
137: if (*host)
138: fprintf (stderr, "host : %s, ", *host);
139: if (*dir)
140: fprintf (stderr, "dir : %s, ", *dir);
141: if (*file)
142: fprintf (stderr, "file : %s ", *file);
143: fprintf (stderr, "\n");
144: #endif
145:
146: }
1.3 cvs 147:
1.4 cvs 148: /*----------------------------------------------------------------------
1.9 cvs 149: IsHTMLName
150: returns TRUE if path points to an HTML resource.
1.4 cvs 151: ----------------------------------------------------------------------*/
1.3 cvs 152: #ifdef __STDC__
153: boolean IsHTMLName (char *path)
154: #else /* __STDC__ */
155: boolean IsHTMLName (path)
156: char *path;
157: #endif /* __STDC__ */
158: {
1.5 cvs 159: char temppath[MAX_LENGTH];
160: char suffix[MAX_LENGTH];
161: char nsuffix[MAX_LENGTH];
162: int i;
163:
164: if (!path)
1.13 cvs 165: return (FALSE);
1.5 cvs 166:
167: strcpy (temppath, path);
168: ExtractSuffix (temppath, suffix);
169:
170: /* Normalize the suffix */
171: i = 0;
172: while (suffix[i] != EOS)
1.13 cvs 173: {
174: nsuffix[i] = TOLOWER (suffix[i]);
175: i++;
176: }
1.5 cvs 177: nsuffix[i] = EOS;
178: if ((strcmp (nsuffix, "html")) &&
179: (strcmp (nsuffix, "htm")) &&
180: (strcmp (nsuffix, "shtml")))
1.13 cvs 181: return (FALSE);
1.22 ! cvs 182: else if (!strcmp (nsuffix, "gz"))
1.13 cvs 183: {
184: /* take in account compressed files */
185: ExtractSuffix (temppath, suffix);
186: /* Normalize the suffix */
187: i = 0;
188: while (suffix[i] != EOS)
189: {
190: nsuffix[i] = TOLOWER (suffix[i]);
191: i++;
192: }
193: nsuffix[i] = EOS;
194: if ((strcmp (nsuffix, "html")) &&
195: (strcmp (nsuffix, "htm")) &&
196: (strcmp (nsuffix, "shtml")))
197: return (FALSE);
198: else
199: return (TRUE);
200: }
201: else
202: return (TRUE);
1.3 cvs 203: }
204:
1.4 cvs 205: /*----------------------------------------------------------------------
1.9 cvs 206: IsImageName
207: returns TRUE if path points to an image resource.
1.4 cvs 208: ----------------------------------------------------------------------*/
1.3 cvs 209: #ifdef __STDC__
210: boolean IsImageName (char *path)
211: #else /* __STDC__ */
212: boolean IsImageName (path)
213: char *path;
214: #endif /* __STDC__ */
215: {
1.5 cvs 216: char temppath[MAX_LENGTH];
217: char suffix[MAX_LENGTH];
218: char nsuffix[MAX_LENGTH];
219: int i;
220:
221: if (!path)
1.13 cvs 222: return (FALSE);
1.5 cvs 223:
224: strcpy (temppath, path);
225: ExtractSuffix (temppath, suffix);
226:
227: /* Normalize the suffix */
228: i = 0;
229: while (suffix[i] != EOS)
1.13 cvs 230: {
231: nsuffix[i] = TOLOWER (suffix[i]);
232: i++;
233: }
1.5 cvs 234: nsuffix[i] = EOS;
235: if ((strcmp (nsuffix, "gif")) && (strcmp (nsuffix, "xbm")) &&
236: (strcmp (nsuffix, "xpm")) && (strcmp (nsuffix, "jpg")) &&
237: (strcmp (nsuffix, "png")) && (strcmp (nsuffix, "au")))
1.13 cvs 238: return (FALSE);
239: return (TRUE);
1.3 cvs 240: }
241:
1.4 cvs 242: /*----------------------------------------------------------------------
1.9 cvs 243: IsTextName
1.4 cvs 244: ----------------------------------------------------------------------*/
1.3 cvs 245: #ifdef __STDC__
246: boolean IsTextName (char *path)
247: #else /* __STDC__ */
248: boolean IsTextName (path)
249: char *path;
250:
251: #endif /* __STDC__ */
252: {
1.5 cvs 253: char temppath[MAX_LENGTH];
254: char suffix[MAX_LENGTH];
255: char nsuffix[MAX_LENGTH];
256: int i;
257:
258: if (!path)
1.13 cvs 259: return (FALSE);
1.5 cvs 260:
261: strcpy (temppath, path);
262: ExtractSuffix (temppath, suffix);
263:
264: /* Normalize the suffix */
265: i = 0;
266: while (suffix[i] != EOS)
267: {
268: nsuffix[i] = TOLOWER (suffix[i]);
269: i++;
270: }
271: nsuffix[i] = EOS;
272:
273: if ((strcmp (nsuffix, "gif")) && (strcmp (nsuffix, "xbm")) &&
274: (strcmp (nsuffix, "xpm")) && (strcmp (nsuffix, "jpg")) &&
275: (strcmp (nsuffix, "pdf")) && (strcmp (nsuffix, "png")) &&
1.22 ! cvs 276: (strcmp (nsuffix, "tgz")) && (strcmp (nsuffix, "tar")) &&
! 277: (strcmp (nsuffix, "xpg")) && (strcmp (nsuffix, "xpd")) &&
! 278: (strcmp (nsuffix, "ps")) && (strcmp (nsuffix, "au")))
1.13 cvs 279: return (TRUE);
1.22 ! cvs 280: else if (!strcmp (nsuffix, "gz"))
1.13 cvs 281: {
282: /* take in account compressed files */
283: ExtractSuffix (temppath, suffix);
284: /* Normalize the suffix */
285: i = 0;
286: while (suffix[i] != EOS)
287: {
288: nsuffix[i] = TOLOWER (suffix[i]);
289: i++;
290: }
291: nsuffix[i] = EOS;
292: if ((!strcmp (nsuffix, "html")) ||
293: (!strcmp (nsuffix, "htm")) ||
294: (!strcmp (nsuffix, "shtml")))
295: return (TRUE);
296: else
297: return (FALSE);
298: }
299: else
300: return (FALSE);
1.3 cvs 301: }
302:
1.4 cvs 303: /*----------------------------------------------------------------------
1.9 cvs 304: IsHTTPPath
305: returns TRUE if path is in fact an http URL.
1.4 cvs 306: ----------------------------------------------------------------------*/
1.3 cvs 307: #ifdef __STDC__
308: boolean IsHTTPPath (char *path)
309: #else /* __STDC__ */
310: boolean IsHTTPPath (path)
311: char *path;
312: #endif /* __STDC__ */
313: {
1.5 cvs 314: if (!path)
315: return FALSE;
1.3 cvs 316:
1.5 cvs 317: if (strncmp (path, "http:", 5) != 0)
318: return FALSE;
319: return TRUE;
1.3 cvs 320: }
321:
1.4 cvs 322: /*----------------------------------------------------------------------
1.9 cvs 323: IsWithParameters
324: returns TRUE if url has a concatenated query string.
1.4 cvs 325: ----------------------------------------------------------------------*/
1.3 cvs 326: #ifdef __STDC__
1.9 cvs 327: boolean IsWithParameters (char *url)
1.3 cvs 328: #else /* __STDC__ */
1.9 cvs 329: boolean IsWithParameters (url)
330: char *url;
1.3 cvs 331: #endif /* __STDC__ */
332: {
1.5 cvs 333: int i;
1.3 cvs 334:
1.9 cvs 335: if ((!url) || (url[0] == EOS))
1.5 cvs 336: return FALSE;
1.3 cvs 337:
1.9 cvs 338: i = strlen (url) - 1;
339: while (i > 0 && url[i--] != '?')
1.5 cvs 340: if (i < 0)
341: return FALSE;
1.3 cvs 342:
1.5 cvs 343: /* There is a parameter */
344: return TRUE;
1.3 cvs 345: }
346:
1.4 cvs 347: /*----------------------------------------------------------------------
1.9 cvs 348: IsW3Path
349: returns TRUE if path is in fact a URL.
1.4 cvs 350: ----------------------------------------------------------------------*/
1.3 cvs 351: #ifdef __STDC__
352: boolean IsW3Path (char *path)
353: #else /* __STDC__ */
354: boolean IsW3Path (path)
355: char *path;
356: #endif /* __STDC__ */
357: {
1.5 cvs 358: if ((strncmp (path, "http:", 5)) && (strncmp (path, "ftp:", 4)) &&
359: (strncmp (path, "telnet:", 7)) && (strncmp (path, "wais:", 5)) &&
360: (strncmp (path, "news:", 5)) && (strncmp (path, "gopher:", 7)) &&
361: (strncmp (path, "mailto:", 7)) && (strncmp (path, "archie:", 7)))
362: return FALSE;
363: return TRUE;
1.3 cvs 364: }
365:
1.4 cvs 366: /*----------------------------------------------------------------------
1.9 cvs 367: IsValidProtocol
368: returns true if the url protocol is supported by Amaya.
1.4 cvs 369: ----------------------------------------------------------------------*/
1.3 cvs 370: #ifdef __STDC__
1.9 cvs 371: boolean IsValidProtocol (char *url)
1.3 cvs 372: #else /* __STDC__ */
1.9 cvs 373: boolean IsValidProtocol (url)
374: char *url;
1.3 cvs 375: #endif /* __STDC__ */
376: {
1.22 ! cvs 377: if (!strncmp (url, "http:", 5))
! 378: /* experimental */
! 379: /***|| !strncmp (path, "ftp:", 4)
! 380: || !strncmp (path, "news:", 5)***/
1.8 cvs 381: return (TRUE);
1.5 cvs 382: else
1.8 cvs 383: return (FALSE);
1.3 cvs 384: }
385:
1.4 cvs 386: /*----------------------------------------------------------------------
1.9 cvs 387: NormalizeURL
388: normalizes orgName according to a base associated with doc, and
389: following the standard URL format rules.
390: The function returns the new complete and normalized URL
1.12 cvs 391: or file name path (newName) and the name of the document (docName).
1.9 cvs 392: N.B. If the function can't find out what's the docName, it assigns
393: the name "noname.html".
1.4 cvs 394: ----------------------------------------------------------------------*/
1.3 cvs 395: #ifdef __STDC__
396: void NormalizeURL (char *orgName, Document doc, char *newName, char *docName)
397: #else /* __STDC__ */
398: void NormalizeURL (orgName, doc, newName, docName)
399: char *orgName;
400: Document doc;
401: char *newName;
402: char *docName;
403: #endif /* __STDC__ */
404: {
1.5 cvs 405: char basename[MAX_LENGTH];
1.18 cvs 406: char tempOrgName[MAX_LENGTH];
1.5 cvs 407: char *ptr;
408: Element el;
409: ElementType elType;
410: AttributeType attrType;
1.18 cvs 411: Attribute attrHREF = NULL;
1.5 cvs 412: int length;
413:
414: if (!newName || !docName)
415: return;
1.18 cvs 416:
417: /*
418: ** First Step: Clean orgName
419: ** Make sure we have a complete orgName, without any leading or trailing
420: ** white spaces, or trailinbg new lines
421: */
422:
1.5 cvs 423: ptr = orgName;
1.18 cvs 424: /* skip leading white space and new line characters */
1.19 cvs 425: while ((*ptr == ' ' || *ptr == EOL) && *ptr++ != EOS);
1.18 cvs 426: strcpy (tempOrgName, ptr);
427: /* clean trailing white space */
428: ptr = strchr (tempOrgName, ' ');
429: if (ptr)
430: *ptr = EOS;
431: /* clean trailing new lines */
1.19 cvs 432: ptr = strchr (tempOrgName, EOL);
1.5 cvs 433: if (ptr)
434: *ptr = EOS;
435:
1.18 cvs 436: /*
437: ** Second Step: make orgName a complete URL
438: ** If the URL does not include a protocol, then
439: ** try to calculate one using the doc's base element
440: ** (if it exists),
441: */
1.21 cvs 442: if (tempOrgName[0] == EOS)
443: {
444: newName[0] = EOS;
445: return;
446: }
447: else if (IsW3Path (tempOrgName))
448: {
449: /* the name is complete, go to the Sixth Step */
450: strcpy (newName, tempOrgName);
451: /* verify if the URL has the form "protocol://server:port" */
452: ptr = HTParse (newName, "", PARSE_ACCESS | PARSE_HOST |
453: PARSE_PUNCTUATION);
454: if (ptr && !strcmp (ptr, newName))
455: {
456: /* it has this form, we complete it by adding a "/" */
457: strcat (newName, "/");
458: }
459: if (ptr)
460: HT_FREE (ptr);
461: }
462: else if ( doc == 0)
1.19 cvs 463: /* the name is complete, go to the Sixth Step */
1.18 cvs 464: strcpy (newName, tempOrgName);
1.5 cvs 465: else
466: {
1.18 cvs 467: /* take into account the BASE element. */
1.22 ! cvs 468: length = MAX_LENGTH -1;
1.18 cvs 469: /* get the root element */
470: el = TtaGetMainRoot (doc);
471:
472: /* search the BASE element */
473: elType.ElSSchema = TtaGetDocumentSSchema (doc);
474: elType.ElTypeNum = HTML_EL_BASE;
475: el = TtaSearchTypedElement (elType, SearchInTree, el);
476: if (el)
1.17 cvs 477: {
1.18 cvs 478: /*
479: ** The document has a BASE element
480: ** Get the HREF attribute of the BASE Element
481: */
482: attrType.AttrSSchema = elType.ElSSchema;
483: attrType.AttrTypeNum = HTML_ATTR_HREF_;
484: attrHREF = TtaGetAttribute (el, attrType);
485: if (attrHREF)
1.14 cvs 486: {
1.18 cvs 487: /* Use the base path of the document */
488: TtaGiveTextAttributeValue (attrHREF, basename, &length);
489: /* base and orgName have to be separated by a DIR_SEP */
1.20 cvs 490: length--;
1.18 cvs 491: if (basename[0] != EOS && basename[length] != '/')
492: /* verify if the base has the form "protocol://server:port" */
1.14 cvs 493: {
1.18 cvs 494: ptr = HTParse (basename, "", PARSE_ACCESS | PARSE_HOST |
495: PARSE_PUNCTUATION);
496: if (ptr && !strcmp (ptr, basename))
1.14 cvs 497: {
1.18 cvs 498: /* it has this form, we complete it by adding a "/" */
499: strcat (basename, "/");
500: length++;
1.14 cvs 501: }
1.18 cvs 502: if (ptr)
503: HT_FREE (ptr);
1.14 cvs 504: }
1.19 cvs 505: /* Third Step: prepare the base
506: ** Removing anything after the
507: ** last DIR_SEP char. If no such char is found, then search for
508: ** the first ":" char, hoping that what's before that is a
509: ** protocol. If found, end the string there. If neither
510: ** char is found, then discard the whole base element.
511: */
512:
513: /* search for the last DIR_SEP char */
1.18 cvs 514: while (length >= 0 && basename[length] != DIR_SEP)
1.19 cvs 515: length--;
516: if (length >= 0)
517: /* found the last DIR_SEP char, end the string there */
518: basename[length + 1] = EOS;
519: else
520: /* search for the first ":" char */
521: {
522: for (length = 0; basename[length] != ':' &&
1.20 cvs 523: basename[length] != EOS; length++);
1.19 cvs 524: if (basename[length] == ':')
525: /* found, so end the string there */
526: basename[length + 1] = EOS;
527: else
528: /* not found, discard the base */
529: basename[0] = EOS;
530: }
1.14 cvs 531: }
532: else
533: basename[0] = EOS;
1.18 cvs 534: }
1.22 ! cvs 535:
1.18 cvs 536: /*
1.19 cvs 537: ** Fourth Step:
1.18 cvs 538: ** If there's no base element, and if we're following
1.19 cvs 539: ** a link, use the URL of the current document as a base.
1.18 cvs 540: */
541:
542: if (!attrHREF)
543: {
544: if (DocumentURLs[(int) doc])
1.14 cvs 545: {
1.18 cvs 546: strcpy (basename, DocumentURLs[(int) doc]);
547: /* base and orgName have to be separated by a DIR_SEP */
548: length = strlen (basename) - 1;
1.19 cvs 549: /* search for the last DIR_SEP char */
1.18 cvs 550: while (length >= 0 && basename[length] != DIR_SEP)
1.19 cvs 551: length--;
552: if (length >= 0)
553: /* found the last DIR_SEP char, end the string there */
554: basename[length + 1] = EOS;
555: else
556: /* search for the first ":" char */
557: {
558: for (length = 0; basename[length] != ':' &&
559: basename[length] != EOS; length ++);
560: if (basename[length] == ':')
561: /* found, so end the string there */
562: basename[length + 1] = EOS;
563: else
564: /* not found, discard the base */
565: basename[0] = EOS;
566: }
1.14 cvs 567: }
568: else
1.19 cvs 569: basename[0] = EOS;
1.14 cvs 570: }
1.22 ! cvs 571:
1.18 cvs 572: /*
1.19 cvs 573: ** Fifth Step, calculate the absolute URL, using the base
1.18 cvs 574: */
575:
576: ptr = HTParse (tempOrgName, basename, PARSE_ALL);
1.16 cvs 577:
1.14 cvs 578: if (ptr)
579: {
580: ptr = HTSimplify (&ptr);
581: strcpy (newName, ptr);
582: HT_FREE (ptr);
583: }
584: else
1.18 cvs 585: newName[0] = EOS;
1.5 cvs 586: }
587:
1.18 cvs 588: /*
1.19 cvs 589: ** Sixth and last Step:
1.18 cvs 590: ** Prepare the docname that will refer to this ressource in the
1.19 cvs 591: ** .amaya directory. If the new URL finishes on DIR_SEP, then use
1.18 cvs 592: ** noname.html as a default ressource name
593: */
1.19 cvs 594:
595: if (newName[0] != EOS)
1.5 cvs 596: {
1.19 cvs 597: length = strlen (newName) - 1;
1.18 cvs 598: if (newName[length] == DIR_SEP)
599: {
600: /* docname was not comprised inside the URL, so let's */
601: /* assign the default ressource name */
602: strcpy (docName, "noname.html");
603: /* remove DIR_SEP at the end of complete path */
604: newName[length] = EOS;
605: }
1.14 cvs 606: else
1.18 cvs 607: {
608: /* docname is comprised inside the URL */
609: while (length >= 0 && newName[length] != DIR_SEP)
610: length--;
611: if (length < 0)
612: strcpy (docName, newName);
613: else
614: strcpy (docName, &newName[length+1]);
615: }
1.19 cvs 616:
1.5 cvs 617: }
1.18 cvs 618: else
619: docName[0] = EOS;
620: }
1.3 cvs 621:
1.4 cvs 622: /*----------------------------------------------------------------------
1.9 cvs 623: IsSameHost
1.4 cvs 624: ----------------------------------------------------------------------*/
1.3 cvs 625: #ifdef __STDC__
626: boolean IsSameHost (char *url1, char *url2)
627: #else /* __STDC__ */
628: boolean IsSameHost (url1, url2)
629: char *path;
630: #endif /* __STDC__ */
631: {
1.5 cvs 632: char *basename_ptr1, *basename_ptr2;
633: boolean result;
1.3 cvs 634:
1.5 cvs 635: basename_ptr1 = HTParse (url1, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
636: basename_ptr2 = HTParse (url2, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
1.3 cvs 637:
1.5 cvs 638: if (strcmp (basename_ptr1, basename_ptr2))
1.8 cvs 639: result = FALSE;
1.5 cvs 640: else
1.8 cvs 641: result = TRUE;
1.3 cvs 642:
1.5 cvs 643: HT_FREE (basename_ptr1);
644: HT_FREE (basename_ptr2);
1.3 cvs 645:
1.5 cvs 646: return (result);
1.3 cvs 647: }
648:
649:
1.4 cvs 650: /*----------------------------------------------------------------------
1.9 cvs 651: AHTMakeRelativeURL
652: converts url into a relative url to base_url.
653: If succesful, returns the new URL, otherwise, it returns NULL.
654: The caller has to free the new URL.
1.4 cvs 655: ----------------------------------------------------------------------*/
1.3 cvs 656: #ifdef __STDC__
1.5 cvs 657: char *AHTMakeRelativeName (char *url, char *base_url)
1.3 cvs 658: #else /* __STDC__ */
1.5 cvs 659: char *AHTMakeRelativeName (url, base_url)
660: char url;
661: char base_url;
662:
1.3 cvs 663: #endif /* __STDC__ */
664: {
1.5 cvs 665: char *base_ptr, *url_ptr;
666: char *result;
667:
668: /* verify if we are in the same host */
1.3 cvs 669:
1.5 cvs 670: base_ptr = HTParse (base_url, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
671: url_ptr = HTParse (url, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
1.3 cvs 672:
1.5 cvs 673: if (!strcmp (base_ptr, url_ptr))
674: {
675: HT_FREE (base_ptr);
676: HT_FREE (url_ptr);
1.3 cvs 677:
1.5 cvs 678: /* Normalize the URLs */
1.3 cvs 679:
1.5 cvs 680: base_ptr = HTParse (base_url, "", PARSE_ALL);
681: url_ptr = HTParse (url, "", PARSE_ALL);
1.3 cvs 682:
1.5 cvs 683: /* Use libwww to make relative name */
1.3 cvs 684:
1.5 cvs 685: result = HTRelative (url_ptr, base_ptr);
686: HT_FREE (base_ptr);
687: HT_FREE (url_ptr);
688: }
689: else
690: result = (char *) NULL;
1.3 cvs 691:
1.5 cvs 692: return (result);
1.3 cvs 693: }
1.22 ! cvs 694: /*----------------------------------------------------------------------
! 695: HasKnownFileSuffix
! 696: returns TRUE if path points to a file ending with a suffix.
! 697: ----------------------------------------------------------------------*/
! 698: #ifdef __STDC__
! 699: boolean HasKnownFileSuffix (char *path)
! 700: #else /* __STDC__ */
! 701: boolean HasKnownFileSuffix (path)
! 702: char *path;
! 703: #endif /* __STDC__ */
! 704: {
! 705: char *root;
! 706: char temppath[MAX_LENGTH];
! 707: char suffix[MAX_LENGTH];
! 708:
! 709: if (!path || path[0] == EOS)
! 710: return (FALSE);
! 711:
! 712: root = HTParse(path, (char *) NULL, PARSE_PATH | PARSE_PUNCTUATION);
! 713:
! 714: if (root)
! 715: {
! 716: strcpy (temppath, root);
! 717: HT_FREE (root);
! 718: /* Get the suffix */
! 719: ExtractSuffix (temppath, suffix);
! 720:
! 721: if( suffix[0] == EOS)
! 722: /* no suffix */
! 723: return (FALSE);
! 724:
! 725: /* Normalize the suffix */
! 726: ConvertToLowerCase (suffix);
! 727:
! 728: if ((!strcmp (suffix, "gz")) ||
! 729: (!strcmp (suffix, "z")))
! 730: /* skip the compressed suffix */
! 731: {
! 732: ExtractSuffix (temppath, suffix);
! 733: if(suffix[0] == EOS)
! 734: /* no suffix */
! 735: return (FALSE);
! 736: /* Normalize the suffix */
! 737: ConvertToLowerCase (suffix);
! 738: }
! 739:
! 740: if ((strcmp (suffix, "gif")) && (strcmp (suffix, "xbm")) &&
! 741: (strcmp (suffix, "xpm")) && (strcmp (suffix, "jpg")) &&
! 742: (strcmp (suffix, "pdf")) && (strcmp (suffix, "png")) &&
! 743: (strcmp (suffix, "tgz")) && (strcmp (suffix, "xpg")) &&
! 744: (strcmp (suffix, "xpd")) && (strcmp (suffix, "ps")) &&
! 745: (strcmp (suffix, "au")) && (strcmp (suffix, "html")) &&
! 746: (strcmp (suffix, "htm")) && (strcmp (suffix, "shtml")) &&
! 747: (strcmp (suffix, "txt")) && (strcmp (suffix, "css")) &&
! 748: (strcmp (suffix, "eps")))
! 749: return (FALSE);
! 750: else
! 751: return (TRUE);
! 752: }
! 753: else
! 754: return (FALSE);
! 755: }
! 756:
! 757:
! 758: /*----------------------------------------------------------------------
! 759: ConvertToLowerCase
! 760: Converts a string to lowercase.
! 761: ----------------------------------------------------------------------*/
! 762: #ifdef __STDC__
! 763: static void ConvertToLowerCase (char *string)
! 764: #else /* __STDC__ */
! 765: static void ConvertToLowerCase (string)
! 766: char *string;
! 767:
! 768: #endif /* __STDC__ */
! 769: {
! 770: int i;
! 771:
! 772: if (!string)
! 773: return;
! 774:
! 775: for (i = 0; string[i] != EOS; i++)
! 776: string[i] = TOLOWER (string[i]);
! 777: }
! 778:
! 779:
! 780:
1.9 cvs 781:
782:
783:
Webmaster