blob: e84a8fb8223220f0a1b136af2b28434c16dea159 [file] [log] [blame]
H. Peter Anvin274cda82016-05-10 02:56:29 -07001/* ----------------------------------------------------------------------- *
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 <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <ctype.h>
44#include <errno.h>
45#include <inttypes.h>
46
47#include "nasmlib.h"
48#include "hashtbl.h"
49
50static const char *file_name = NULL;
51static int32_t line_number = 0;
52
53static struct hash_table filename_hash;
54
55void src_init(void)
56{
57 hash_init(&filename_hash, HASH_MEDIUM);
58}
59
60void src_free(void)
61{
62 struct hash_tbl_node *iter = NULL;
63 void *dp;
64
65 while ((dp = hash_iterate(&filename_hash, &iter, NULL)) != NULL)
66 nasm_free(dp);
67
68 hash_free(&filename_hash);
69}
70
71/*
72 * Set the current filename, returning the old one. The input
73 * filename is duplicated if needed.
74 */
75const char *src_set_fname(const char *newname)
76{
77 struct hash_insert hi;
78 const char *oldname;
79 void **dp;
80
81 if (newname) {
82 dp = hash_find(&filename_hash, newname, &hi);
83 if (dp) {
84 newname = (const char *)(*dp);
85 } else {
86 newname = nasm_strdup(newname);
87 hash_add(&hi, newname, (void *)newname);
88 }
89 }
90
91 oldname = file_name;
92 file_name = newname;
93 return oldname;
94}
95
96int32_t src_set_linnum(int32_t newline)
97{
98 int32_t oldline = line_number;
99 line_number = newline;
100 return oldline;
101}
102
103void src_set(int32_t line, const char *fname)
104{
105 src_set_fname(fname);
106 src_set_linnum(line);
107}
108
109const char *src_get_fname(void)
110{
111 return file_name;
112}
113
114int32_t src_get_linnum(void)
115{
116 return line_number;
117}
118
119int32_t src_get(int32_t *xline, const char **xname)
120{
121 const char *xn = *xname;
122 int32_t xl = *xline;
123
124 *xline = line_number;
125 *xname = file_name;
126
127 /* XXX: Is the strcmp() really needed here? */
128 if (!file_name || !xn || (xn != file_name && strcmp(xn, file_name)))
129 return -2;
130 else
131 return line_number - xl;
132}