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_ENUM16 0x0d
#define RPC_FC_ENUM32 0x0e
#define RPC_FC_IGNORE 0x0f /* handle_t */
#define RPC_FC_ERROR_STATUS_T 0x10
/* 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:
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;
case RPC_FC_CHAR:
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;
case RPC_FC_WCHAR:
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;
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:
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;
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:
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;
case RPC_FC_HYPER:
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;
default:
error("Unknown/unsupported type\n");
return;
}
var = PREV_LINK(var);
@ -133,38 +144,51 @@ static void write_procformatstring(type_t *iface)
{
case RPC_FC_BYTE:
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;
case RPC_FC_CHAR:
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;
case RPC_FC_WCHAR:
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;
case RPC_FC_USHORT:
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;
case RPC_FC_SHORT:
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;
case RPC_FC_ULONG:
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;
case RPC_FC_LONG:
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;
case RPC_FC_HYPER:
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;
default:
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_CHAR:
case RPC_FC_SMALL:
size = 1;
alignment = 0;
break;
@ -234,26 +259,42 @@ static void print_message_buffer_size(func_t *func)
case RPC_FC_ULONG:
case RPC_FC_LONG:
case RPC_FC_FLOAT:
size = 4;
if (last_size != 0 && last_size < 4)
alignment += (4 - last_size);
break;
case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
size = 8;
if (last_size != 0 && last_size < 4)
alignment += (4 - last_size);
break;
case RPC_FC_IGNORE:
size = 0;
break;
default:
error("Unknown/unsupported type!");
}
if (last_size != 0)
fprintf(client, " +");
fprintf(client, " %uU", size + alignment);
if (size == 0)
{
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);
}
@ -279,6 +320,7 @@ static void marshall_arguments(func_t *func)
{
case RPC_FC_BYTE:
case RPC_FC_CHAR:
case RPC_FC_SMALL:
size = 1;
alignment = 0;
break;
@ -293,32 +335,41 @@ static void marshall_arguments(func_t *func)
case RPC_FC_ULONG:
case RPC_FC_LONG:
case RPC_FC_FLOAT:
size = 4;
if (last_size != 0 && last_size < 4)
alignment = (4 - last_size);
break;
case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
size = 8;
if (last_size != 0 && last_size < 4)
alignment = (4 - last_size);
break;
case RPC_FC_IGNORE:
size = 0;
break;
default:
error("Unknown/unsupported type!");
}
if (alignment != 0)
print_client("_StubMsg.Buffer += %u;\n", alignment);
if (size != 0)
{
if (alignment != 0)
print_client("_StubMsg.Buffer += %u;\n", alignment);
print_client("*((");
write_type(client, var->type, var, var->tname);
fprintf(client, " __RPC_FAR*)_StubMsg.Buffer)++ = ");
write_name(client, var);
fprintf(client, ";\n");
fprintf(client, "\n");
print_client("*((");
write_type(client, var->type, var, var->tname);
fprintf(client, " __RPC_FAR*)_StubMsg.Buffer)++ = ");
write_name(client, var);
fprintf(client, ";\n");
fprintf(client, "\n");
last_size = size;
last_size = size;
}
var = PREV_LINK(var);
}
@ -328,6 +379,7 @@ static void marshall_arguments(func_t *func)
static void write_function_stubs(type_t *iface)
{
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;
var_t* var;
int method_count = 0;
@ -343,10 +395,7 @@ static void write_function_stubs(type_t *iface)
write_name(client, def);
fprintf(client, "(\n");
indent++;
if (func->args)
write_args(client, func->args, iface->name, 0, TRUE);
else
print_client("void");
write_args(client, func->args, iface->name, 0, TRUE);
fprintf(client, ")\n");
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);
else fprintf(h, "error_status_t");
break;
case RPC_FC_BIND_PRIMITIVE:
case RPC_FC_IGNORE:
if (t->ref) fprintf(h, t->ref->name);
else fprintf(h, "handle_t");
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);
count++;
}
if (arg == NULL && method == 0) {
fprintf(h, "void");
return;
}
while (arg) {
if (count) {
if (do_indent)
@ -668,10 +672,7 @@ static void write_function_proto(type_t *iface)
fprintf(header, " ");
write_name(header, def);
fprintf(header, "(\n");
if (cur->args)
write_args(header, cur->args, iface->name, 0, TRUE);
else
fprintf(header, " void");
write_args(header, cur->args, iface->name, 0, TRUE);
fprintf(header, ");\n");
cur = PREV_LINK(cur);

View file

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

View file

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

View file

@ -172,6 +172,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
%token tSHORT
%token tSIGNED
%token tSIZEIS tSIZEOF
%token tSMALL
%token tSOURCE
%token tSTDCALL
%token tSTRING tSTRUCT
@ -553,7 +554,7 @@ base_type: tBYTE { $$ = make_type(RPC_FC_BYTE, NULL); }
| tSIGNED int_std { $$ = $2; $$->sign = 1; }
| tUNSIGNED int_std { $$ = $2; $$->sign = -1;
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_SHORT: $$->type = RPC_FC_USHORT; 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); }
| 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); }
| tHANDLET { $$ = make_type(RPC_FC_BIND_PRIMITIVE, NULL); /* ? */ }
| tHANDLET { $$ = make_type(RPC_FC_IGNORE, NULL); }
;
m_int:
@ -575,6 +576,7 @@ m_int:
;
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); }
| tLONG m_int { $$ = make_type(RPC_FC_LONG, 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:
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;
case RPC_FC_CHAR:
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;
case RPC_FC_WCHAR:
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;
case RPC_FC_USHORT:
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;
case RPC_FC_SHORT:
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;
case RPC_FC_ULONG:
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;
case RPC_FC_LONG:
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;
case RPC_FC_HYPER:
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;
default:
error("Unknown/unsupported type\n");
@ -138,35 +154,47 @@ static void write_procformatstring(type_t *iface)
{
case RPC_FC_BYTE:
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;
case RPC_FC_CHAR:
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;
case RPC_FC_WCHAR:
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;
case RPC_FC_USHORT:
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;
case RPC_FC_SHORT:
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;
case RPC_FC_ULONG:
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;
case RPC_FC_LONG:
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;
case RPC_FC_HYPER:
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;
default:
error("Unknown/unsupported type\n");
@ -208,17 +236,23 @@ unsigned int get_required_buffer_size(type_t *type)
switch(type->type)
{
case RPC_FC_BYTE:
case RPC_FC_SMALL:
case RPC_FC_CHAR:
case RPC_FC_WCHAR:
case RPC_FC_USHORT:
case RPC_FC_SHORT:
case RPC_FC_ULONG:
case RPC_FC_LONG:
case RPC_FC_FLOAT:
return 4;
case RPC_FC_HYPER:
case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
return 8;
case RPC_FC_IGNORE:
return 0;
default:
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_CHAR:
case RPC_FC_SMALL:
size = 1;
alignment = 0;
break;
@ -258,32 +293,41 @@ static void unmarshall_arguments(func_t *func)
case RPC_FC_ULONG:
case RPC_FC_LONG:
case RPC_FC_FLOAT:
size = 4;
if (last_size != 0 && last_size < 4)
alignment = (4 - last_size);
break;
case RPC_FC_HYPER:
case RPC_FC_DOUBLE:
size = 8;
if (last_size != 0 && last_size < 4)
alignment = (4 - last_size);
break;
case RPC_FC_IGNORE:
size = 0;
break;
default:
error("Unknown/unsupported type!");
}
if (alignment != 0)
print_server("_StubMsg.Buffer += %u;\n", alignment);
if (size != 0)
{
if (alignment != 0)
print_server("_StubMsg.Buffer += %u;\n", alignment);
print_server("");
write_name(server, var);
fprintf(server, " = *((");
write_type(server, var->type, var, var->tname);
fprintf(server, " __RPC_FAR*)_StubMsg.Buffer)++;\n");
fprintf(server, "\n");
print_server("");
write_name(server, var);
fprintf(server, " = *((");
write_type(server, var->type, var, var->tname);
fprintf(server, " __RPC_FAR*)_StubMsg.Buffer)++;\n");
fprintf(server, "\n");
last_size = size;
last_size = size;
}
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 tSIZEIS 351
#define tSIZEOF 352
#define tSOURCE 353
#define tSTDCALL 354
#define tSTRING 355
#define tSTRUCT 356
#define tSWITCH 357
#define tSWITCHIS 358
#define tSWITCHTYPE 359
#define tTRANSMITAS 360
#define tTYPEDEF 361
#define tUNION 362
#define tUNIQUE 363
#define tUNSIGNED 364
#define tUUID 365
#define tV1ENUM 366
#define tVARARG 367
#define tVERSION 368
#define tVOID 369
#define tWCHAR 370
#define tWIREMARSHAL 371
#define tPOINTERTYPE 372
#define COND 373
#define CAST 374
#define PPTR 375
#define NEG 376
#define tSMALL 353
#define tSOURCE 354
#define tSTDCALL 355
#define tSTRING 356
#define tSTRUCT 357
#define tSWITCH 358
#define tSWITCHIS 359
#define tSWITCHTYPE 360
#define tTRANSMITAS 361
#define tTYPEDEF 362
#define tUNION 363
#define tUNIQUE 364
#define tUNSIGNED 365
#define tUUID 366
#define tV1ENUM 367
#define tVARARG 368
#define tVERSION 369
#define tVOID 370
#define tWCHAR 371
#define tWIREMARSHAL 372
#define tPOINTERTYPE 373
#define COND 374
#define CAST 375
#define PPTR 376
#define NEG 377
extern YYSTYPE yylval;