noice.cView |
---|
54 | 54 … | SEL_PGDN, |
55 | 55 … | SEL_PGUP, |
56 | 56 … | SEL_SH, |
57 | 57 … | SEL_CD, |
| 58 … | + SEL_KNOW, |
58 | 59 … | }; |
59 | 60 … | |
60 | 61 … | struct key { |
61 | 62 … | int sym; |
223 | 224 … | return 1; |
224 | 225 … | return 0; |
225 | 226 … | } |
226 | 227 … | |
| 228 … | +char * |
| 229 … | +mksuper(char **a, unsigned int n) |
| 230 … | +{ |
| 231 … | + unsigned int i, len; |
| 232 … | + char *super, *regex; |
| 233 … | + |
| 234 … | + if (n == 0) |
| 235 … | + return NULL; |
| 236 … | + if (n == 1) |
| 237 … | + return a[1]; |
| 238 … | + |
| 239 … | + super = xstrdup("("); |
| 240 … | + for (i = 0; i < n; i++) { |
| 241 … | + regex = a[i]; |
| 242 … | + len = strlen(super) + 1 + strlen(regex) + 1; |
| 243 … | + super = xrealloc(super, len); |
| 244 … | + if (i != 0) |
| 245 … | + strlcat(super, "|", len); |
| 246 … | + strlcat(super, regex, len); |
| 247 … | + } |
| 248 … | + len = strlen(super) + 1 + 1; |
| 249 … | + super = xrealloc(super, len); |
| 250 … | + strlcat(super, ")", len); |
| 251 … | + |
| 252 … | + return super; |
| 253 … | +} |
| 254 … | + |
| 255 … | + |
| 256 … | +char * |
| 257 … | +mksuperassoc(void) |
| 258 … | +{ |
| 259 … | + unsigned int i; |
| 260 … | + char **regexes; |
| 261 … | + char *super; |
| 262 … | + |
| 263 … | + regexes = xmalloc((LEN(assocs) - 1) * sizeof(*regexes)); |
| 264 … | + for (i = 0; i < LEN(assocs) - 1; i++) |
| 265 … | + regexes[i] = assocs[i].regex; |
| 266 … | + super = mksuper(regexes, LEN(assocs) - 1); |
| 267 … | + free(regexes); |
| 268 … | + |
| 269 … | + return super; |
| 270 … | +} |
| 271 … | + |
| 272 … | + |
227 | 273 … | int |
| 274 … | +known(char *path) |
| 275 … | +{ |
| 276 … | + int fd, r; |
| 277 … | + char *super; |
| 278 … | + regex_t regex; |
| 279 … | + struct stat sb; |
| 280 … | + |
| 281 … | + |
| 282 … | + fd = open(path, O_RDONLY | O_NONBLOCK); |
| 283 … | + if (fd == -1) { |
| 284 … | + return 0; |
| 285 … | + } |
| 286 … | + r = fstat(fd, &sb); |
| 287 … | + if (r == -1) { |
| 288 … | + close(fd); |
| 289 … | + return 0; |
| 290 … | + } |
| 291 … | + close(fd); |
| 292 … | + |
| 293 … | + |
| 294 … | + if (S_ISDIR(sb.st_mode)) |
| 295 … | + return 1; |
| 296 … | + |
| 297 … | + if (!S_ISREG(sb.st_mode)) |
| 298 … | + return 0; |
| 299 … | + |
| 300 … | + super = mksuperassoc(); |
| 301 … | + r = regcomp(®ex, super, REG_NOSUB | REG_EXTENDED); |
| 302 … | + if (r != 0) |
| 303 … | + return 1; |
| 304 … | + if (regexec(®ex, path, 0, NULL, 0) != REG_NOMATCH) |
| 305 … | + return 1; |
| 306 … | + |
| 307 … | + return 0; |
| 308 … | +} |
| 309 … | + |
| 310 … | +int |
228 | 311 … | entrycmp(const void *va, const void *vb) |
229 | 312 … | { |
230 | 313 … | const struct entry *a, *b; |
231 | 314 … | |
436 | 519 … | || strcmp(dp->d_name, "..") == 0) |
437 | 520 … | continue; |
438 | 521 … | if (filter(re, dp->d_name) == 0) |
439 | 522 … | continue; |
440 | | - *dents = xrealloc(*dents, (n + 1) * sizeof(**dents)); |
441 | | - (*dents)[n].name = xstrdup(dp->d_name); |
| 523 … | + newpath = makepath(path, dp->d_name); |
442 | 524 … | |
443 | | - newpath = makepath(path, dp->d_name); |
444 | 525 … | r = lstat(newpath, &sb); |
445 | 526 … | if (r == -1) |
446 | 527 … | printerr(1, "lstat"); |
| 528 … | + if (know && !known(newpath)) { |
| 529 … | + free(newpath); |
| 530 … | + continue; |
| 531 … | + } |
| 532 … | + *dents = xrealloc(*dents, (n + 1) * sizeof(**dents)); |
| 533 … | + (*dents)[n].name = xstrdup(dp->d_name); |
447 | 534 … | (*dents)[n].mode = sb.st_mode; |
448 | 535 … | n++; |
449 | 536 … | } |
450 | 537 … | |
739 | 826 … | free(filter); |
740 | 827 … | filter = xstrdup(ifilter); |
741 | 828 … | DPRINTF_S(path); |
742 | 829 … | goto out; |
| 830 … | + case SEL_KNOW: |
| 831 … | + know = !know; |
| 832 … | + |
| 833 … | + oldpath = makepath(path, dents[cur].name); |
| 834 … | + goto out; |
743 | 835 … | } |
744 | 836 … | } |
745 | 837 … | |
746 | 838 … | out: |