File: type.cpp

package info (click to toggle)
watchman 4.9.0-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,992 kB
  • sloc: cpp: 27,459; python: 6,538; java: 3,404; php: 3,257; ansic: 2,803; javascript: 1,116; makefile: 671; ruby: 364; sh: 124; xml: 102; lisp: 4
file content (62 lines) | stat: -rw-r--r-- 1,454 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* Copyright 2013-present Facebook, Inc.
 * Licensed under the Apache License, Version 2.0 */

#include "watchman.h"

#include "make_unique.h"

class TypeExpr : public QueryExpr {
  char arg;

 public:
  explicit TypeExpr(char arg) : arg(arg) {}

  bool evaluate(struct w_query_ctx*, const FileResult* file) override {
    switch (arg) {
#ifndef _WIN32
      case 'b':
        return S_ISBLK(file->stat().mode);
      case 'c':
        return S_ISCHR(file->stat().mode);
      case 'p':
        return S_ISFIFO(file->stat().mode);
      case 's':
        return S_ISSOCK(file->stat().mode);
#endif
      case 'd':
        return file->stat().isDir();
      case 'f':
        return file->stat().isFile();
      case 'l':
        return file->stat().isSymlink();
#ifdef S_ISDOOR
      case 'D':
        return S_ISDOOR(file->stat().mode);
#endif
    default:
      return false;
    }
  }

  static std::unique_ptr<QueryExpr> parse(w_query*, const json_ref& term) {
    const char *ignore, *typestr, *found;
    char arg;

    if (json_unpack(term, "[s,u]", &ignore, &typestr) != 0) {
      throw QueryParseError("must use [\"type\", \"typestr\"]");
    }

    found = strpbrk(typestr, "bcdfplsD");
    if (!found || strlen(typestr) > 1) {
      throw QueryParseError("invalid type string '", typestr, "'");
    }

    arg = *found;

    return watchman::make_unique<TypeExpr>(arg);
  }
};
W_TERM_PARSER("type", TypeExpr::parse)

/* vim:ts=2:sw=2:et:
 */