/* * The Npic library * * Copyright (C) 2003 Edouard Thiel * * This library is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* * files_hints.c - 15/10/2010 * * Hints in filenames */ #include /*--------------------- P U B L I C - I N T E R F A C E ----------------------*/ /*-------------------- P R I V A T E - F U N C T I O N S ---------------------*/ /* * Analyse a filename, find realname, extension, compression, and hints. * The general form is * "my.name.extension.gz:hintA,hintB" (no '.' after ':') * In this example, * realname is "my.name.extension.gz" * extension is ".extension" * compression is "gz" * hint[0] is "hintA", hint[1] is "hintB", hint[2] is NULL. * * After the call, h must be freed with NpicFileFreeHints(). * Return NPIC_SUCCESS else error code. Silent. */ int NpicFileParseHints (const char *filename, Npic_file_hints *h) { int length, ind_opt, ind_cmp, ind_ext, j, k, n; if (h == NULL) return NPIC_ERR_NULL_PTR; h->filename = strdup (filename); h->realname = h->extension = h->hints[0] = NULL; h->comp = NPIC_COMPRESS_NONE; length = strlen (filename); /* Search position of last ':' */ for (ind_opt = length-1 ; ind_opt >= 0; ind_opt--) { if (filename[ind_opt] == '.') { ind_opt = -1; break; } if (filename[ind_opt] == ':') break; } if (ind_opt < 0) ind_opt = length; h->realname = strndup (filename, ind_opt); /* Search for hints, comma-separated */ for (j = k = ind_opt+1, n = 0; k <= length; k++) if (filename[k] == ',' || filename[k] == 0) { if (n >= NPIC_FILE_HINTS-1) { h->hints[NPIC_FILE_HINTS-1] = NULL; return NPIC_ERROR; } if (k-j > 0) h->hints[n++] = strndup (filename+j, k-j); j = k+1; } h->hints[n] = NULL; /* Check compression */ ind_cmp = ind_opt; if (ind_cmp >= 3 && strncmp (filename+ind_cmp-3, ".gz" , 3) == 0) { ind_cmp -= 3; h->comp = NPIC_COMPRESS_GZ; } else if (ind_cmp >= 4 && strncmp (filename+ind_cmp-4, ".bz2", 4) == 0) { ind_cmp -= 4; h->comp = NPIC_COMPRESS_BZ2; } else if (ind_cmp >= 3 && strncmp (filename+ind_cmp-3, ".7z" , 3) == 0) { ind_cmp -= 3; h->comp = NPIC_COMPRESS_7Z; } /* Find extension */ for (ind_ext = ind_cmp-1; ind_ext >= 0; ind_ext--) if (filename[ind_ext] == '.') { h->extension = strndup (filename+ind_ext, ind_cmp-ind_ext); break; } if (h->extension == NULL) h->extension = strdup (""); /* FIX 18/05/2012 */ return NPIC_SUCCESS; } /* * Free memory after a NpicFileParseHints(). Silent. */ void NpicFileFreeHints (Npic_file_hints *h) { int k; if (h == NULL) return; free (h->filename), h->filename = NULL; free (h->realname), h->realname = NULL; free (h->extension), h->extension = NULL; for (k = 0; h->hints[k] != NULL; k++) free (h->hints[k]), h->hints[k] = NULL; } /* * Check if hint is set. * Return position >= 0 if set, else -1. Silent. */ int NpicFileHint (Npic_file_hints *h, const char *hint) { int k; if (h == NULL) return -1; for (k = 0; h->hints[k] != NULL; k++) if (strcmp (h->hints[k], hint) == 0) return k; return -1; } /* * Check if all hints are allowed. * allowed_list is NULL-terminated. * Return 0 for success, else -1. Silent. */ int NpicFileCheckHints (Npic_file_hints *h, const char *allowed_list[]) { int j, k, ok; if (h == NULL) return -1; if (allowed_list == NULL) return -1; for (k = 0; h->hints[k] != NULL; k++) { for (j = 0, ok = 0; allowed_list[j] != NULL; j++) if (strcmp (h->hints[k], allowed_list[j]) == 0) { ok = 1; break;} if (ok == 0) return -1; } return 0; }