rendered paste body#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
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;
}