1 | /* ----------------------------------------------------------------------- * |
2 | * |
3 | * Copyright 1996-2016 The NASM Authors - All Rights Reserved |
4 | * See the file AUTHORS included with the NASM distribution for |
5 | * the specific copyright holders. |
6 | * |
7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following |
9 | * conditions are met: |
10 | * |
11 | * * Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. |
13 | * * Redistributions in binary form must reproduce the above |
14 | * copyright notice, this list of conditions and the following |
15 | * disclaimer in the documentation and/or other materials provided |
16 | * with the distribution. |
17 | * |
18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
19 | * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, |
20 | * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
21 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
22 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
23 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
24 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
25 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
26 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
27 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
29 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
30 | * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | * |
32 | * ----------------------------------------------------------------------- */ |
33 | |
34 | /* |
35 | * srcfile.c - keep track of the current position in the input stream |
36 | */ |
37 | |
38 | #include "compiler.h" |
39 | |
40 | #include <string.h> |
41 | #include <inttypes.h> |
42 | |
43 | #include "nasmlib.h" |
44 | #include "hashtbl.h" |
45 | |
46 | static const char *file_name = NULL; |
47 | static int32_t line_number = 0; |
48 | |
49 | static struct hash_table filename_hash; |
50 | |
51 | void src_init(void) |
52 | { |
53 | hash_init(&filename_hash, HASH_MEDIUM); |
54 | } |
55 | |
56 | void src_free(void) |
57 | { |
58 | hash_free_all(&filename_hash, false); |
59 | } |
60 | |
61 | /* |
62 | * Set the current filename, returning the old one. The input |
63 | * filename is duplicated if needed. |
64 | */ |
65 | const char *src_set_fname(const char *newname) |
66 | { |
67 | struct hash_insert hi; |
68 | const char *oldname; |
69 | void **dp; |
70 | |
71 | if (newname) { |
72 | dp = hash_find(&filename_hash, newname, &hi); |
73 | if (dp) { |
74 | newname = (const char *)(*dp); |
75 | } else { |
76 | newname = nasm_strdup(newname); |
77 | hash_add(&hi, newname, (void *)newname); |
78 | } |
79 | } |
80 | |
81 | oldname = file_name; |
82 | file_name = newname; |
83 | return oldname; |
84 | } |
85 | |
86 | int32_t src_set_linnum(int32_t newline) |
87 | { |
88 | int32_t oldline = line_number; |
89 | line_number = newline; |
90 | return oldline; |
91 | } |
92 | |
93 | void src_set(int32_t line, const char *fname) |
94 | { |
95 | src_set_fname(fname); |
96 | src_set_linnum(line); |
97 | } |
98 | |
99 | const char *src_get_fname(void) |
100 | { |
101 | return file_name; |
102 | } |
103 | |
104 | int32_t src_get_linnum(void) |
105 | { |
106 | return line_number; |
107 | } |
108 | |
109 | int32_t src_get(int32_t *xline, const char **xname) |
110 | { |
111 | const char *xn = *xname; |
112 | int32_t xl = *xline; |
113 | |
114 | *xline = line_number; |
115 | *xname = file_name; |
116 | |
117 | /* XXX: Is the strcmp() really needed here? */ |
118 | if (!file_name || !xn || (xn != file_name && strcmp(xn, file_name))) |
119 | return -2; |
120 | else |
121 | return line_number - xl; |
122 | } |
123 | |