#include #include #include #include #include #include #include #include #include typedef struct tUrl { char *url; //zadané url char *hostname; char *query; int port; } *tUrlPtr; /* urlSet nastavuje strukturu tUrl */ int urlSet (tUrlPtr *, char *); void urlUnset (tUrlPtr *); /* ********************************************************* */ int urlSet (tUrlPtr *url, char *entry) { //kontrola http:// if (strncasecmp (entry, "http://", 7) != 0) { fprintf (stderr, "Zadané url nezačíná řetězcem \"http://\"\n"); return -1; } //alokace paměti if(((*url) = (tUrlPtr) malloc (sizeof (struct tUrl))) == NULL) { fprintf (stderr, "Nedostatek paměti pro funkci urlSet1\n"); return -1; } if (((*url)->url = (char *) malloc (sizeof (entry) + 1)) == NULL) { free ((void *) *url); fprintf (stderr, "Nedostatek paměti pro funkci urlSet2\n"); return -1; } if(((*url)->hostname = (char *) malloc (sizeof (entry) + 1)) == NULL) { free ((void *) (*url)->url); free ((void *) *url); fprintf (stderr, "Nedostatek paměti pro funkci urlSet3\n"); return -1; } if(((*url)->query = (char *) malloc (sizeof (entry) + 1)) == NULL) { free ((void *) (*url)->url); free ((void *) (*url)->hostname); free ((void *) *url); fprintf (stderr, "Nedostatek paměti pro funkci urlSet4\n"); return -1; } char *portStr; if((portStr = (char *) malloc (sizeof (entry) + 1)) == NULL) { urlUnset (url); fprintf (stderr, "Nedostatek paměti pro funkci urlSet5\n"); return -1; } strcpy ((*url)->url, entry); //získání hostname, port a query int i = 7; //vynecháme "http://" int j = 0; //počítadlo hostname int k = 0; //počítadlo portStr int l = 0; //počítadlo query int stav = 1; //1 - hostname //2 - port //3 - query while (entry[i] != '\0') { switch (entry[i]) { case ':' : { (*url)->hostname[j] = '\0'; stav = 2; break; } case '/' : { portStr[k] = '\0'; stav = 3; break; } } switch (stav) { case 1 : { (*url)->hostname[j] = entry[i]; ++j; break; } case 2 : { if (entry[i] != ':') { /* // oąetření zda je znak číslice if (entry[i]<) { fprintf (stderr, "V čísle portu se vyskytly neočekávané znaky\n"); return -1; } */ portStr[k] = entry[i]; ++k; } break; } case 3 : { (*url)->query[l] = entry[i]; ++l; break; } } ++i; } (*url)->hostname[j] = '\0'; portStr[k] = '\0'; (*url)->query[l] = '\0'; if (k != 0) { (*url)->port = atoi(portStr); } else { (*url)->port = 80; } free ((void *) portStr); return 1; } void urlUnset (tUrlPtr *url) { free ((void *) (*url)->url); free ((void *) (*url)->hostname); free ((void *) (*url)->query); free ((void *) (*url)); //(*url) = NULL; } int main (int argc, char *argv[]) { if (argc != 2) { fprintf (stderr, "Je očekáván 1 argument - url adresa\n"); return -1; } tUrlPtr url; if (urlSet (&url, argv[1]) != 1) { return -1; } printf ("Hostname: %s\nQuery: %s\nPort: %i\n", url->hostname, url->query, url->port); urlUnset (&url); puts ("Vąe proběhlo OK\n"); return 1; }