Fixed to work with ABIv1.
[AROS.git] / tools / genmodule / writefd.c
blob68b9bd23d23db8449a4abaac8dae54a8fcf2695e
1 /*
2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 Write the functionlist to an FD file for identify.library.
6 */
8 #include "genmodule.h"
10 static void write_fd_func(FILE *out, struct functionhead *funclistit, unsigned int lvo)
12 struct functionarg *arglistit;
13 char *variable;
15 if (funclistit->lvo > lvo + 1)
17 if (funclistit->lvo == lvo + 2)
18 fprintf(out, "private()()\n");
19 else
20 fprintf(out, "##bias %u\n", funclistit->lvo * 6);
23 fprintf(out, "%s(", funclistit->name);
25 for (arglistit = funclistit->arguments;
26 arglistit!=NULL;
27 arglistit = arglistit->next)
29 /* Print a , separator when not the first function argument */
30 if (arglistit != funclistit->arguments)
31 fprintf(out, ",");
33 /* Print only variable name */
34 variable = arglistit->arg + strlen(arglistit->arg) - 1;
35 while ((variable >= arglistit->arg) &&
36 (isalnum(*variable) || (*variable == '_')))
38 variable--;
40 fprintf(out, "%s", variable + 1);
42 fprintf(out, ")(");
45 void writefd(struct config *cfg)
47 FILE *out;
48 char line[256];
49 struct functionhead *funclistit = cfg->funclist;
50 struct functionarg *arglistit;
51 unsigned int lvo;
52 char *lower;
54 if (cfg->modtype == DEVICE)
56 /* Skip BeginIO/EndIO */
57 unsigned int i;
59 for (i = 0; i < 2; i++)
61 if (!funclistit)
62 break;
64 funclistit = funclistit->next;
68 snprintf(line, 255, "%s/%s_lib.fd", cfg->gendir, cfg->includename);
70 out = fopen(line, "w");
72 if (out == NULL)
74 perror(line);
75 exit(20);
77 else
79 fprintf(out, "##base _%s\n", cfg->libbase);
82 * This is correct even for devices. cfg->firstlvo holds LVO number for
83 * the first user function.
85 fprintf(out, "##bias %u\n", cfg->firstlvo * 6);
87 fprintf(out, "*\n"
88 "* Automatically generated from '%s'.\n"
89 "* Edits will be lost. This file is supposed to be a support file for identify.library.\n"
90 "*\n",
91 cfg->conffile
94 fprintf(out, "##public\n");
96 for (lvo = cfg->firstlvo - 1;
97 funclistit != NULL;
98 funclistit = funclistit->next
101 switch (funclistit->libcall)
103 case REGISTERMACRO:
104 write_fd_func(out, funclistit, lvo);
106 for (arglistit = funclistit->arguments;
107 arglistit != NULL;
108 arglistit = arglistit->next
111 /* Print a , separator when not the first function argument */
112 if (arglistit != funclistit->arguments)
113 fprintf(out, ",");
115 /* Print register name in lower case */
116 for (lower = arglistit->reg; *lower != '\0'; lower++)
118 fputc(tolower(*lower), out);
121 fprintf(out, ")\n");
123 lvo = funclistit->lvo;
124 break;
126 case STACK:
127 write_fd_func(out, funclistit, lvo);
128 fprintf(out, "sysv");
129 if (cfg->options & OPTION_DUPBASE)
130 fprintf(out, ",rbase");
131 fprintf(out, ")\n");
133 lvo = funclistit->lvo;
134 break;
138 fprintf(out, "##end\n");
140 if (ferror(out))
142 perror(line);
143 exit(20);
146 fclose(out);