src/lib/lightmediascanner_utils.c

Go to the documentation of this file.
00001 #include <lightmediascanner_utils.h>
00002 #include <ctype.h>
00003 #include <alloca.h>
00004 
00012 void
00013 lms_strstrip(char *str, unsigned int *p_len)
00014 {
00015     int i, len;
00016     char *p;
00017 
00018     len = *p_len;
00019 
00020     if (len < 2) /* just '\0'? */
00021         return;
00022 
00023     p = str + len - 1;
00024     for (i = len - 1; i >= 0; i--) {
00025         if (isspace(*p)) {
00026             *p = '\0';
00027             len--;
00028             p--;
00029         } else
00030             break;
00031     }
00032     if (len == 0) {
00033         *p_len = 0;
00034         return;
00035     }
00036 
00037     p = str;
00038     for (i = 0; i < len; i++) {
00039         if (isspace(*p))
00040             p++;
00041         else
00042             break;
00043     }
00044     len -= i;
00045     if (len == 0) {
00046         *str = '\0';
00047         *p_len = 0;
00048         return;
00049     }
00050 
00051     *p_len = len;
00052 
00053     if (str < p)
00054         for (; len > 0; len--, str++, p++)
00055             *str = *p;
00056 }
00057 
00068 int
00069 lms_which_extension(const char *name, unsigned int name_len, const struct lms_string_size *exts, unsigned int exts_len) {
00070     int i;
00071     unsigned int *exts_pos;
00072     const char *s;
00073 
00074     exts_pos = alloca(exts_len * sizeof(*exts_pos));
00075     for (i = 0; i < exts_len; i++)
00076         exts_pos[i] = exts[i].len;
00077 
00078     for (s = name + name_len - 1; s >= name; s--) {
00079         int i, match;
00080         char c1, c2;
00081 
00082         c1 = *s;
00083         if (c1 >= 'a')
00084             c2 = c1;
00085         else
00086             c2 = 'a' + c1 - 'A';
00087 
00088         match = 0;
00089         for (i = 0; i < exts_len; i++) {
00090             if (exts_pos[i] > 0) {
00091                 char ce;
00092 
00093                 ce = exts[i].str[exts_pos[i] - 1];
00094                 if (ce == c1 || ce == c2) {
00095                     if (exts_pos[i] == 1)
00096                         return i;
00097                     exts_pos[i]--;
00098                     match = 1;
00099                 } else
00100                     exts_pos[i] = 0;
00101             }
00102         }
00103         if (!match)
00104             return -1;
00105     }
00106 
00107     return -1;
00108 }

Generated on Thu Dec 13 02:04:03 2007 for Light Media Scanner by  doxygen 1.5.2