blob: 158f83d2b0d8734101b141794860c7316a3d7ac0 [file] [log] [blame]
H. Peter Anvin274cda82016-05-10 02:56:29 -07001/* ----------------------------------------------------------------------- *
2 *
H. Peter Anvin1aa79452018-12-10 23:00:10 -08003 * Copyright 1996-2018 The NASM Authors - All Rights Reserved
H. Peter Anvin274cda82016-05-10 02:56:29 -07004 * 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
H. Peter Anvin274cda82016-05-10 02:56:29 -070040#include <string.h>
H. Peter Anvin274cda82016-05-10 02:56:29 -070041#include <inttypes.h>
42
43#include "nasmlib.h"
44#include "hashtbl.h"
H. Peter Anvin1aa79452018-12-10 23:00:10 -080045#include "srcfile.h"
H. Peter Anvin274cda82016-05-10 02:56:29 -070046
47static const char *file_name = NULL;
48static int32_t line_number = 0;
49
50static struct hash_table filename_hash;
51
52void src_init(void)
53{
54 hash_init(&filename_hash, HASH_MEDIUM);
55}
56
57void src_free(void)
58{
H. Peter Anvinbbb39572017-04-24 00:41:21 -070059 hash_free_all(&filename_hash, false);
H. Peter Anvin274cda82016-05-10 02:56:29 -070060}
61
62/*
63 * Set the current filename, returning the old one. The input
64 * filename is duplicated if needed.
65 */
66const char *src_set_fname(const char *newname)
67{
68 struct hash_insert hi;
69 const char *oldname;
70 void **dp;
71
72 if (newname) {
73 dp = hash_find(&filename_hash, newname, &hi);
74 if (dp) {
75 newname = (const char *)(*dp);
76 } else {
77 newname = nasm_strdup(newname);
78 hash_add(&hi, newname, (void *)newname);
79 }
80 }
81
82 oldname = file_name;
83 file_name = newname;
84 return oldname;
85}
86
87int32_t src_set_linnum(int32_t newline)
88{
89 int32_t oldline = line_number;
90 line_number = newline;
91 return oldline;
92}
93
94void src_set(int32_t line, const char *fname)
95{
96 src_set_fname(fname);
97 src_set_linnum(line);
98}
99
100const char *src_get_fname(void)
101{
102 return file_name;
103}
104
105int32_t src_get_linnum(void)
106{
107 return line_number;
108}
109
110int32_t src_get(int32_t *xline, const char **xname)
111{
112 const char *xn = *xname;
113 int32_t xl = *xline;
114
115 *xline = line_number;
116 *xname = file_name;
117
118 /* XXX: Is the strcmp() really needed here? */
119 if (!file_name || !xn || (xn != file_name && strcmp(xn, file_name)))
120 return -2;
121 else
122 return line_number - xl;
123}