00001 00021 #include <lightmediascanner_utils.h> 00022 #include <ctype.h> 00023 #include <stdlib.h> 00024 #include <alloca.h> 00025 00033 void 00034 lms_strstrip(char *str, unsigned int *p_len) 00035 { 00036 int i, len; 00037 char *p; 00038 00039 len = *p_len; 00040 00041 if (len == 0) 00042 return; 00043 00044 if (*str == '\0') { 00045 *p_len = 0; 00046 return; 00047 } 00048 00049 p = str + len - 1; 00050 for (i = len - 1; i >= 0; i--) { 00051 if (isspace(*p) || *p == '\0') { 00052 *p = '\0'; 00053 len--; 00054 p--; 00055 } else 00056 break; 00057 } 00058 if (len == 0) { 00059 *p_len = 0; 00060 return; 00061 } 00062 00063 p = str; 00064 for (i = 0; i < len; i++) { 00065 if (isspace(*p)) 00066 p++; 00067 else 00068 break; 00069 } 00070 len -= i; 00071 if (len == 0) { 00072 *str = '\0'; 00073 *p_len = 0; 00074 return; 00075 } 00076 00077 *p_len = len; 00078 00079 if (str < p) 00080 for (; len >= 0; len--, str++, p++) 00081 *str = *p; 00082 } 00083 00093 void 00094 lms_strstrip_and_free(char **p_str, unsigned int *p_len) 00095 { 00096 if (!*p_str) 00097 return; 00098 00099 lms_strstrip(*p_str, p_len); 00100 if (*p_len == 0) { 00101 free(*p_str); 00102 *p_str = NULL; 00103 } 00104 } 00105 00113 void 00114 lms_string_size_strip_and_free(struct lms_string_size *p) 00115 { 00116 if (!p->str) 00117 return; 00118 00119 lms_strstrip(p->str, &p->len); 00120 if (p->len == 0) { 00121 free(p->str); 00122 p->str = NULL; 00123 } 00124 } 00125 00126 00137 int 00138 lms_which_extension(const char *name, unsigned int name_len, const struct lms_string_size *exts, unsigned int exts_len) { 00139 int i; 00140 unsigned int *exts_pos; 00141 const char *s; 00142 00143 exts_pos = alloca(exts_len * sizeof(*exts_pos)); 00144 for (i = 0; i < exts_len; i++) 00145 exts_pos[i] = exts[i].len; 00146 00147 for (s = name + name_len - 1; s >= name; s--) { 00148 int i, match; 00149 char c1, c2; 00150 00151 c1 = *s; 00152 if (c1 >= 'a') 00153 c2 = c1; 00154 else 00155 c2 = 'a' + c1 - 'A'; 00156 00157 match = 0; 00158 for (i = 0; i < exts_len; i++) { 00159 if (exts_pos[i] > 0) { 00160 char ce; 00161 00162 ce = exts[i].str[exts_pos[i] - 1]; 00163 if (ce == c1 || ce == c2) { 00164 if (exts_pos[i] == 1) 00165 return i; 00166 exts_pos[i]--; 00167 match = 1; 00168 } else 00169 exts_pos[i] = 0; 00170 } 00171 } 00172 if (!match) 00173 return -1; 00174 } 00175 00176 return -1; 00177 }