parse_url() is void.
[people/xl0/gpxe.git] / src / core / url.c
1 #include "string.h"
2 #include "url.h"
3
4 /*
5  * Parse a URL string into its constituent parts.
6  *
7  * We accept URLs of the form
8  *
9  *   [protocol://[host][:port]/]path/to/file
10  *
11  * The URL string will be modified by having NULs inserted after
12  * "protocol", "host" and "port".  The original URL can be
13  * reconstructed by calling unparse_url.
14  *
15  */
16 void parse_url ( struct url_info *info, char *url ) {
17         char *p;
18
19         DBG ( "URL parsing \"%s\"\n", url );
20
21         /* Zero the structure */
22         memset ( info, 0, sizeof ( *info ) );
23
24         /* Search for a protocol delimiter */
25         for ( p = url ; *p ; p++ ) {
26                 if ( memcmp ( p, "://", 3 ) != 0 )
27                         continue;
28
29                 /* URL has an explicit protocol */
30                 info->protocol = url;
31                 *p = '\0';
32                 p += 3;
33                 info->host = p;
34
35                 /* Search for port or file delimiter */
36                 for ( ; *p ; p++ ) {
37                         if ( *p == ':' ) {
38                                 *p = '\0';
39                                 info->port = p + 1;
40                                 continue;
41                         }
42                         if ( *p == '/' ) {
43                                 *(p++) = '\0';
44                                 break;
45                         }
46                 }
47                 info->file = p;
48                 DBG ( "URL protocol \"%s\" host \"%s\" port \"%s\" "
49                       "file \"%s\"\n", info->protocol, info->host,
50                       info->port ? info->port : "(NONE)", info->file );
51                 return;
52         }
53
54         /* URL has no explicit protocol; is just a filename */
55         info->file = url;
56         DBG ( "URL file \"%s\"\n", info->file );
57 }
58
59 /*
60  * Restore a parsed URL to its original pristine form.
61  *
62  */
63 char * unparse_url ( struct url_info *info ) {
64         if ( info->protocol ) {
65                 /* URL had a protocol: fill in the deleted separators */
66                 info->file[-1] = '/';
67                 if ( info->port ) {
68                         info->port[-1] = ':';
69                 }
70                 info->host[-3] = ':';
71                 DBG ( "URL reconstructed \"%s\"\n", info->protocol );
72                 return info->protocol;
73         } else {
74                 /* URL had no protocol; was just a filename */
75                 DBG ( "URL reconstructed \"%s\"\n", info->file );
76                 return info->file;
77         }
78 }