Support remaining basic types (float, double, small, wchar_t and handle_t).

svn path=/trunk/; revision=13733
This commit is contained in:
Eric Kohl 2005-02-24 16:48:16 +00:00
parent b0588e3ebf
commit a6d6b56960
10 changed files with 971 additions and 855 deletions

View file

@ -21,7 +21,7 @@
#define RPC_FC_DOUBLE 0x0c #define RPC_FC_DOUBLE 0x0c
#define RPC_FC_ENUM16 0x0d #define RPC_FC_ENUM16 0x0d
#define RPC_FC_ENUM32 0x0e #define RPC_FC_ENUM32 0x0e
#define RPC_FC_IGNORE 0x0f /* handle_t */
#define RPC_FC_ERROR_STATUS_T 0x10 #define RPC_FC_ERROR_STATUS_T 0x10
/* other stuff */ /* other stuff */

View file

@ -0,0 +1,11 @@
ChangeLog
2005-02-24 ekohl
include/wine/rpcfc.h
tools/widl/client.c
tools/widl/header.c
tools/widl/parser.l
tools/widl/parser.y
tools/widl/server.c
Support remaining basic types (float, double, small, wchar_t and handle_t).

View file

@ -82,38 +82,49 @@ static void write_procformatstring(type_t *iface)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_BYTE */\n", var->type->type); print_client("0x%02x, /* FC_BYTE */\n", RPC_FC_BYTE);
break; break;
case RPC_FC_CHAR: case RPC_FC_CHAR:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_CHAR */\n", var->type->type); print_client("0x%02x, /* FC_CHAR */\n", RPC_FC_CHAR);
break; break;
case RPC_FC_WCHAR: case RPC_FC_WCHAR:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_WCHAR */\n", var->type->type); print_client("0x%02x, /* FC_WCHAR */\n", RPC_FC_WCHAR);
break; break;
case RPC_FC_USHORT: case RPC_FC_USHORT:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_USHORT */\n", var->type->type);
break;
case RPC_FC_SHORT: case RPC_FC_SHORT:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_SHORT */\n", var->type->type); print_client("0x%02x, /* FC_USHORT */\n", RPC_FC_SHORT);
break; break;
case RPC_FC_ULONG: case RPC_FC_ULONG:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_ULONG */\n", var->type->type);
break;
case RPC_FC_LONG: case RPC_FC_LONG:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_LONG */\n", var->type->type); print_client("0x%02x, /* FC_LONG */\n", RPC_FC_LONG);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_HYPER */\n", var->type->type); print_client("0x%02x, /* FC_HYPER */\n", RPC_FC_HYPER);
break;
case RPC_FC_IGNORE:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_IGNORE */\n", RPC_FC_IGNORE);
break;
case RPC_FC_SMALL:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_SMALL */\n", RPC_FC_SMALL);
break;
case RPC_FC_FLOAT:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_FLOAT */\n", RPC_FC_FLOAT);
break;
case RPC_FC_DOUBLE:
print_client("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_DOUBLE */\n", RPC_FC_DOUBLE);
break; break;
default: default:
error("Unknown/unsupported type\n"); error("Unknown/unsupported type\n");
return;
} }
var = PREV_LINK(var); var = PREV_LINK(var);
@ -133,38 +144,51 @@ static void write_procformatstring(type_t *iface)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_BYTE */\n", var->type->type); print_client("0x%02x, /* FC_BYTE */\n", var->type->type);
break; break;
case RPC_FC_CHAR: case RPC_FC_CHAR:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_CHAR */\n", var->type->type); print_client("0x%02x, /* FC_CHAR */\n", var->type->type);
break; break;
case RPC_FC_WCHAR: case RPC_FC_WCHAR:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_WCHAR */\n", var->type->type); print_client("0x%02x, /* FC_WCHAR */\n", var->type->type);
break; break;
case RPC_FC_USHORT: case RPC_FC_USHORT:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_USHORT */\n", var->type->type); print_client("0x%02x, /* FC_USHORT */\n", var->type->type);
break; break;
case RPC_FC_SHORT: case RPC_FC_SHORT:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_SHORT */\n", var->type->type); print_client("0x%02x, /* FC_SHORT */\n", var->type->type);
break; break;
case RPC_FC_ULONG: case RPC_FC_ULONG:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_ULONG */\n", var->type->type); print_client("0x%02x, /* FC_ULONG */\n", var->type->type);
break; break;
case RPC_FC_LONG: case RPC_FC_LONG:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_LONG */\n", var->type->type); print_client("0x%02x, /* FC_LONG */\n", var->type->type);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* RPC_FC_HYPER */\n", var->type->type); print_client("0x%02x, /* FC_HYPER */\n", var->type->type);
break;
case RPC_FC_SMALL:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_SMALL */\n", RPC_FC_SMALL);
break;
case RPC_FC_FLOAT:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_FLOAT */\n", RPC_FC_FLOAT);
break;
case RPC_FC_DOUBLE:
print_client("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_client("0x%02x, /* FC_DOUBLE */\n", RPC_FC_DOUBLE);
break; break;
default: default:
error("Unknown/unsupported type\n"); error("Unknown/unsupported type\n");
return;
} }
} }
@ -220,6 +244,7 @@ static void print_message_buffer_size(func_t *func)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
case RPC_FC_CHAR: case RPC_FC_CHAR:
case RPC_FC_SMALL:
size = 1; size = 1;
alignment = 0; alignment = 0;
break; break;
@ -234,26 +259,42 @@ static void print_message_buffer_size(func_t *func)
case RPC_FC_ULONG: case RPC_FC_ULONG:
case RPC_FC_LONG: case RPC_FC_LONG:
case RPC_FC_FLOAT:
size = 4; size = 4;
if (last_size != 0 && last_size < 4) if (last_size != 0 && last_size < 4)
alignment += (4 - last_size); alignment += (4 - last_size);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
size = 8; size = 8;
if (last_size != 0 && last_size < 4) if (last_size != 0 && last_size < 4)
alignment += (4 - last_size); alignment += (4 - last_size);
break; break;
case RPC_FC_IGNORE:
size = 0;
break;
default: default:
error("Unknown/unsupported type!"); error("Unknown/unsupported type!");
} }
if (last_size != 0) if (size == 0)
fprintf(client, " +"); {
fprintf(client, " %uU", size + alignment); if (last_size != 0)
fprintf(client, " +");
fprintf(client, " 0U");
}
else
{
if (last_size != 0)
fprintf(client, " +");
fprintf(client, " %uU", size + alignment);
last_size = size;
}
last_size = size;
var = PREV_LINK(var); var = PREV_LINK(var);
} }
@ -279,6 +320,7 @@ static void marshall_arguments(func_t *func)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
case RPC_FC_CHAR: case RPC_FC_CHAR:
case RPC_FC_SMALL:
size = 1; size = 1;
alignment = 0; alignment = 0;
break; break;
@ -293,32 +335,41 @@ static void marshall_arguments(func_t *func)
case RPC_FC_ULONG: case RPC_FC_ULONG:
case RPC_FC_LONG: case RPC_FC_LONG:
case RPC_FC_FLOAT:
size = 4; size = 4;
if (last_size != 0 && last_size < 4) if (last_size != 0 && last_size < 4)
alignment = (4 - last_size); alignment = (4 - last_size);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
size = 8; size = 8;
if (last_size != 0 && last_size < 4) if (last_size != 0 && last_size < 4)
alignment = (4 - last_size); alignment = (4 - last_size);
break; break;
case RPC_FC_IGNORE:
size = 0;
break;
default: default:
error("Unknown/unsupported type!"); error("Unknown/unsupported type!");
} }
if (alignment != 0) if (size != 0)
print_client("_StubMsg.Buffer += %u;\n", alignment); {
if (alignment != 0)
print_client("_StubMsg.Buffer += %u;\n", alignment);
print_client("*(("); print_client("*((");
write_type(client, var->type, var, var->tname); write_type(client, var->type, var, var->tname);
fprintf(client, " __RPC_FAR*)_StubMsg.Buffer)++ = "); fprintf(client, " __RPC_FAR*)_StubMsg.Buffer)++ = ");
write_name(client, var); write_name(client, var);
fprintf(client, ";\n"); fprintf(client, ";\n");
fprintf(client, "\n"); fprintf(client, "\n");
last_size = size; last_size = size;
}
var = PREV_LINK(var); var = PREV_LINK(var);
} }
@ -328,6 +379,7 @@ static void marshall_arguments(func_t *func)
static void write_function_stubs(type_t *iface) static void write_function_stubs(type_t *iface)
{ {
char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE); char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
int explitit_handle = is_attr(iface->attrs, ATTR_IMPLICIT_HANDLE);
func_t *func = iface->funcs; func_t *func = iface->funcs;
var_t* var; var_t* var;
int method_count = 0; int method_count = 0;
@ -343,10 +395,7 @@ static void write_function_stubs(type_t *iface)
write_name(client, def); write_name(client, def);
fprintf(client, "(\n"); fprintf(client, "(\n");
indent++; indent++;
if (func->args) write_args(client, func->args, iface->name, 0, TRUE);
write_args(client, func->args, iface->name, 0, TRUE);
else
print_client("void");
fprintf(client, ")\n"); fprintf(client, ")\n");
indent--; indent--;

View file

@ -245,7 +245,7 @@ void write_type(FILE *h, type_t *t, var_t *v, char *n)
if (t->ref) fprintf(h, t->ref->name); if (t->ref) fprintf(h, t->ref->name);
else fprintf(h, "error_status_t"); else fprintf(h, "error_status_t");
break; break;
case RPC_FC_BIND_PRIMITIVE: case RPC_FC_IGNORE:
if (t->ref) fprintf(h, t->ref->name); if (t->ref) fprintf(h, t->ref->name);
else fprintf(h, "handle_t"); else fprintf(h, "handle_t");
break; break;
@ -511,6 +511,10 @@ void write_args(FILE *h, var_t *arg, char *name, int method, int do_indent)
fprintf(h, "%s* This", name); fprintf(h, "%s* This", name);
count++; count++;
} }
if (arg == NULL && method == 0) {
fprintf(h, "void");
return;
}
while (arg) { while (arg) {
if (count) { if (count) {
if (do_indent) if (do_indent)
@ -668,10 +672,7 @@ static void write_function_proto(type_t *iface)
fprintf(header, " "); fprintf(header, " ");
write_name(header, def); write_name(header, def);
fprintf(header, "(\n"); fprintf(header, "(\n");
if (cur->args) write_args(header, cur->args, iface->name, 0, TRUE);
write_args(header, cur->args, iface->name, 0, TRUE);
else
fprintf(header, " void");
fprintf(header, ");\n"); fprintf(header, ");\n");
cur = PREV_LINK(cur); cur = PREV_LINK(cur);

View file

@ -4568,6 +4568,7 @@ static struct keyword {
{"size_is", tSIZEIS}, {"size_is", tSIZEIS},
{"sizeof", tSIZEOF}, {"sizeof", tSIZEOF},
/* ... */ /* ... */
{"small", tSMALL},
{"source", tSOURCE}, {"source", tSOURCE},
/* ... */ /* ... */
{"string", tSTRING}, {"string", tSTRING},

View file

@ -288,6 +288,7 @@ static struct keyword {
{"size_is", tSIZEIS}, {"size_is", tSIZEIS},
{"sizeof", tSIZEOF}, {"sizeof", tSIZEOF},
/* ... */ /* ... */
{"small", tSMALL},
{"source", tSOURCE}, {"source", tSOURCE},
/* ... */ /* ... */
{"string", tSTRING}, {"string", tSTRING},

View file

@ -172,6 +172,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
%token tSHORT %token tSHORT
%token tSIGNED %token tSIGNED
%token tSIZEIS tSIZEOF %token tSIZEIS tSIZEOF
%token tSMALL
%token tSOURCE %token tSOURCE
%token tSTDCALL %token tSTDCALL
%token tSTRING tSTRUCT %token tSTRING tSTRUCT
@ -553,7 +554,7 @@ base_type: tBYTE { $$ = make_type(RPC_FC_BYTE, NULL); }
| tSIGNED int_std { $$ = $2; $$->sign = 1; } | tSIGNED int_std { $$ = $2; $$->sign = 1; }
| tUNSIGNED int_std { $$ = $2; $$->sign = -1; | tUNSIGNED int_std { $$ = $2; $$->sign = -1;
switch ($$->type) { switch ($$->type) {
case RPC_FC_CHAR: $$->type = RPC_FC_BYTE; $$->sign = 0; break; case RPC_FC_CHAR: break;
case RPC_FC_SMALL: $$->type = RPC_FC_USMALL; break; case RPC_FC_SMALL: $$->type = RPC_FC_USMALL; break;
case RPC_FC_SHORT: $$->type = RPC_FC_USHORT; break; case RPC_FC_SHORT: $$->type = RPC_FC_USHORT; break;
case RPC_FC_LONG: $$->type = RPC_FC_ULONG; break; case RPC_FC_LONG: $$->type = RPC_FC_ULONG; break;
@ -565,9 +566,9 @@ base_type: tBYTE { $$ = make_type(RPC_FC_BYTE, NULL); }
} }
| tFLOAT { $$ = make_type(RPC_FC_FLOAT, NULL); } | tFLOAT { $$ = make_type(RPC_FC_FLOAT, NULL); }
| tDOUBLE { $$ = make_type(RPC_FC_DOUBLE, NULL); } | tDOUBLE { $$ = make_type(RPC_FC_DOUBLE, NULL); }
| tBOOLEAN { $$ = make_type(RPC_FC_BYTE, &std_bool); /* ? */ } | tBOOLEAN { $$ = make_type(RPC_FC_SMALL, &std_bool); }
| tERRORSTATUST { $$ = make_type(RPC_FC_ERROR_STATUS_T, NULL); } | tERRORSTATUST { $$ = make_type(RPC_FC_ERROR_STATUS_T, NULL); }
| tHANDLET { $$ = make_type(RPC_FC_BIND_PRIMITIVE, NULL); /* ? */ } | tHANDLET { $$ = make_type(RPC_FC_IGNORE, NULL); }
; ;
m_int: m_int:
@ -575,6 +576,7 @@ m_int:
; ;
int_std: tINT { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */ int_std: tINT { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */
| tSMALL m_int { $$ = make_type(RPC_FC_SMALL, NULL); }
| tSHORT m_int { $$ = make_type(RPC_FC_SHORT, NULL); } | tSHORT m_int { $$ = make_type(RPC_FC_SHORT, NULL); }
| tLONG m_int { $$ = make_type(RPC_FC_LONG, NULL); } | tLONG m_int { $$ = make_type(RPC_FC_LONG, NULL); }
| tHYPER m_int { $$ = make_type(RPC_FC_HYPER, NULL); } | tHYPER m_int { $$ = make_type(RPC_FC_HYPER, NULL); }

View file

@ -87,35 +87,51 @@ static void write_procformatstring(type_t *iface)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_BYTE */\n", var->type->type); print_server("0x%02x, /* FC_BYTE */\n", var->type->type);
break; break;
case RPC_FC_CHAR: case RPC_FC_CHAR:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_CHAR */\n", var->type->type); print_server("0x%02x, /* FC_CHAR */\n", var->type->type);
break; break;
case RPC_FC_WCHAR: case RPC_FC_WCHAR:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_WCHAR */\n", var->type->type); print_server("0x%02x, /* FC_WCHAR */\n", var->type->type);
break; break;
case RPC_FC_USHORT: case RPC_FC_USHORT:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_USHORT */\n", var->type->type); print_server("0x%02x, /* FC_USHORT */\n", var->type->type);
break; break;
case RPC_FC_SHORT: case RPC_FC_SHORT:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_SHORT */\n", var->type->type); print_server("0x%02x, /* FC_SHORT */\n", var->type->type);
break; break;
case RPC_FC_ULONG: case RPC_FC_ULONG:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_ULONG */\n", var->type->type); print_server("0x%02x, /* FC_ULONG */\n", var->type->type);
break; break;
case RPC_FC_LONG: case RPC_FC_LONG:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_LONG */\n", var->type->type); print_server("0x%02x, /* FC_LONG */\n", var->type->type);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n"); print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_HYPER */\n", var->type->type); print_server("0x%02x, /* FC_HYPER */\n", var->type->type);
break;
case RPC_FC_IGNORE:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_IGNORE */\n", var->type->type);
break;
case RPC_FC_SMALL:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_SMALL */\n", RPC_FC_SMALL);
break;
case RPC_FC_FLOAT:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_FLOAT */\n", RPC_FC_FLOAT);
break;
case RPC_FC_DOUBLE:
print_server("0x4e, /* FC_IN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_DOUBLE */\n", RPC_FC_DOUBLE);
break; break;
default: default:
error("Unknown/unsupported type\n"); error("Unknown/unsupported type\n");
@ -138,35 +154,47 @@ static void write_procformatstring(type_t *iface)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_BYTE */\n", var->type->type); print_server("0x%02x, /* FC_BYTE */\n", var->type->type);
break; break;
case RPC_FC_CHAR: case RPC_FC_CHAR:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_CHAR */\n", var->type->type); print_server("0x%02x, /* FC_CHAR */\n", var->type->type);
break; break;
case RPC_FC_WCHAR: case RPC_FC_WCHAR:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_WCHAR */\n", var->type->type); print_server("0x%02x, /* FC_WCHAR */\n", var->type->type);
break; break;
case RPC_FC_USHORT: case RPC_FC_USHORT:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_USHORT */\n", var->type->type); print_server("0x%02x, /* FC_USHORT */\n", var->type->type);
break; break;
case RPC_FC_SHORT: case RPC_FC_SHORT:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_SHORT */\n", var->type->type); print_server("0x%02x, /* FC_SHORT */\n", var->type->type);
break; break;
case RPC_FC_ULONG: case RPC_FC_ULONG:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_ULONG */\n", var->type->type); print_server("0x%02x, /* FC_ULONG */\n", var->type->type);
break; break;
case RPC_FC_LONG: case RPC_FC_LONG:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_LONG */\n", var->type->type); print_server("0x%02x, /* FC_LONG */\n", var->type->type);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* RPC_FC_HYPER */\n", var->type->type); print_server("0x%02x, /* FC_HYPER */\n", var->type->type);
break;
case RPC_FC_SMALL:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_SMALL */\n", RPC_FC_SMALL);
break;
case RPC_FC_FLOAT:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_FLOAT */\n", RPC_FC_FLOAT);
break;
case RPC_FC_DOUBLE:
print_server("0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
print_server("0x%02x, /* FC_DOUBLE */\n", RPC_FC_DOUBLE);
break; break;
default: default:
error("Unknown/unsupported type\n"); error("Unknown/unsupported type\n");
@ -208,17 +236,23 @@ unsigned int get_required_buffer_size(type_t *type)
switch(type->type) switch(type->type)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
case RPC_FC_SMALL:
case RPC_FC_CHAR: case RPC_FC_CHAR:
case RPC_FC_WCHAR: case RPC_FC_WCHAR:
case RPC_FC_USHORT: case RPC_FC_USHORT:
case RPC_FC_SHORT: case RPC_FC_SHORT:
case RPC_FC_ULONG: case RPC_FC_ULONG:
case RPC_FC_LONG: case RPC_FC_LONG:
case RPC_FC_FLOAT:
return 4; return 4;
case RPC_FC_HYPER: case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
return 8; return 8;
case RPC_FC_IGNORE:
return 0;
default: default:
error("Unknown/unsupported type: %s\n", type->name); error("Unknown/unsupported type: %s\n", type->name);
} }
@ -244,6 +278,7 @@ static void unmarshall_arguments(func_t *func)
{ {
case RPC_FC_BYTE: case RPC_FC_BYTE:
case RPC_FC_CHAR: case RPC_FC_CHAR:
case RPC_FC_SMALL:
size = 1; size = 1;
alignment = 0; alignment = 0;
break; break;
@ -258,32 +293,41 @@ static void unmarshall_arguments(func_t *func)
case RPC_FC_ULONG: case RPC_FC_ULONG:
case RPC_FC_LONG: case RPC_FC_LONG:
case RPC_FC_FLOAT:
size = 4; size = 4;
if (last_size != 0 && last_size < 4) if (last_size != 0 && last_size < 4)
alignment = (4 - last_size); alignment = (4 - last_size);
break; break;
case RPC_FC_HYPER: case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
size = 8; size = 8;
if (last_size != 0 && last_size < 4) if (last_size != 0 && last_size < 4)
alignment = (4 - last_size); alignment = (4 - last_size);
break; break;
case RPC_FC_IGNORE:
size = 0;
break;
default: default:
error("Unknown/unsupported type!"); error("Unknown/unsupported type!");
} }
if (alignment != 0) if (size != 0)
print_server("_StubMsg.Buffer += %u;\n", alignment); {
if (alignment != 0)
print_server("_StubMsg.Buffer += %u;\n", alignment);
print_server(""); print_server("");
write_name(server, var); write_name(server, var);
fprintf(server, " = *(("); fprintf(server, " = *((");
write_type(server, var->type, var, var->tname); write_type(server, var->type, var, var->tname);
fprintf(server, " __RPC_FAR*)_StubMsg.Buffer)++;\n"); fprintf(server, " __RPC_FAR*)_StubMsg.Buffer)++;\n");
fprintf(server, "\n"); fprintf(server, "\n");
last_size = size; last_size = size;
}
var = PREV_LINK(var); var = PREV_LINK(var);
} }

File diff suppressed because it is too large Load diff

View file

@ -107,30 +107,31 @@ typedef union {
#define tSIGNED 350 #define tSIGNED 350
#define tSIZEIS 351 #define tSIZEIS 351
#define tSIZEOF 352 #define tSIZEOF 352
#define tSOURCE 353 #define tSMALL 353
#define tSTDCALL 354 #define tSOURCE 354
#define tSTRING 355 #define tSTDCALL 355
#define tSTRUCT 356 #define tSTRING 356
#define tSWITCH 357 #define tSTRUCT 357
#define tSWITCHIS 358 #define tSWITCH 358
#define tSWITCHTYPE 359 #define tSWITCHIS 359
#define tTRANSMITAS 360 #define tSWITCHTYPE 360
#define tTYPEDEF 361 #define tTRANSMITAS 361
#define tUNION 362 #define tTYPEDEF 362
#define tUNIQUE 363 #define tUNION 363
#define tUNSIGNED 364 #define tUNIQUE 364
#define tUUID 365 #define tUNSIGNED 365
#define tV1ENUM 366 #define tUUID 366
#define tVARARG 367 #define tV1ENUM 367
#define tVERSION 368 #define tVARARG 368
#define tVOID 369 #define tVERSION 369
#define tWCHAR 370 #define tVOID 370
#define tWIREMARSHAL 371 #define tWCHAR 371
#define tPOINTERTYPE 372 #define tWIREMARSHAL 372
#define COND 373 #define tPOINTERTYPE 373
#define CAST 374 #define COND 374
#define PPTR 375 #define CAST 375
#define NEG 376 #define PPTR 376
#define NEG 377
extern YYSTYPE yylval; extern YYSTYPE yylval;