Fixed return values that got inverted during conversion from using
[AROS.git] / tools / collect-aros / gensets.c
blobd647b76f17bc43bca8656b8569f1d861ef4b50d5
1 /*
2 Copyright © 1995-2009, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <stdio.h>
7 #include <string.h>
8 #include <stdlib.h>
9 #include <ctype.h>
10 #include <errno.h>
12 #include "misc.h"
14 typedef struct setnode
16 char *secname;
17 int off_setname;
18 long pri;
19 struct setnode *next;
20 } setnode;
22 static char* pointer_size = "LONG";
23 static char pointer_bytes = 4;
25 static setnode *new_setnode(const char *name, setnode *next, int off, long pri){
26 setnode *n;
28 if (!(n = calloc(1, sizeof(setnode))) ||
29 !(n->secname = strdup(name))
32 fatal("new_setnode()", strerror(errno));
35 n->off_setname = off;
36 n->pri = pri;
37 n->next = next;
39 return n;
42 static setnode *get_setnode(setnode **list, const char *name, int off, long pri)
44 setnode **curr = list;
46 while (*curr)
48 if (strcmp((*curr)->secname, name) == 0)
52 if ((*curr)->pri == pri)
53 return *curr;
55 if ((*curr)->pri > pri)
56 break;
58 curr = &(*curr)->next;
60 } while (*curr && strcmp((*curr)->secname, name) == 0);
62 break;
65 curr = &(*curr)->next;
68 return (*curr = new_setnode(name, *curr, off, pri));
71 void emit_sets(setnode *setlist, FILE *out)
73 char setname_big[201];
74 int i;
76 while (setlist)
78 setnode *oldnode = setlist;
79 i = 0;
83 setname_big[i] = toupper(setlist->secname[setlist->off_setname + i]);
84 } while (setlist->secname[setlist->off_setname + i++]);
86 fprintf
88 out,
89 " __%s_LIST__ = .;\n"
90 " %s((__%s_END__ - __%s_LIST__) / %d - 2)\n",
91 setname_big, pointer_size, setname_big, setname_big, pointer_bytes
96 fprintf
98 out,
99 " KEEP(*(%s.%ld))\n",
100 setlist->secname, setlist->pri
103 setlist = setlist->next;
104 } while (setlist && (strcmp(oldnode->secname, setlist->secname) == 0));
107 fprintf
109 out,
110 " KEEP(*(%s))\n"
111 " %s(0)\n"
112 " __%s_END__ = .;\n",
113 oldnode->secname, pointer_size, setname_big
119 void parse_secname(const char *secname, setnode **setlist_ptr)
121 char *idx;
122 int off;
123 long pri = 0;
125 if (strncmp(secname, ".aros.set.", 10) == 0)
126 off = 10;
127 else
128 if (strncmp(secname, ".ctors", 5) == 0)
129 off = 1;
130 else
131 if (strncmp(secname, ".dtors", 5) == 0)
132 off = 1;
133 else
134 return;
136 idx = strchr(secname + off, '.');
137 if (idx)
139 *idx = '\0';
140 pri = strtol(&idx[1], NULL, 10);
143 get_setnode(setlist_ptr, secname, off, pri);
146 void parse_format(const char *format)
148 if (strncmp(format, "elf64", 5) == 0) {
149 pointer_size = "QUAD";
150 pointer_bytes = 8;
154 void emit_libs(setnode *liblist, FILE *out)
156 while (liblist) {
157 fprintf(out, "PROVIDE(%s = .); LONG(%ld)\n", liblist->secname, liblist->pri);
158 liblist = liblist->next;