8e20ccf52f
Extend the parser to record positions, in build_node, build_node_delete, and build_property. srcpos structures are added to the property and node types, and to the parameter lists of the above functions that construct these types. Nodes and properties that are created by the compiler rather than from parsing source code have NULL as the srcpos value. merge_nodes, defined in livetree.c, uses srcpos_extend to combine multiple positions, resulting in a list of positions. srcpos_extend is defined in srcpos.c. New elements are added at the end. This requires the srcpos type, define in srcpos.h, to be a list structure with a next field. This next field is initialized to NULL in srcpos.h, in the macro YYLLOC_DEFAULT invoked implicitly by the generated parser code. Another change to srcpos.c is to make srcpos_copy always do a full copy, including a copy of the file substructure. This is required because when dtc is used on the output of cpp, the successive detected file names overwrite the file name in the file structure. The next field does not need to be deep copied, because it is always NULL when srcpos_copy is called; an assert checks for this. File names are only updated in uncopied position structures. Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
91 lines
2.3 KiB
C
91 lines
2.3 KiB
C
/*
|
|
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
* USA
|
|
*/
|
|
|
|
#include "dtc.h"
|
|
|
|
#include <dirent.h>
|
|
#include <sys/stat.h>
|
|
|
|
static struct node *read_fstree(const char *dirname)
|
|
{
|
|
DIR *d;
|
|
struct dirent *de;
|
|
struct stat st;
|
|
struct node *tree;
|
|
|
|
d = opendir(dirname);
|
|
if (!d)
|
|
die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
|
|
|
|
tree = build_node(NULL, NULL, NULL);
|
|
|
|
while ((de = readdir(d)) != NULL) {
|
|
char *tmpname;
|
|
|
|
if (streq(de->d_name, ".")
|
|
|| streq(de->d_name, ".."))
|
|
continue;
|
|
|
|
tmpname = join_path(dirname, de->d_name);
|
|
|
|
if (lstat(tmpname, &st) < 0)
|
|
die("stat(%s): %s\n", tmpname, strerror(errno));
|
|
|
|
if (S_ISREG(st.st_mode)) {
|
|
struct property *prop;
|
|
FILE *pfile;
|
|
|
|
pfile = fopen(tmpname, "rb");
|
|
if (! pfile) {
|
|
fprintf(stderr,
|
|
"WARNING: Cannot open %s: %s\n",
|
|
tmpname, strerror(errno));
|
|
} else {
|
|
prop = build_property(xstrdup(de->d_name),
|
|
data_copy_file(pfile,
|
|
st.st_size),
|
|
NULL);
|
|
add_property(tree, prop);
|
|
fclose(pfile);
|
|
}
|
|
} else if (S_ISDIR(st.st_mode)) {
|
|
struct node *newchild;
|
|
|
|
newchild = read_fstree(tmpname);
|
|
newchild = name_node(newchild, xstrdup(de->d_name));
|
|
add_child(tree, newchild);
|
|
}
|
|
|
|
free(tmpname);
|
|
}
|
|
|
|
closedir(d);
|
|
return tree;
|
|
}
|
|
|
|
struct dt_info *dt_from_fs(const char *dirname)
|
|
{
|
|
struct node *tree;
|
|
|
|
tree = read_fstree(dirname);
|
|
tree = name_node(tree, "");
|
|
|
|
return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
|
|
}
|