796{
797 char dt;
799
802
804 {
805 case '_':
806
808 break;
809 case 'C': case 'D': case 'E': case 'F': case 'G':
810 case 'H': case 'I': case 'J': case 'K': case 'M':
811 case 'N': case 'O': case 'X': case 'Z':
812
815 break;
816 case 'T':
817 case 'U':
818 case 'V':
819 case 'Y':
820
821 {
822 const char* struct_name =
NULL;
823 const char* type_name =
NULL;
824
826 goto done;
828 {
829 switch (dt)
830 {
831 case 'T': type_name = "union "; break;
832 case 'U': type_name = "struct "; break;
833 case 'V': type_name = "class "; break;
834 case 'Y': type_name = "cointerface "; break;
835 }
836 }
838 }
839 break;
840 case '?':
841
842 if (in_args)
843 {
847 }
848 else
849 {
851 }
852 break;
853 case 'A':
854 case 'B':
856 break;
857 case 'Q':
858 case 'R':
859 case 'S':
860 if (!
get_modified_type(ct, sym, pmt_ref, in_args ? dt :
'P', in_args))
goto done;
861 break;
862 case 'P':
864 {
865
866
867
868
870 {
872 const char* call_conv;
873 const char* exported;
875 unsigned mark = sym->
stack.num;
876 const char* class;
877 const char* modifier;
878 const char* ptr_modif;
879
881
883 goto done;
885 goto done;
886 if (modifier)
887 modifier =
str_printf(sym,
"%s %s", modifier, ptr_modif);
888 else if(ptr_modif)
891 &call_conv, &exported,
893 goto done;
895 goto done;
896
898 if (!
args)
goto done;
899 sym->
stack.num = mark;
900
902 sub_ct.left, sub_ct.right, call_conv, class);
904 }
906 {
908 const char* call_conv;
909 const char* exported;
911 unsigned mark = sym->
stack.num;
912
914
916 &call_conv, &exported,
919 goto done;
920
922 if (!
args)
goto done;
923 sym->
stack.num = mark;
924
926 sub_ct.left, sub_ct.right, call_conv);
928 }
929 else goto done;
930 }
932 break;
933 case 'W':
935 {
936 char* enum_name;
939 goto done;
941 ct->
left = enum_name;
942 else
944 }
945 else goto done;
946 break;
947 case '0': case '1': case '2': case '3': case '4':
948 case '5': case '6': case '7': case '8': case '9':
949
950
951 if (!pmt_ref) goto done;
954 if (!ct->
left)
goto done;
956 break;
957 case '$':
959 {
960 case '0':
962 break;
963 case 'D':
964 {
968 }
969 break;
970 case 'F':
971 {
972 const char* p1;
973 const char* p2;
977 }
978 break;
979 case 'G':
980 {
981 const char* p1;
982 const char* p2;
983 const char* p3;
988 }
989 break;
990 case 'Q':
991 {
995 }
996 break;
997 case '$':
999 {
1000 unsigned mark = sym->
stack.num;
1002 const char* arr =
NULL;
1004
1005
1007 {
1010
1014
1017 }
1018
1020
1021 if (arr)
1023 else
1024 ct->
left = sub_ct.left;
1025 ct->
right = sub_ct.right;
1026 sym->
stack.num = mark;
1027 }
1028 else if (*sym->
current ==
'C')
1029 {
1030 const char *
ptr, *ptr_modif;
1031
1036 }
1037 break;
1038 }
1039 break;
1040 default :
1041 ERR(
"Unknown type %c\n", dt);
1042 break;
1043 }
1044 if (add_pmt && pmt_ref && in_args)
1045 {
1046
1050 }
1051done:
1052
1054}
_ACRTIMP int __cdecl atoi(const char *)
static BOOL demangle_datatype(struct parsed_symbol *sym, struct datatype_t *ct, enum datatype_flags flags)
static const char * get_number(struct parsed_symbol *sym)
static BOOL get_calling_convention(char ch, const char **call_conv, const char **exported, unsigned flags)
static char * get_args(struct parsed_symbol *sym, BOOL z_term, char open_char, char close_char)
static char *WINAPIV str_printf(struct parsed_symbol *sym, const char *format,...)
static BOOL str_array_push(struct parsed_symbol *sym, const char *ptr, int len, struct array *a)
static const char * get_extended_type(char c)
static char * str_array_get_ref(struct array *cref, unsigned idx)
static const char * get_simple_type(char c)
static char * get_class_name(struct parsed_symbol *sym)
static BOOL get_modified_type(struct datatype_t *ct, struct parsed_symbol *sym, struct array *pmt_ref, char modif, BOOL in_args)
static BOOL get_modifier(struct parsed_symbol *sym, const char **ret, const char **ptr_modif)