1 static char RCSId
[] = "$Id: build.c,v 1.3 1993/07/04 04:04:21 root Exp root $";
2 static char Copyright
[] = "Copyright Robert J. Amstadt, 1993";
17 #if defined(__NetBSD__) || defined(__FreeBSD__)
22 #define VARTYPE_BYTE 0
23 #define VARTYPE_SIGNEDWORD 0
24 #define VARTYPE_WORD 1
25 #define VARTYPE_LONG 2
26 #define VARTYPE_FARPTR 3
28 #define FUNCTYPE_PASCAL 16
30 #define FUNCTYPE_REG 19
32 #define EQUATETYPE_ABS 18
33 #define TYPE_RETURN 20
35 #define MAX_ORDINALS 1024
37 typedef struct ordinal_definition_s
42 void *additional_data
;
45 typedef struct ordinal_variable_definition_s
51 typedef struct ordinal_function_definition_s
55 int arg_16_offsets
[16];
57 char internal_name
[80];
59 int arg_indices_32
[16];
62 typedef struct ordinal_return_definition_s
68 ORDDEF OrdinalDefinitions
[MAX_ORDINALS
];
70 char LowerDLLName
[80];
71 char UpperDLLName
[80];
76 char *ParseBuffer
= NULL
;
81 int IsNumberString(char *s
)
90 char *strlower(char *s
)
94 for(p
= s
; *p
!= '\0'; p
++)
100 char *strupper(char *s
)
104 for(p
= s
; *p
!= '\0'; p
++)
110 int stricmp(char *s1
, char *s2
)
112 if (strlen(s1
) != strlen(s2
))
128 if (ParseNext
!= ParseBuffer
)
130 if (ParseSaveChar
== '\0')
132 *ParseNext
= ParseSaveChar
;
136 * Remove initial white space.
138 for (p
= ParseNext
; isspace(*p
); p
++)
148 if (*token
!= '(' && *token
!= ')')
149 while (*p
!= '\0' && *p
!= '(' && *p
!= ')' && !isspace(*p
))
164 if (ParseBuffer
== NULL
)
166 ParseBuffer
= malloc(512);
167 ParseNext
= ParseBuffer
;
171 if (fgets(ParseBuffer
, 511, SpecFp
) == NULL
)
173 if (ParseBuffer
[0] != '#')
178 while ((token
= GetTokenInLine()) == NULL
)
180 ParseNext
= ParseBuffer
;
184 if (fgets(ParseBuffer
, 511, SpecFp
) == NULL
)
186 if (ParseBuffer
[0] != '#')
195 ParseVariable(int ordinal
, int type
)
199 char export_name
[80];
204 int value_array_size
;
206 strcpy(export_name
, GetToken());
211 fprintf(stderr
, "%d: Expected '(' got '%s'\n", Line
, token
);
216 value_array_size
= 25;
217 value_array
= malloc(sizeof(*value_array
) * value_array_size
);
219 while ((token
= GetToken()) != NULL
)
224 value_array
[n_values
++] = strtol(token
, &endptr
, 0);
225 if (n_values
== value_array_size
)
227 value_array_size
+= 25;
228 value_array
= realloc(value_array
,
229 sizeof(*value_array
) * value_array_size
);
232 if (endptr
== NULL
|| *endptr
!= '\0')
234 fprintf(stderr
, "%d: Expected number value, got '%s'\n", Line
,
242 fprintf(stderr
, "%d: End of file in variable declaration\n", Line
);
246 if (ordinal
>= MAX_ORDINALS
)
248 fprintf(stderr
, "%d: Ordinal number too large\n", Line
);
252 odp
= &OrdinalDefinitions
[ordinal
];
255 strcpy(odp
->export_name
, export_name
);
257 vdp
= malloc(sizeof(*vdp
));
258 odp
->additional_data
= vdp
;
260 vdp
->n_values
= n_values
;
261 vdp
->values
= realloc(value_array
, sizeof(*value_array
) * n_values
);
267 ParseExportFunction(int ordinal
, int type
)
279 if (ordinal
>= MAX_ORDINALS
)
281 fprintf(stderr
, "%d: Ordinal number too large\n", Line
);
285 odp
= &OrdinalDefinitions
[ordinal
];
286 strcpy(odp
->export_name
, GetToken());
289 fdp
= malloc(sizeof(*fdp
));
290 odp
->additional_data
= fdp
;
295 fprintf(stderr
, "%d: Expected '(' got '%s'\n", Line
, token
);
299 fdp
->arg_16_size
= 0;
300 for (i
= 0; i
< 16; i
++)
306 if (stricmp(token
, "byte") == 0 || stricmp(token
, "word") == 0)
308 fdp
->arg_types_16
[i
] = VARTYPE_WORD
;
309 fdp
->arg_16_size
+= 2;
310 fdp
->arg_16_offsets
[i
] = 2;
312 else if (stricmp(token
, "s_byte") == 0 ||
313 stricmp(token
, "s_word") == 0)
315 fdp
->arg_types_16
[i
] = VARTYPE_SIGNEDWORD
;
316 fdp
->arg_16_size
+= 2;
317 fdp
->arg_16_offsets
[i
] = 2;
319 else if (stricmp(token
, "long") == 0 || stricmp(token
, "s_long") == 0)
321 fdp
->arg_types_16
[i
] = VARTYPE_LONG
;
322 fdp
->arg_16_size
+= 4;
323 fdp
->arg_16_offsets
[i
] = 4;
325 else if (stricmp(token
, "ptr") == 0)
327 fdp
->arg_types_16
[i
] = VARTYPE_FARPTR
;
328 fdp
->arg_16_size
+= 4;
329 fdp
->arg_16_offsets
[i
] = 4;
333 fprintf(stderr
, "%d: Unknown variable type '%s'\n", Line
, token
);
339 if (type
== FUNCTYPE_PASCAL
|| type
== FUNCTYPE_REG
)
342 for (i
--; i
>= 0; i
--)
344 arg_size
= fdp
->arg_16_offsets
[i
];
345 fdp
->arg_16_offsets
[i
] = current_offset
;
346 current_offset
+= arg_size
;
352 for (i
= 0; i
< fdp
->n_args_16
; i
++)
354 arg_size
= fdp
->arg_16_offsets
[i
];
355 fdp
->arg_16_offsets
[i
] = current_offset
;
356 current_offset
+= arg_size
;
360 strcpy(fdp
->internal_name
, GetToken());
364 fprintf(stderr
, "%d: Expected '(' got '%s'\n", Line
, token
);
367 for (i
= 0; i
< 16; i
++)
373 fdp
->arg_indices_32
[i
] = atoi(token
);
374 if (fdp
->arg_indices_32
[i
] < 1 ||
375 fdp
->arg_indices_32
[i
] > fdp
->n_args_16
)
377 fprintf(stderr
, "%d: Bad argument index %d\n", Line
,
378 fdp
->arg_indices_32
[i
]);
388 ParseEquate(int ordinal
)
395 if (ordinal
>= MAX_ORDINALS
)
397 fprintf(stderr
, "%d: Ordinal number too large\n", Line
);
401 odp
= &OrdinalDefinitions
[ordinal
];
402 strcpy(odp
->export_name
, GetToken());
405 value
= strtol(token
, &endptr
, 0);
406 if (endptr
== NULL
|| *endptr
!= '\0')
408 fprintf(stderr
, "%d: Expected number value, got '%s'\n", Line
,
414 odp
->type
= EQUATETYPE_ABS
;
415 odp
->additional_data
= (void *) value
;
421 ParseReturn(int ordinal
)
429 if (ordinal
>= MAX_ORDINALS
)
431 fprintf(stderr
, "%d: Ordinal number too large\n", Line
);
435 rdp
= malloc(sizeof(*rdp
));
437 odp
= &OrdinalDefinitions
[ordinal
];
438 strcpy(odp
->export_name
, GetToken());
440 odp
->type
= TYPE_RETURN
;
441 odp
->additional_data
= rdp
;
444 rdp
->arg_size
= strtol(token
, &endptr
, 0);
445 if (endptr
== NULL
|| *endptr
!= '\0')
447 fprintf(stderr
, "%d: Expected number value, got '%s'\n", Line
,
453 rdp
->ret_value
= strtol(token
, &endptr
, 0);
454 if (endptr
== NULL
|| *endptr
!= '\0')
456 fprintf(stderr
, "%d: Expected number value, got '%s'\n", Line
,
465 ParseOrdinal(int ordinal
)
472 fprintf(stderr
, "%d: Expected type after ordinal\n", Line
);
476 if (stricmp(token
, "byte") == 0)
477 return ParseVariable(ordinal
, VARTYPE_BYTE
);
478 else if (stricmp(token
, "word") == 0)
479 return ParseVariable(ordinal
, VARTYPE_WORD
);
480 else if (stricmp(token
, "long") == 0)
481 return ParseVariable(ordinal
, VARTYPE_LONG
);
482 else if (stricmp(token
, "c") == 0)
483 return ParseExportFunction(ordinal
, FUNCTYPE_C
);
484 else if (stricmp(token
, "p") == 0)
485 return ParseExportFunction(ordinal
, FUNCTYPE_PASCAL
);
486 else if (stricmp(token
, "pascal") == 0)
487 return ParseExportFunction(ordinal
, FUNCTYPE_PASCAL
);
488 else if (stricmp(token
, "register") == 0)
489 return ParseExportFunction(ordinal
, FUNCTYPE_REG
);
490 else if (stricmp(token
, "equate") == 0)
491 return ParseEquate(ordinal
);
492 else if (stricmp(token
, "return") == 0)
493 return ParseReturn(ordinal
);
497 "%d: Expected type after ordinal, found '%s' instead\n",
508 while ((token
= GetToken()) != NULL
)
510 if (stricmp(token
, "name") == 0)
512 strcpy(LowerDLLName
, GetToken());
513 strlower(LowerDLLName
);
515 strcpy(UpperDLLName
, LowerDLLName
);
516 strupper(UpperDLLName
);
518 else if (stricmp(token
, "id") == 0)
521 if (!IsNumberString(token
))
523 fprintf(stderr
, "%d: Expected number after id\n", Line
);
529 else if (stricmp(token
, "length") == 0)
532 if (!IsNumberString(token
))
534 fprintf(stderr
, "%d: Expected number after length\n", Line
);
540 else if (IsNumberString(token
))
545 ordinal
= atoi(token
);
546 if ((rv
= ParseOrdinal(ordinal
)) < 0)
552 "%d: Expected name, id, length or ordinal\n", Line
);
561 OutputVariableCode(FILE *fp
, char *storage
, ORDDEF
*odp
)
566 fprintf(fp
, "_%s_Ordinal_%d:\n", UpperDLLName
, i
);
568 vdp
= odp
->additional_data
;
569 for (i
= 0; i
< vdp
->n_values
; i
++)
572 fprintf(fp
, "\t%s\t", storage
);
574 fprintf(fp
, "%d", vdp
->values
[i
]);
576 if ((i
& 7) == 7 || i
== vdp
->n_values
- 1)
584 main(int argc
, char **argv
)
597 fprintf(stderr
, "usage: build SPECNAME\n");
601 SpecFp
= fopen(argv
[1], "r");
604 fprintf(stderr
, "Could not open specification file, '%s'\n", argv
[1]);
610 /**********************************************************************
613 sprintf(filename
, "dll_%s.S", LowerDLLName
);
614 fp
= fopen(filename
, "w");
616 fprintf(fp
, "\t.globl _%s_Dispatch\n", UpperDLLName
);
617 fprintf(fp
, "_%s_Dispatch:\n", UpperDLLName
);
618 fprintf(fp
, "\tandl\t$0x0000ffff,%%esp\n");
619 fprintf(fp
, "\tandl\t$0x0000ffff,%%ebp\n");
620 fprintf(fp
, "\torl\t$0x%08x,%%eax\n", DLLId
<< 16);
621 fprintf(fp
, "\tjmp\t_CallTo32\n\n");
623 odp
= OrdinalDefinitions
;
624 for (i
= 0; i
<= Limit
; i
++, odp
++)
626 fprintf(fp
, "\t.globl _%s_Ordinal_%d\n", UpperDLLName
, i
);
630 fprintf(fp
, "_%s_Ordinal_%d:\n", UpperDLLName
, i
);
632 fprintf(fp
, "\tandl\t$0x0000ffff,%%esp\n");
633 fprintf(fp
, "\tandl\t$0x0000ffff,%%ebp\n");
635 fprintf(fp
, "\tmovl\t$%d,%%eax\n", i
);
636 fprintf(fp
, "\tpushw\t$0\n");
637 fprintf(fp
, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName
);
641 fdp
= odp
->additional_data
;
642 rdp
= odp
->additional_data
;
647 fprintf(fp
, "_%s_Ordinal_%d = %d\n\n",
648 UpperDLLName
, i
, (int) odp
->additional_data
);
652 OutputVariableCode(fp
, ".byte", odp
);
656 OutputVariableCode(fp
, ".word", odp
);
660 OutputVariableCode(fp
, ".long", odp
);
664 fprintf(fp
, "_%s_Ordinal_%d:\n", UpperDLLName
, i
);
665 fprintf(fp
, "\tmovw\t$%d,%%ax\n", rdp
->ret_value
& 0xffff);
666 fprintf(fp
, "\tmovw\t$%d,%%dx\n",
667 (rdp
->ret_value
>> 16) & 0xffff);
668 fprintf(fp
, "\t.byte\t0x66\n");
669 if (rdp
->arg_size
!= 0)
670 fprintf(fp
, "\tlret\t$%d\n", rdp
->arg_size
);
672 fprintf(fp
, "\tlret\n");
676 fprintf(fp
, "_%s_Ordinal_%d:\n", UpperDLLName
, i
);
677 fprintf(fp
, "\tandl\t$0x0000ffff,%%esp\n");
678 fprintf(fp
, "\tandl\t$0x0000ffff,%%ebp\n");
679 fprintf(fp
, "\tpushl\t$0\n"); /* cr2 */
680 fprintf(fp
, "\tpushl\t$0\n"); /* oldmask */
681 fprintf(fp
, "\tpushl\t$0\n"); /* i387 */
682 fprintf(fp
, "\tpushw\t$0\n"); /* __ssh */
683 fprintf(fp
, "\tpushw\t%%ss\n"); /* ss */
684 fprintf(fp
, "\tpushl\t%%esp\n"); /* esp */
685 fprintf(fp
, "\tpushfl\n"); /* eflags */
686 fprintf(fp
, "\tpushw\t$0\n"); /* __csh */
687 fprintf(fp
, "\tpushw\t%%cs\n"); /* cs */
688 fprintf(fp
, "\tpushl\t$0\n"); /* eip */
689 fprintf(fp
, "\tpushl\t$0\n"); /* err */
690 fprintf(fp
, "\tpushl\t$0\n"); /* trapno */
691 fprintf(fp
, "\tpushal\n"); /* AX, ... */
692 fprintf(fp
, "\tpushw\t$0\n"); /* __dsh */
693 fprintf(fp
, "\tpushw\t%%ds\n"); /* ds */
694 fprintf(fp
, "\tpushw\t$0\n"); /* __esh */
695 fprintf(fp
, "\tpushw\t%%es\n"); /* es */
696 fprintf(fp
, "\tpushw\t$0\n"); /* __fsh */
697 fprintf(fp
, "\tpushw\t%%fs\n"); /* fs */
698 fprintf(fp
, "\tpushw\t$0\n"); /* __gsh */
699 fprintf(fp
, "\tpushw\t%%gs\n"); /* gs */
700 fprintf(fp
, "\tmovl\t%%ebp,%%eax\n");
701 fprintf(fp
, "\tmovw\t%%esp,%%ebp\n");
702 fprintf(fp
, "\tpushl\t88(%%ebp)\n");
703 fprintf(fp
, "\tmovl\t%%eax,%%ebp\n");
704 fprintf(fp
, "\tmovl\t$%d,%%eax\n", i
);
705 fprintf(fp
, "\tpushw\t$92\n");
706 fprintf(fp
, "\tjmp\t_%s_Relay_%d:\n", UpperDLLName
, i
);
709 case FUNCTYPE_PASCAL
:
710 fprintf(fp
, "_%s_Ordinal_%d:\n", UpperDLLName
, i
);
712 fprintf(fp
, "\tandl\t$0x0000ffff,%%esp\n");
713 fprintf(fp
, "\tandl\t$0x0000ffff,%%ebp\n");
715 fprintf(fp
, "\tmovl\t$%d,%%eax\n", i
);
716 fprintf(fp
, "\tpushw\t$%d\n", fdp
->arg_16_size
);
717 fprintf(fp
, "\tjmp\t_%s_Relay_%d:\n", UpperDLLName
, i
);
722 fprintf(fp
, "_%s_Ordinal_%d:\n", UpperDLLName
, i
);
724 fprintf(fp
, "\tandl\t$0x0000ffff,%%esp\n");
725 fprintf(fp
, "\tandl\t$0x0000ffff,%%ebp\n");
727 fprintf(fp
, "\tmovl\t$%d,%%eax\n", i
);
728 fprintf(fp
, "\tpushw\t$0\n");
729 fprintf(fp
, "\tjmp\t_%s_Relay_%d:\n", UpperDLLName
, i
);
737 /**********************************************************************
740 sprintf(filename
, "rly_%s.S", LowerDLLName
);
741 fp
= fopen(filename
, "w");
743 odp
= OrdinalDefinitions
;
744 for (i
= 0; i
<= Limit
; i
++, odp
++)
749 fdp
= odp
->additional_data
;
751 fprintf(fp
, "\t.globl _%s_Relay_%d\n", UpperDLLName
, i
);
752 fprintf(fp
, "_%s_Relay_%d:\n", UpperDLLName
, i
);
753 fprintf(fp
, "\tandl\t$0x0000ffff,%%esp\n");
754 fprintf(fp
, "\tandl\t$0x0000ffff,%%ebp\n");
756 fprintf(fp
, "\tpushl\t%%ebp\n");
757 fprintf(fp
, "\tmovl\t%%esp,%%ebp\n");
760 * Save registers. 286 mode does not have fs or gs.
762 fprintf(fp
, "\tpushw\t%%ds\n");
763 fprintf(fp
, "\tpushw\t%%es\n");
766 * Restore segment registers.
768 fprintf(fp
, "\tmovw\t%d,%%ax\n", UDATASEL
);
769 fprintf(fp
, "\tmovw\t%%ax,%%ds\n");
770 fprintf(fp
, "\tmovw\t%%ax,%%es\n");
773 * Save old stack save variables, save stack registers, reload
776 fprintf(fp
, "\tpushl\t_IF1632_Saved16_esp\n");
777 fprintf(fp
, "\tpushl\t_IF1632_Saved16_ebp\n");
778 fprintf(fp
, "\tpushw\t_IF1632_Saved16_ss\n");
780 fprintf(fp
, "\tmovw\t%%ss,_IF1632_Saved16_ss\n");
781 fprintf(fp
, "\tmovl\t%%esp,_IF1632_Saved16_esp\n");
782 fprintf(fp
, "\tmovl\t%%ebp,_IF1632_Saved16_ebp\n");
784 fprintf(fp
, "\tmovw\t%%ss,%%ax\n");
785 fprintf(fp
, "\tshll\t16,%%eax\n");
786 fprintf(fp
, "\torl\t%%esp,%%eax\n");
788 fprintf(fp
, "\tmovw\t_IF1632_Saved32_ss,%%ss\n");
789 fprintf(fp
, "\tmovl\t_IF1632_Saved32_esp,%%esp\n");
790 fprintf(fp
, "\tmovl\t_IF1632_Saved32_ebp,%%ebp\n");
792 fprintf(fp
, "\tpushl\t_Stack16Frame\n");
793 fprintf(fp
, "\tmovl\t%%eax,_Stack16Frame\n");
803 fprintf(fp
, "\tcall\t%s\n", fdp
->internal_name
);
806 * Restore registers, but do not destroy return value.
808 fprintf(fp
, "\tmovw\t_IF1632_Saved16_ss,%%ss\n");
809 fprintf(fp
, "\tmovl\t_IF1632_Saved16_esp,%%esp\n");
810 fprintf(fp
, "\tmovl\t_IF1632_Saved16_ebp,%%ebp\n");
812 fprintf(fp
, "\tpopw\t_IF1632_Saved16_ss\n");
813 fprintf(fp
, "\tpopl\t_IF1632_Saved16_ebp\n");
814 fprintf(fp
, "\tpopl\t_IF1632_Saved16_esp\n");
816 fprintf(fp
, "\tpopw\t%%es\n");
817 fprintf(fp
, "\tpopw\t%%ds\n");
819 fprintf(fp
, "\t.align\t2,0x90\n");
820 fprintf(fp
, "\tleave\n");
823 * Now we need to ditch the parameter bytes that were left on the
824 * stack. We do this by effectively popping the number of bytes,
825 * and the return address, removing the parameters and then putting
826 * the return address back on the stack.
827 * Normally this field is filled in by the relevant function in
828 * the emulation library, since it should know how many bytes to
831 fprintf(fp
, "\tpopw\t%%gs:nbytes\n");
832 fprintf(fp
, "\tcmpw\t$0,%%gs:nbytes\n");
833 fprintf(fp
, "\tje\tnoargs\n");
834 fprintf(fp
, "\tpopw\t%%gs:offset\n");
835 fprintf(fp
, "\tpopw\t%%gs:selector\n");
836 fprintf(fp
, "\taddw\t%%gs:nbytes,%%esp\n");
837 fprintf(fp
, "\tpushw\t%%gs:selector\n");
838 fprintf(fp
, "\tpushw\t%%gs:offset\n");
839 fprintf(fp
, "noargs:\n");
842 * Last, but not least we need to move the high word from eax to dx
844 fprintf(fp
, "\t pushl\t%%eax\n");
845 fprintf(fp
, "\tpopw\t%%dx\n");
846 fprintf(fp
, "\tpopw\t%%dx\n");
848 fprintf(fp
, "\t.byte\t0x66\n");
849 fprintf(fp
, "\tlret\n");
855 /**********************************************************************
859 sprintf(filename
, "dll_%s_tab.c", LowerDLLName
);
861 sprintf(filename
, "dtb_%s.c", LowerDLLName
);
863 fp
= fopen(filename
, "w");
865 fprintf(fp
, "#include <stdio.h>\n");
866 fprintf(fp
, "#include <stdlib.h>\n");
867 fprintf(fp
, "#include \042dlls.h\042\n\n");
869 for (i
= 0; i
<= Limit
; i
++)
871 fprintf(fp
, "extern void %s_Ordinal_%d();\n", UpperDLLName
, i
);
874 odp
= OrdinalDefinitions
;
875 for (i
= 0; i
<= Limit
; i
++, odp
++)
878 (odp
->type
== FUNCTYPE_PASCAL
|| odp
->type
== FUNCTYPE_C
||
879 odp
->type
== FUNCTYPE_REG
))
881 fdp
= odp
->additional_data
;
882 fprintf(fp
, "extern int %s();\n", fdp
->internal_name
);
886 fprintf(fp
, "\nstruct dll_table_entry_s %s_table[%d] =\n",
887 UpperDLLName
, Limit
+ 1);
889 odp
= OrdinalDefinitions
;
890 for (i
= 0; i
<= Limit
; i
++, odp
++)
892 fdp
= odp
->additional_data
;
899 case FUNCTYPE_PASCAL
:
901 fprintf(fp
, " { 0x%x, %s_Ordinal_%d, ", UTEXTSEL
, UpperDLLName
, i
);
902 fprintf(fp
, "\042%s\042, ", odp
->export_name
);
903 fprintf(fp
, "%s, DLL_HANDLERTYPE_PASCAL, ", fdp
->internal_name
);
907 fprintf(fp
, "%d, ", fdp
->n_args_32
);
908 if (fdp
->n_args_32
> 0)
912 fprintf(fp
, "\n {\n");
913 for (argnum
= 0; argnum
< fdp
->n_args_32
; argnum
++)
915 fprintf(fp
, " { %d, %d },\n",
916 fdp
->arg_16_offsets
[fdp
->arg_indices_32
[argnum
]-1],
917 fdp
->arg_types_16
[argnum
]);
919 fprintf(fp
, " }\n ");
921 fprintf(fp
, "}, \n");
925 fprintf(fp
, " { 0x%x, %s_Ordinal_%d, ", UTEXTSEL
, UpperDLLName
, i
);
926 fprintf(fp
, "\042%s\042, ", odp
->export_name
);
927 fprintf(fp
, "%s, DLL_HANDLERTYPE_C, ", fdp
->internal_name
);
931 fprintf(fp
, "%d, ", fdp
->n_args_32
);
932 if (fdp
->n_args_32
> 0)
936 fprintf(fp
, "\n {\n");
937 for (argnum
= 0; argnum
< fdp
->n_args_32
; argnum
++)
939 fprintf(fp
, " { %d, %d },\n",
940 fdp
->arg_16_offsets
[fdp
->arg_indices_32
[argnum
]-1],
941 fdp
->arg_types_16
[argnum
]);
943 fprintf(fp
, " }\n ");
945 fprintf(fp
, "}, \n");
949 fprintf(fp
, " { 0x%x, %s_Ordinal_%d, \042\042, NULL },\n",
950 UTEXTSEL
, UpperDLLName
, i
);