packio
annotate src/pathmap.c @ 1:a5728bc6a02f
moving along
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 09 Jan 2015 02:31:29 +0200 |
parents | a71bd70c1014 |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include <stdio.h> |
nuclear@0 | 2 #include <stdlib.h> |
nuclear@0 | 3 #include <string.h> |
nuclear@0 | 4 #include "pathmap.h" |
nuclear@0 | 5 #include "rbtree.h" |
nuclear@0 | 6 |
nuclear@0 | 7 static void map_entry_destructor(struct rbnode *node, void *data); |
nuclear@0 | 8 |
nuclear@0 | 9 static struct rbtree *map; |
nuclear@0 | 10 |
nuclear@0 | 11 int pkio_map(const char *from, const char *to) |
nuclear@0 | 12 { |
nuclear@0 | 13 char *myfrom, *myto; |
nuclear@0 | 14 |
nuclear@0 | 15 if(!map) { |
nuclear@0 | 16 if(!(map = rb_create(RB_KEY_STRING))) { |
nuclear@1 | 17 fprintf(stderr, "packio: failed to create the path mapping tree\n"); |
nuclear@0 | 18 return -1; |
nuclear@0 | 19 } |
nuclear@0 | 20 rb_set_delete_func(map, map_entry_destructor, 0); |
nuclear@0 | 21 } |
nuclear@0 | 22 |
nuclear@0 | 23 if(!(myfrom = malloc(strlen(from) + 1))) { |
nuclear@0 | 24 fprintf(stderr, "packio: failed to allocate mapping source string\n"); |
nuclear@0 | 25 return -1; |
nuclear@0 | 26 } |
nuclear@0 | 27 if(!(myto = malloc(strlen(to) + 1))) { |
nuclear@0 | 28 fprintf(stderr, "packio: failed to allocate mapping destination string\n"); |
nuclear@0 | 29 free(myto); |
nuclear@0 | 30 return -1; |
nuclear@0 | 31 } |
nuclear@0 | 32 strcpy(myfrom, from); |
nuclear@0 | 33 strcpy(myto, to); |
nuclear@0 | 34 |
nuclear@0 | 35 if(rb_insert(map, myfrom, myto) == -1) { |
nuclear@0 | 36 fprintf(stderr, "packio: failed to add path mapping\n"); |
nuclear@0 | 37 free(myfrom); |
nuclear@0 | 38 free(myto); |
nuclear@0 | 39 return -1; |
nuclear@0 | 40 } |
nuclear@0 | 41 return 0; |
nuclear@0 | 42 } |
nuclear@0 | 43 |
nuclear@0 | 44 const char *pkio_pathmap(const char *path) |
nuclear@0 | 45 { |
nuclear@0 | 46 struct rbnode *node; |
nuclear@0 | 47 |
nuclear@0 | 48 if(!map) { |
nuclear@0 | 49 return path; |
nuclear@0 | 50 } |
nuclear@0 | 51 |
nuclear@0 | 52 if(!(node = rb_find(map, (void*)path))) { |
nuclear@0 | 53 return path; |
nuclear@0 | 54 } |
nuclear@0 | 55 return node->data; |
nuclear@0 | 56 } |
nuclear@0 | 57 |
nuclear@0 | 58 static void map_entry_destructor(struct rbnode *node, void *data) |
nuclear@0 | 59 { |
nuclear@0 | 60 free(node->key); |
nuclear@0 | 61 free(node->data); |
nuclear@0 | 62 } |