All pastes #401953 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-03-19 16:59 UTC
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&#269;íná &#345;et&#283;zcem \"http://\"\n");
	return -1;
    }
    
    //alokace pam&#283;ti
    if(((*url) = (tUrlPtr) malloc (sizeof (struct tUrl))) == NULL) {
	fprintf (stderr, "Nedostatek pam&#283;ti pro funkci urlSet1\n");
	return -1;
    }
    if (((*url)->url = (char *) malloc (sizeof (entry) + 1)) == NULL) {
	free ((void *) *url);
	fprintf (stderr, "Nedostatek pam&#283;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&#283;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&#283;ti pro funkci urlSet4\n");
	return -1;
    }
    
    char *portStr;
    if((portStr = (char *) malloc (sizeof (entry) + 1)) == NULL) {
	urlUnset (url);
	fprintf (stderr, "Nedostatek pam&#283;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&#269;ítadlo hostname
    int k = 0;	//po&#269;ítadlo portStr
    int l = 0;	//po&#269;í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&#261;et&#345;ení zda je znak &#269;íslice
		    if (entry[i]<) {
			fprintf (stderr, "V &#269;ísle portu se vyskytly neo&#269;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&#269;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&#261;e prob&#283;hlo OK\n");
    return 1;
}