Added link support
[smdp.git] / src / url.c
1 #include <stdlib.h>
2 #include <assert.h>
3 #include <string.h>
4 #include <stdio.h>
5
6 #include "url.h"
7
8 typedef struct Url {
9         char * link_name;
10         char * target;
11         int x;
12         int y;
13         struct Url * next;
14 } Url_t;
15
16 static void url_del_elem(Url_t * elem);
17 static void url_print(Url_t * u);
18
19 static Url_t *list;
20 static int index_max;
21 static int init_ok;
22
23 void url_init(void) {
24         list = NULL;
25         index_max = 0;
26         init_ok = 1;
27 }
28
29 int url_add(const char * link_name, int link_name_length, const char * target, int target_length, int x, int y) {
30         if (!init_ok) return -1;
31         
32         Url_t *tmp = NULL;
33         int i = 0;
34         
35         if (list) {
36                 tmp = list;
37                 while (tmp->next) {
38                         tmp = tmp->next;
39                         i++;
40                 }
41                 tmp->next = malloc(sizeof(Url_t));
42                 assert(tmp->next);
43                 tmp = tmp->next;
44         } else {
45                 list = malloc(sizeof(Url_t));
46                 tmp = list;
47                 assert(tmp);
48         }
49         
50         tmp -> link_name = calloc(link_name_length, sizeof(char));
51         assert(tmp->link_name);
52         strncpy(tmp->link_name, link_name, link_name_length);
53         
54         tmp->target = calloc(target_length, sizeof(char));
55         assert(tmp->target);
56         strncpy(tmp->target, target, target_length);
57         
58         tmp->x = x;
59         tmp->y = y;
60         tmp->next = NULL;
61         
62         index_max++;
63         
64         return index_max-1;
65 }
66
67
68 char * url_get_target(int index) {
69         Url_t * tmp = list;
70         
71         while (index > 0 && tmp && tmp->next) {
72                 tmp = tmp->next;
73                 index --;
74         }
75         
76         if (!index) {
77                 return tmp->target;
78         } else return NULL; 
79 }
80
81 char * url_get_name(int index) {
82         Url_t * tmp = list;
83         
84         while (index > 0 && tmp && tmp->next) {
85                 tmp = tmp->next;
86                 index --;
87         }
88         
89         if (!index) {
90                 return tmp->link_name;
91         } else return NULL; 
92 }
93
94 void url_purge() {
95         url_del_elem(list);
96         list = NULL;
97         index_max = 0;
98         init_ok = 0;
99 }
100
101 static void url_del_elem(Url_t *elem) {
102         if (!elem) return;
103         
104         if (elem->next) {
105                 url_del_elem(elem->next);
106                 elem->next = NULL;
107         }
108         
109         if (elem->target) {
110                 free(elem->target);
111                 elem->target = NULL;
112         }
113         
114         if (elem->link_name) {
115                 free(elem->link_name);
116                 elem->link_name = NULL;
117         }
118         
119         free(elem);
120 }
121
122 void url_dump(void) {
123         if (!list) return;
124         
125         Url_t *tmp = list;
126         
127         while (tmp) {
128                 url_print(tmp);
129                 if (tmp->next)
130                         tmp = tmp->next;
131                 else break;
132         }
133 }
134
135 static void url_print(Url_t * u) {
136         printf("Url_t @ %p\n", u);
137 }
138
139 int url_get_amount(void) {
140         return index_max;
141 }