Hex Artifact Content
Not logged in

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;.}.