1/*
2 * Copyright (c) 2003 Matthijs Hollemans
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 */
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <unistd.h>
27
28#include "rdef.h"
29#include "private.h"
30
31ptr_list_t include_dirs;
32ptr_list_t input_files;
33
34uint32 flags = 0;
35
36status_t rdef_err;
37int32 rdef_err_line;
38char rdef_err_file[B_PATH_NAME_LENGTH];
39char rdef_err_msg[1024];
40
41
42void
43free_ptr_list(ptr_list_t &list)
44{
45	for (ptr_iter_t i = list.begin(); i != list.end(); ++i) {
46		free(*i);
47	}
48
49	list.clear();
50}
51
52
53int32
54rdef_get_version()
55{
56	return 2;
57}
58
59
60status_t
61rdef_add_include_dir(const char *dir, bool toEndOfList)
62{
63	clear_error();
64
65	char *path = (char *)malloc(strlen(dir) + 2);
66	if (path == NULL) {
67		rdef_err = B_NO_MEMORY;
68		return B_NO_MEMORY;
69	}
70
71	strcpy(path, dir);
72	strcat(path, "/");
73
74	if (toEndOfList)
75		include_dirs.push_back(path);
76	else
77		include_dirs.push_front(path);
78
79	return B_OK;
80}
81
82
83status_t
84rdef_remove_include_dir(const char *dir)
85{
86	size_t length = strlen(dir);
87	bool noSlash = false;
88	if (dir[length - 1] != '/')
89		noSlash = true;
90
91	for (ptr_iter_t i = include_dirs.begin(); i != include_dirs.end(); ++i) {
92		char *path = (char *)*i;
93
94		if (!strncmp(dir, path, length)
95			&& path[length + (noSlash ? 1 : 0)] == '\0') {
96			// we found the entry in the list, let's remove it
97			include_dirs.erase(i);
98			free(path);
99			return B_OK;
100		}
101	}
102
103	return B_ENTRY_NOT_FOUND;
104}
105
106
107void
108rdef_free_include_dirs()
109{
110	free_ptr_list(include_dirs);
111}
112
113
114status_t
115rdef_add_input_file(const char *file)
116{
117	clear_error();
118
119	char *temp = strdup(file);
120	if (temp == NULL) {
121		rdef_err = B_NO_MEMORY;
122		return B_NO_MEMORY;
123	}
124
125	input_files.push_back(temp);
126	return B_OK;
127}
128
129
130void
131rdef_free_input_files()
132{
133	free_ptr_list(input_files);
134}
135
136
137void
138rdef_set_flags(uint32 flags_)
139{
140	flags = flags_;
141}
142
143
144void
145rdef_clear_flags()
146{
147	flags = 0;
148}
149
150
151void
152clear_error()
153{
154	rdef_err = B_OK;
155	rdef_err_line = 0;
156	rdef_err_file[0] = '\0';
157	rdef_err_msg[0] = '\0';
158}
159
160
161bool
162open_file_from_include_dir(const char *filename, char *outname)
163{
164	for (ptr_iter_t i = include_dirs.begin(); i != include_dirs.end(); ++i) {
165		char tmpname[B_PATH_NAME_LENGTH];
166		strcpy(tmpname, (char *)*i);
167		strcat(tmpname, filename);
168
169		if (access(tmpname, R_OK) == 0) {
170			strcpy(outname, tmpname);
171			return true;
172		}
173	}
174
175	return false;
176}
177
178