1import csv
2import os.path
3
4from c_analyzer.parser.declarations import extract_storage
5from c_analyzer.variables import known as _common
6from c_analyzer.variables.info import Variable
7
8from . import DATA_DIR
9
10
11# XXX need tests:
12# * from_file()
13# * look_up_variable()
14
15
16DATA_FILE = os.path.join(DATA_DIR, 'known.tsv')
17
18
19def _get_storage(decl, infunc):
20    # statics
21    if decl.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')):
22        return 'static'
23    if decl.startswith(('_Py_IDENTIFIER(', '_Py_static_string(')):
24        return 'static'
25    if decl.startswith('PyDoc_VAR('):
26        return 'static'
27    if decl.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')):
28        return 'static'
29    if decl.startswith('WRAP_METHOD('):
30        return 'static'
31    # public extern
32    if decl.startswith('PyAPI_DATA('):
33        return 'extern'
34    # Fall back to the normal handler.
35    return extract_storage(decl, infunc=infunc)
36
37
38def _handle_var(varid, decl):
39#    if varid.name == 'id' and decl == UNKNOWN:
40#        # None of these are variables.
41#        decl = 'int id';
42    storage = _get_storage(decl, varid.funcname)
43    return Variable(varid, storage, decl)
44
45
46def from_file(infile=DATA_FILE, *,
47              _from_file=_common.from_file,
48              _handle_var=_handle_var,
49              ):
50    """Return the info for known declarations in the given file."""
51    return _from_file(infile, handle_var=_handle_var)
52
53
54def look_up_variable(varid, knownvars, *,
55                     _lookup=_common.look_up_variable,
56                     ):
57    """Return the known variable matching the given ID.
58
59    "knownvars" is a mapping of ID to Variable.
60
61    "match_files" is used to verify if two filenames point to
62    the same file.
63
64    If no match is found then None is returned.
65    """
66    return _lookup(varid, knownvars)
67