Use dos.library/CreateNewProc() instead of alib/CreateNewProcTags()
[tangerine.git] / compiler / c_lib / source / lib_source / genpdefines.awk
blob4e15b8a9f4a3accc691f9c8fa0704843c1736743
1 BEGIN {
2 stderr="/dev/stderr";
4 if (file == "")
6 file = "libdefs.h";
8 while ((getline < file) > 0)
10 if ($2 == "BASENAME")
12 lib = $3;
13 basename = $3;
15 else if ($2 == "LIBBASE")
17 libbase = $3;
19 else if ($2 == "LIBBASETYPEPTR")
21 libbtp = $3;
22 for (t=4; t<=NF; t++)
23 libbtp=libbtp" "$t;
25 else if($2 == "NT_TYPE")
27 if( $3 == "NT_RESOURCE" )
29 firstlvo = 0;
30 libext = ".resource";
32 else if ( $3 == "NT_DEVICE" )
34 firstlvo = 6;
35 libext = ".device";
37 else
39 firstlvo = 4;
40 libext = ".library";
45 verbose_pattern = libbase"[ \\t]*,[ \\t]*[0-9]+[ \\t]*,[ \\t]*"basename;
47 close (file);
49 BASENAME=toupper(basename);
51 print "#ifndef DEFINES_"BASENAME"_PRIVATE_PROTOS_H"
52 print "#define DEFINES_"BASENAME"_PRIVATE_PROTOS_H"
53 print ""
54 print "/*"
55 print " Copyright © 1995-2003, The AROS Development Team. All rights reserved."
56 print " *** Automatically generated by gendefines.awk. Do not edit ***"
57 print ""
58 print " Desc: Prototypes for "basename libext
59 print " Lang: english"
60 print "*/"
61 print ""
62 print "#ifndef AROS_LIBCALL_H"
63 print "# include <aros/libcall.h>"
64 print "#endif"
65 print "#ifndef EXEC_TYPES_H"
66 print "# include <exec/types.h>"
67 print "#endif"
68 print ""
70 /AROS_LH[0-9]/ { isprivate=0; }
71 /AROS_PLH[0-9]/ { isprivate=1; }
72 /AROS_((LHA)|(LHQUAD)|(PLH[0-9]))/ {
73 line=$0;
74 isarg=match($0,/AROS_LHA/);
76 gsub(/^[ \t]+/,"",line);
78 if (!isarg)
80 args="";
81 narg=0;
82 ntagarg=0
84 match(line,/\(.+,.+[^,]/);
85 line=substr(line,RSTART+1,RLENGTH-1);
86 gsub(/[ \t]*,[ \t]*/,",",line);
87 split(line, a, ",");
89 tname = a[1]
90 fname = a[2]
92 else
94 arg[narg] = line;
96 if (match(line, /\/\*[ \t]*tagcall.+\*\//))
98 tagcall=substr(line,RSTART+2,RLENGTH-4)
100 valid_tagcall = 0
102 to_add = ""
103 if(match(tagcall, /\+[A-Za-z0-9]+/))
105 to_add = substr(tagcall,RSTART+1,RLENGTH-1)
107 valid_tagcall = 1
110 to_sub = 0
111 if(match(tagcall, /\-[0-9]+/))
113 to_sub = substr(tagcall,RSTART+1,RLENGTH-1)
115 valid_tagcall = 1
118 if (!valid_tagcall)
120 print "Invalid tagcall statement for function \"" fname "\", argument n. " narg > "/dev/stderr"
121 exit 1
124 tagarg[ntagarg, 1] = narg
125 tagarg[ntagarg, 2] = to_sub
126 tagarg[ntagarg, 3] = to_add
128 ntagarg++
131 match(line,/\(.+\)/);
132 line=substr(line,RSTART+1,RLENGTH-2);
133 gsub(/[ \t]*,[ \t]*/,",",line);
135 split(line, arg_args, ",");
137 arg[narg, 1] = arg_args[1]
138 arg[narg, 2] = arg_args[2]
139 arg[narg, 3] = arg_args[3]
141 narg++
144 /LIBBASE[ \t]*,[ \t]*[0-9]+/ || $0 ~ verbose_pattern {
145 line=$0;
147 match(line,/[a-zA-Z_0-9]+.*[^)]/);
148 line = substr(line ,RSTART,RLENGTH);
149 gsub(/[ \t]*,[ \t]*/,",",line);
150 split(line,a,",");
152 libbtp = a[1]
153 libbase = a[2]
154 lvo = a[3]
155 basename = a[4]
157 if (lvo > firstlvo && isprivate)
159 printf "#define __%s_WB(__%s", fname, libbase
160 for (t=0; t<narg; t++)
162 printf ", __%s", arg[t, 2]
164 print ")\\"
166 printf " AROS_LC%d(%s, %s, \\\n", narg, tname, fname
167 for (t=0; t<narg; t++)
169 printf " AROS_LCA(%s, (__%s), %s), \\\n", arg[t, 1], arg[t, 2], arg[t, 3]
171 printf " %s, (__%s), %d, %s)\n\n", libbtp, libbase, lvo, basename
173 printf "#define %s(", fname
174 for (t=0; t<narg; t++)
176 printf "%s", arg[t, 2]
177 if (t != narg-1) printf ", "
179 print ")\\"
181 printf " __%s_WB(%s", fname, libbase
182 for (t=0; t<narg; t++)
184 printf ", (%s)", arg[t, 2]
186 print ")\n"
188 if (ntagarg == 0)
190 #emit variadic macros for tag-based functions
192 if (fname ~ /A$/)
194 tagarg[0, 1] = narg-1
195 tagarg[0, 2] = 1
196 tagarg[0, 3] = ""
197 ntagarg++
199 else
200 if (fname ~ /TagList$/)
202 tagarg[0, 1] = narg-1
203 tagarg[0, 2] = 7
204 tagarg[0, 3] = "Tags"
205 ntagarg++
207 else
208 if (fname ~ /Args$/ && (tolower(arg[narg-1, 2]) == "args") || (tolower(arg[narg-1, 2]) == "arglist"))
210 tagarg[0, 1] = narg-1
211 tagarg[0, 2] = 4
212 tagarg[0, 3] = ""
213 ntagarg++
215 else
216 if (arg[narg-1, 1] ~ /struct[ \t]+TagItem[ \t]*[*]/)
218 tagarg[0, 1] = narg-1
219 tagarg[0, 2] = 0
220 tagarg[0, 3] = "Tags"
221 ntagarg++
225 if (ntagarg > 0)
227 print "#if !defined(NO_INLINE_STDARG) && !defined(" BASENAME "_NO_INLINE_STDARG)"
229 for (i = 0; i < ntagarg; i++)
231 printf "#define %s(", substr(fname, 0, length(fname) - tagarg[i, 2]) tagarg[i, 3];
232 for (t=0; t<narg; t++)
234 if (tagarg[i, 1] == t) continue
236 printf "%s, ", arg[t, 2]
238 print "args...) \\"
240 print "({ \\"
241 print " IPTR __args[] = { args }; \\"
243 printf " %s(", fname
244 for (t=0; t<narg; t++)
246 if (tagarg[i, 1] == t)
247 printf "(%s)__args", arg[tagarg[i, 1], 1]
248 else
249 printf "(%s)", arg[t, 2]
251 if (t != narg-1)
252 printf ", "
254 print "); \\\n})"
256 if (ntagarg > 0)
258 print "#endif /* !NO_INLINE_STDARG */\n"
261 narg=0;
263 END {
264 print "#endif /* DEFINES_"BASENAME"_PRIVATE_PROTOS_H */"