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)
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 }