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 }