#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "rdef.h"
#include "private.h"
ptr_list_t include_dirs;
ptr_list_t input_files;
uint32 flags = 0;
status_t rdef_err;
int32 rdef_err_line;
char rdef_err_file[B_PATH_NAME_LENGTH];
char rdef_err_msg[1024];
void
free_ptr_list(ptr_list_t &list)
{
for (ptr_iter_t i = list.begin(); i != list.end(); ++i) {
free(*i);
}
list.clear();
}
int32
rdef_get_version()
{
return 2;
}
status_t
rdef_add_include_dir(const char *dir, bool toEndOfList)
{
clear_error();
char *path = (char *)malloc(strlen(dir) + 2);
if (path == NULL) {
rdef_err = B_NO_MEMORY;
return B_NO_MEMORY;
}
strcpy(path, dir);
strcat(path, "/");
if (toEndOfList)
include_dirs.push_back(path);
else
include_dirs.push_front(path);
return B_OK;
}
status_t
rdef_remove_include_dir(const char *dir)
{
size_t length = strlen(dir);
bool noSlash = false;
if (dir[length - 1] != '/')
noSlash = true;
for (ptr_iter_t i = include_dirs.begin(); i != include_dirs.end(); ++i) {
char *path = (char *)*i;
if (!strncmp(dir, path, length)
&& path[length + (noSlash ? 1 : 0)] == '\0') {
include_dirs.erase(i);
free(path);
return B_OK;
}
}
return B_ENTRY_NOT_FOUND;
}
void
rdef_free_include_dirs()
{
free_ptr_list(include_dirs);
}
status_t
rdef_add_input_file(const char *file)
{
clear_error();
char *temp = strdup(file);
if (temp == NULL) {
rdef_err = B_NO_MEMORY;
return B_NO_MEMORY;
}
input_files.push_back(temp);
return B_OK;
}
void
rdef_free_input_files()
{
free_ptr_list(input_files);
}
void
rdef_set_flags(uint32 flags_)
{
flags = flags_;
}
void
rdef_clear_flags()
{
flags = 0;
}
void
clear_error()
{
rdef_err = B_OK;
rdef_err_line = 0;
rdef_err_file[0] = '\0';
rdef_err_msg[0] = '\0';
}
bool
open_file_from_include_dir(const char *filename, char *outname)
{
for (ptr_iter_t i = include_dirs.begin(); i != include_dirs.end(); ++i) {
char tmpname[B_PATH_NAME_LENGTH];
strcpy(tmpname, (char *)*i);
strcat(tmpname, filename);
if (access(tmpname, R_OK) == 0) {
strcpy(outname, tmpname);
return true;
}
}
return false;
}