/* * $Id$ * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2010-2011, Kaori Hagihara * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "cache_manager.h" cachelist_param_t * gene_cachelist(void) { cachelist_param_t *cachelist; cachelist = (cachelist_param_t *)malloc(sizeof(cachelist_param_t)); cachelist->first = NULL; cachelist->last = NULL; return cachelist; } void delete_cachelist(cachelist_param_t **cachelist) { cache_param_t *cachePtr, *cacheNext; cachePtr = (*cachelist)->first; while (cachePtr != NULL) { cacheNext = cachePtr->next; delete_cache(&cachePtr); cachePtr = cacheNext; } free(*cachelist); } cache_param_t * gene_cache(const char *targetname, int csn, char *tid, char *cid) { cache_param_t *cache; cache = (cache_param_t *)malloc(sizeof(cache_param_t)); cache->filename = strdup(targetname); cache->tid = strdup(tid); cache->csn = csn; cache->cid = (char **)malloc(sizeof(char *)); *cache->cid = strdup(cid); cache->numOfcid = 1; #if 1 cache->metadatalist = NULL; #else cache->metadatalist = gene_metadatalist(); #endif cache->ihdrbox = NULL; cache->next = NULL; return cache; } void delete_cache(cache_param_t **cache) { int i; free((*cache)->filename); free((*cache)->tid); delete_metadatalist(&(*cache)->metadatalist); if ((*cache)->ihdrbox) { free((*cache)->ihdrbox); } for (i = 0; i < (*cache)->numOfcid; i++) { free((*cache)->cid[i]); } free((*cache)->cid); free(*cache); } void insert_cache_into_list(cache_param_t *cache, cachelist_param_t *cachelist) { if (cachelist->first) { cachelist->last->next = cache; } else { cachelist->first = cache; } cachelist->last = cache; } cache_param_t * search_cache(const char targetname[], cachelist_param_t *cachelist) { cache_param_t *foundcache; if (!targetname) { return NULL; } foundcache = cachelist->first; while (foundcache != NULL) { if (strcmp(targetname, foundcache->filename) == 0) { return foundcache; } foundcache = foundcache->next; } return NULL; } cache_param_t * search_cacheBycsn(int csn, cachelist_param_t *cachelist) { cache_param_t *foundcache; foundcache = cachelist->first; while (foundcache != NULL) { if (csn == foundcache->csn) { return foundcache; } foundcache = foundcache->next; } return NULL; } cache_param_t * search_cacheBycid(const char cid[], cachelist_param_t *cachelist) { cache_param_t *foundcache; int i; if (!cid) { return NULL; } foundcache = cachelist->first; while (foundcache != NULL) { for (i = 0; i < foundcache->numOfcid; i++) if (strcmp(cid, foundcache->cid[i]) == 0) { return foundcache; } foundcache = foundcache->next; } return NULL; } cache_param_t * search_cacheBytid(const char tid[], cachelist_param_t *cachelist) { cache_param_t *foundcache; if (!tid) { return NULL; } foundcache = cachelist->first; while (foundcache != NULL) { if (strcmp(tid, foundcache->tid) == 0) { return foundcache; } foundcache = foundcache->next; } return NULL; } void add_cachecid(const char *cid, cache_param_t *cache) { if (!cid) { return; } if ((cache->cid = realloc(cache->cid, (OPJ_SIZE_T)(cache->numOfcid + 1) * sizeof(char *))) == NULL) { fprintf(stderr, "failed to add new cid to cache table in add_cachecid()\n"); return; } cache->cid[ cache->numOfcid] = strdup(cid); cache->numOfcid ++; } void update_cachetid(const char *tid, cache_param_t *cache) { if (!tid) { return; } if (tid[0] != '0' && strcmp(tid, cache->tid) != 0) { fprintf(stderr, "tid is updated to %s for %s\n", tid, cache->filename); free(cache->tid); cache->tid = strdup(tid); } } void remove_cidInCache(const char *cid, cache_param_t *cache); void remove_cachecid(const char *cid, cachelist_param_t *cachelist) { cache_param_t *cache; cache = search_cacheBycid(cid, cachelist); remove_cidInCache(cid, cache); } void remove_cidInCache(const char *cid, cache_param_t *cache) { int idx = -1; char **tmp; int i, j; for (i = 0; i < cache->numOfcid; i++) if (strcmp(cid, cache->cid[i]) == 0) { idx = i; break; } if (idx == -1) { fprintf(stderr, "cid: %s not found\n", cid); return; } tmp = cache->cid; cache->cid = (char **)malloc((OPJ_SIZE_T)(cache->numOfcid - 1) * sizeof( char *)); for (i = 0, j = 0; i < cache->numOfcid; i++) { if (i != idx) { cache->cid[j] = strdup(tmp[i]); j++; } free(tmp[i]); } free(tmp); cache->numOfcid --; } void print_cache(cache_param_t *cache) { int i; fprintf(stdout, "cache\n"); fprintf(stdout, "\t filename: %s\n", cache->filename); fprintf(stdout, "\t tid: %s\n", cache->tid); fprintf(stdout, "\t csn: %d\n", cache->csn); fprintf(stdout, "\t cid:"); for (i = 0; i < cache->numOfcid; i++) { fprintf(stdout, " %s", cache->cid[i]); } fprintf(stdout, "\n"); } void print_allcache(cachelist_param_t *cachelist) { cache_param_t *ptr; fprintf(stdout, "cache list\n"); ptr = cachelist->first; while (ptr != NULL) { print_cache(ptr); ptr = ptr->next; } }