1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "sidl_net.h"
struct sidl_net_Connection* sidl_net_Connection__create( /*in*/ const char* url ) {
struct sidl_net_Connection *conn = malloc(sizeof(struct sidl_net_Connection));
int end = strlen(url),
i = 0, start = i,
size;
/* extract protocol name */
while ((i < end) && (url[i] != ':')) {
i++;
}
if ((i == start) || (i == end)) {
printf("ERROR: invalid URL format\n");
exit(2);
}
/* printf("i = %i\n", i); */
size = i - start;
conn->protocol = malloc(size + 1);
memset(conn->protocol, 0 , size + 1);
strncpy(conn->protocol, url + start, size);
/* printf("protocol: %s\n", conn->protocol); */
/* extract server name */
i += 3; /* skip the double slashes */
start = i;
while ((i < end) && (url[i] != ':')) {
i++;
}
if ((i == start) || (i == end)) {
printf("ERROR: invalid URL format\n");
exit(2);
}
size = i - start;
conn->server_name = malloc(size + 1);
memset(conn->server_name, 0 , size + 1);
strncpy(conn->server_name, url + start, size);
/* printf("server_name: %s\n", conn->server_name); */
/* extract port number */
i++; /* skip the colon */
start = i;
while ((i < end) && (url[i] != '/')) {
if ((url[i] < 48) || (url[i] > 57))
printf("ERROR: invalid URL format\n");
i++;
}
conn->port = atoi(url + start);
/* printf("port: %i\n", conn->port); */
/* extract path */
i++; /* skip the single slash */
start = i;
if (i < end) {
size = end - start;
conn->path = malloc(size + 1);
memset(conn->path, 0 , size + 1);
strcpy(conn->path, url + start);
/* printf("path: %s\n", conn->path); */
}
return conn;
}
void sidl_net_Connection__destroy( /*in*/ struct sidl_net_Connection* conn ) {
free(conn->protocol);
free(conn->server_name);
free(conn->path);
free(conn->session_id);
free(conn);
}
|