Artifact
ec1af1e52ce75c28242b86a095cc779a4ac99df5:
0000: 2f 2a 20 66 69 6c 65 5f 6d 61 73 6b 2e 63 20 2d /* file_mask.c -
0010: 20 6d 61 74 63 68 69 6e 67 20 66 69 6c 65 20 61 matching file a
0020: 67 61 69 6e 73 74 20 61 20 6c 69 73 74 20 6f 66 gainst a list of
0030: 20 66 69 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a 23 file masks */.#
0040: 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 include <errno.h
0050: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 >.#include <stdi
0060: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 o.h>.#include <s
0070: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 tdlib.h>.#includ
0080: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 23 69 e <string.h>..#i
0090: 6e 63 6c 75 64 65 20 22 66 69 6c 65 5f 6d 61 73 nclude "file_mas
00a0: 6b 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 63 k.h".#include "c
00b0: 6f 6d 6d 6f 6e 5f 66 75 6e 63 2e 68 22 0a 0a 2f ommon_func.h"../
00c0: 2a 2a 0a 20 2a 20 43 6f 6e 76 65 72 74 20 74 68 **. * Convert th
00d0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 74 e given string t
00e0: 6f 20 6c 6f 77 65 72 2d 63 61 73 65 20 74 68 65 o lower-case the
00f0: 6e 20 70 75 74 20 69 74 20 69 6e 74 6f 0a 20 2a n put it into. *
0100: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 61 the specified a
0110: 72 72 61 79 20 6f 66 20 27 66 69 6c 65 20 6d 61 rray of 'file ma
0120: 73 6b 73 27 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 sks'.. *. * @par
0130: 61 6d 20 61 72 72 20 61 72 72 61 79 20 6f 66 20 am arr array of
0140: 66 69 6c 65 20 6d 61 73 6b 73 0a 20 2a 20 40 70 file masks. * @p
0150: 61 72 61 6d 20 6d 61 73 6b 20 61 20 73 74 72 69 aram mask a stri
0160: 6e 67 20 74 6f 20 61 64 64 0a 20 2a 2f 0a 73 74 ng to add. */.st
0170: 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 5f 6d atic void file_m
0180: 61 73 6b 5f 61 64 64 28 66 69 6c 65 5f 6d 61 73 ask_add(file_mas
0190: 6b 5f 61 72 72 61 79 2a 20 76 65 63 74 2c 20 63 k_array* vect, c
01a0: 6f 6e 73 74 20 63 68 61 72 2a 20 6d 61 73 6b 29 onst char* mask)
01b0: 0a 7b 0a 09 72 73 68 5f 76 65 63 74 6f 72 5f 61 .{..rsh_vector_a
01c0: 64 64 5f 70 74 72 28 76 65 63 74 2c 20 73 74 72 dd_ptr(vect, str
01d0: 5f 74 6f 6c 6f 77 65 72 28 6d 61 73 6b 29 29 3b _tolower(mask));
01e0: 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 43 6f 6e 73 74 .}../**. * Const
01f0: 72 75 63 74 20 61 72 72 61 79 20 66 72 6f 6d 20 ruct array from
0200: 61 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 a comma-separate
0210: 64 20 6c 69 73 74 20 6f 66 20 73 74 72 69 6e 67 d list of string
0220: 73 2e 0a 20 2a 0a 20 2a 20 40 70 61 72 61 6d 20 s.. *. * @param
0230: 63 6f 6d 6d 61 5f 73 65 70 61 72 61 74 65 64 5f comma_separated_
0240: 6c 69 73 74 20 74 68 65 20 63 6f 6d 6d 61 2d 73 list the comma-s
0250: 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 eparated list of
0260: 20 73 74 72 69 6e 67 73 0a 20 2a 20 40 72 65 74 strings. * @ret
0270: 75 72 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 20 urn constructed
0280: 61 72 72 61 79 0a 20 2a 2f 0a 66 69 6c 65 5f 6d array. */.file_m
0290: 61 73 6b 5f 61 72 72 61 79 2a 20 66 69 6c 65 5f ask_array* file_
02a0: 6d 61 73 6b 5f 6e 65 77 5f 66 72 6f 6d 5f 6c 69 mask_new_from_li
02b0: 73 74 28 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 st(const char* c
02c0: 6f 6d 6d 61 5f 73 65 70 61 72 61 74 65 64 5f 6c omma_separated_l
02d0: 69 73 74 29 0a 7b 0a 09 66 69 6c 65 5f 6d 61 73 ist).{..file_mas
02e0: 6b 5f 61 72 72 61 79 2a 20 76 65 63 74 20 3d 20 k_array* vect =
02f0: 66 69 6c 65 5f 6d 61 73 6b 5f 6e 65 77 28 29 3b file_mask_new();
0300: 0a 09 66 69 6c 65 5f 6d 61 73 6b 5f 61 64 64 5f ..file_mask_add_
0310: 6c 69 73 74 28 76 65 63 74 2c 20 63 6f 6d 6d 61 list(vect, comma
0320: 5f 73 65 70 61 72 61 74 65 64 5f 6c 69 73 74 29 _separated_list)
0330: 3b 0a 09 72 65 74 75 72 6e 20 76 65 63 74 3b 0a ;..return vect;.
0340: 7d 0a 0a 2f 2a 2a 0a 20 2a 20 53 70 6c 69 74 20 }../**. * Split
0350: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 the given string
0360: 20 62 79 20 63 6f 6d 6d 61 20 61 6e 64 20 70 75 by comma and pu
0370: 74 20 74 68 65 20 70 61 72 74 73 20 69 6e 74 6f t the parts into
0380: 20 61 72 72 61 79 2e 0a 20 2a 0a 20 2a 20 40 70 array.. *. * @p
0390: 61 72 61 6d 20 76 65 63 74 20 74 68 65 20 61 72 aram vect the ar
03a0: 72 61 79 20 74 6f 20 70 75 74 20 74 68 65 20 70 ray to put the p
03b0: 61 72 73 65 64 20 65 6c 65 6d 65 6e 74 73 20 74 arsed elements t
03c0: 6f 0a 20 2a 20 40 70 61 72 61 6d 20 63 6f 6d 6d o. * @param comm
03d0: 61 5f 73 65 70 61 72 61 74 65 64 5f 6c 69 73 74 a_separated_list
03e0: 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 73 the string to s
03f0: 70 6c 69 74 0a 20 2a 2f 0a 76 6f 69 64 20 66 69 plit. */.void fi
0400: 6c 65 5f 6d 61 73 6b 5f 61 64 64 5f 6c 69 73 74 le_mask_add_list
0410: 28 66 69 6c 65 5f 6d 61 73 6b 5f 61 72 72 61 79 (file_mask_array
0420: 2a 20 76 65 63 74 2c 20 63 6f 6e 73 74 20 63 68 * vect, const ch
0430: 61 72 2a 20 63 6f 6d 6d 61 5f 73 65 70 61 72 61 ar* comma_separa
0440: 74 65 64 5f 6c 69 73 74 29 0a 7b 0a 09 63 68 61 ted_list).{..cha
0450: 72 20 2a 62 75 66 2c 20 2a 63 75 72 2c 20 2a 6e r *buf, *cur, *n
0460: 65 78 74 3b 0a 09 69 66 20 28 21 63 6f 6d 6d 61 ext;..if (!comma
0470: 5f 73 65 70 61 72 61 74 65 64 5f 6c 69 73 74 20 _separated_list
0480: 7c 7c 20 21 2a 63 6f 6d 6d 61 5f 73 65 70 61 72 || !*comma_separ
0490: 61 74 65 64 5f 6c 69 73 74 29 20 7b 0a 09 09 72 ated_list) {...r
04a0: 65 74 75 72 6e 3b 0a 09 7d 0a 09 62 75 66 20 3d eturn;..}..buf =
04b0: 20 72 73 68 5f 73 74 72 64 75 70 28 63 6f 6d 6d rsh_strdup(comm
04c0: 61 5f 73 65 70 61 72 61 74 65 64 5f 6c 69 73 74 a_separated_list
04d0: 29 3b 0a 09 66 6f 72 20 28 63 75 72 20 3d 20 62 );..for (cur = b
04e0: 75 66 3b 20 63 75 72 20 26 26 20 2a 63 75 72 3b uf; cur && *cur;
04f0: 20 63 75 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 cur = next) {..
0500: 09 6e 65 78 74 20 3d 20 73 74 72 63 68 72 28 63 .next = strchr(c
0510: 75 72 2c 20 27 2c 27 29 3b 0a 09 09 69 66 20 28 ur, ',');...if (
0520: 6e 65 78 74 29 20 2a 28 6e 65 78 74 2b 2b 29 20 next) *(next++)
0530: 3d 20 27 5c 30 27 3b 0a 09 09 69 66 20 28 2a 63 = '\0';...if (*c
0540: 75 72 20 21 3d 20 27 5c 30 27 29 20 66 69 6c 65 ur != '\0') file
0550: 5f 6d 61 73 6b 5f 61 64 64 28 76 65 63 74 2c 20 _mask_add(vect,
0560: 63 75 72 29 3b 0a 09 7d 0a 09 66 72 65 65 28 62 cur);..}..free(b
0570: 75 66 29 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 4d uf);.}../**. * M
0580: 61 74 63 68 20 61 20 67 69 76 65 6e 20 6e 61 6d atch a given nam
0590: 65 20 61 67 61 69 6e 73 74 20 61 20 6c 69 73 74 e against a list
05a0: 20 6f 66 20 73 74 72 69 6e 67 20 74 72 61 69 6c of string trail
05b0: 65 72 73 2e 0a 20 2a 20 55 73 75 61 6c 6c 79 20 ers.. * Usually
05c0: 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 61 20 used to match a
05d0: 66 69 6c 65 6e 61 6d 65 20 61 67 61 69 6e 73 74 filename against
05e0: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 65 78 list of file ex
05f0: 74 65 6e 73 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 tensions.. *. *
0600: 40 70 61 72 61 6d 20 76 65 63 74 20 74 68 65 20 @param vect the
0610: 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 20 array of string
0620: 74 72 61 69 6c 65 72 73 0a 20 2a 20 40 70 61 72 trailers. * @par
0630: 61 6d 20 6e 61 6d 65 20 74 68 65 20 6e 61 6d 65 am name the name
0640: 20 74 6f 20 6d 61 74 63 68 0a 20 2a 20 40 72 65 to match. * @re
0650: 74 75 72 6e 20 31 20 69 66 20 6d 61 74 63 68 65 turn 1 if matche
0660: 64 2c 20 30 20 6f 74 68 65 72 77 69 73 65 0a 20 d, 0 otherwise.
0670: 2a 2f 0a 69 6e 74 20 66 69 6c 65 5f 6d 61 73 6b */.int file_mask
0680: 5f 6d 61 74 63 68 28 66 69 6c 65 5f 6d 61 73 6b _match(file_mask
0690: 5f 61 72 72 61 79 2a 20 76 65 63 74 2c 20 63 6f _array* vect, co
06a0: 6e 73 74 20 63 68 61 72 2a 20 6e 61 6d 65 29 0a nst char* name).
06b0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 69 3b 0a 09 {..unsigned i;..
06c0: 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 09 73 69 int res = 0;..si
06d0: 7a 65 5f 74 20 6c 65 6e 2c 20 6e 61 6d 65 6c 65 ze_t len, namele
06e0: 6e 3b 0a 09 63 68 61 72 2a 20 62 75 66 3b 0a 0a n;..char* buf;..
06f0: 09 2f 2a 20 61 6c 6c 20 6e 61 6d 65 73 20 73 68 ./* all names sh
0700: 6f 75 6c 64 20 6d 61 74 63 68 20 61 67 61 69 6e ould match again
0710: 73 74 20 61 6e 20 65 6d 70 74 79 20 61 72 72 61 st an empty arra
0720: 79 20 2a 2f 0a 09 69 66 20 28 21 76 65 63 74 20 y */..if (!vect
0730: 7c 7c 20 21 76 65 63 74 2d 3e 73 69 7a 65 29 20 || !vect->size)
0740: 72 65 74 75 72 6e 20 31 3b 0a 0a 09 2f 2a 20 67 return 1;.../* g
0750: 65 74 20 61 20 6c 6f 77 65 72 63 61 73 65 20 6e et a lowercase n
0760: 61 6d 65 20 76 65 72 73 69 6f 6e 20 74 6f 20 69 ame version to i
0770: 67 6e 6f 72 65 20 63 61 73 65 20 77 68 65 6e 20 gnore case when
0780: 6d 61 74 63 68 69 6e 67 20 2a 2f 0a 09 62 75 66 matching */..buf
0790: 20 3d 20 73 74 72 5f 74 6f 6c 6f 77 65 72 28 6e = str_tolower(n
07a0: 61 6d 65 29 3b 0a 09 6e 61 6d 65 6c 65 6e 20 3d ame);..namelen =
07b0: 20 73 74 72 6c 65 6e 28 62 75 66 29 3b 0a 09 66 strlen(buf);..f
07c0: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 76 or (i = 0; i < v
07d0: 65 63 74 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 ect->size; i++)
07e0: 7b 0a 09 09 6c 65 6e 20 3d 20 73 74 72 6c 65 6e {...len = strlen
07f0: 28 28 63 68 61 72 2a 29 76 65 63 74 2d 3e 61 72 ((char*)vect->ar
0800: 72 61 79 5b 69 5d 29 3b 0a 09 09 69 66 20 28 6e ray[i]);...if (n
0810: 61 6d 65 6c 65 6e 20 3e 3d 20 6c 65 6e 20 26 26 amelen >= len &&
0820: 20 6d 65 6d 63 6d 70 28 62 75 66 20 2b 20 6e 61 memcmp(buf + na
0830: 6d 65 6c 65 6e 20 2d 20 6c 65 6e 2c 20 76 65 63 melen - len, vec
0840: 74 2d 3e 61 72 72 61 79 5b 69 5d 2c 20 6c 65 6e t->array[i], len
0850: 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 72 65 73 ) == 0) {....res
0860: 20 3d 20 31 3b 20 2f 2a 20 6d 61 74 63 68 65 64 = 1; /* matched
0870: 20 2a 2f 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 */....break;...
0880: 7d 0a 09 7d 0a 09 66 72 65 65 28 62 75 66 29 3b }..}..free(buf);
0890: 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a ..return res;.}.