Improved abstraction of uuid parsing; uuid parsing function now no longer understands "" to mean 'the uuid consisting of only 0s.' Also broke the function out into xpidl_idl.c (where utility functions live) towards reusing it in xpidl_headers as well.

Removed outdated reference to (resolved) bug 5872.
This commit is contained in:
mccabe%netscape.com 1999-08-02 09:46:57 +00:00
parent 97d2f06afc
commit 3e1e43dd00
3 changed files with 65 additions and 53 deletions

View File

@ -125,4 +125,12 @@ xpidl_process_node(TreeState *state);
void void
xpidl_write_comment(TreeState *state, int indent); xpidl_write_comment(TreeState *state, int indent);
#include "xpt_struct.h"
/*
* Parse a uuid string into an nsID struct. We cannot link against libxpcom,
* so we re-implement nsID::Parse here.
*/
gboolean
xpidl_parse_iid(nsID *id, char *str);
#endif /* __xpidl_h */ #endif /* __xpidl_h */

View File

@ -561,8 +561,6 @@ input_callback(IDL_input_reason reason, union IDL_input_data *cb_data,
* upgrade libIDL versions, it'll handle comments for us, which will * upgrade libIDL versions, it'll handle comments for us, which will
* help a lot. * help a lot.
* *
* XXX our line counts are pretty much always wrong (bugzilla #5872)
*
* XXX const string foo = "/\*" will just screw us horribly. * XXX const string foo = "/\*" will just screw us horribly.
*/ */
@ -741,3 +739,49 @@ xpidl_write_comment(TreeState *state, int indent)
fputs(" */\n", state->file); fputs(" */\n", state->file);
} }
/* We only parse the {}-less format. (xpidl_header never has, so we're safe.) */
static const char nsIDFmt2[] =
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x";
/*
* Parse a uuid string into an nsID struct. We cannot link against libxpcom,
* so we re-implement nsID::Parse here.
*/
gboolean
xpidl_parse_iid(struct nsID *id, char *str)
{
PRInt32 count = 0;
PRInt32 n1, n2, n3[8];
PRInt32 n0, i;
assert(str != NULL);
if (strlen(str) != 36) {
return FALSE;
}
#ifdef DEBUG_shaver_iid
fprintf(stderr, "parsing iid %s\n", str);
#endif
count = sscanf(str, nsIDFmt2,
&n0, &n1, &n2,
&n3[0],&n3[1],&n3[2],&n3[3],
&n3[4],&n3[5],&n3[6],&n3[7]);
id->m0 = (PRInt32) n0;
id->m1 = (PRInt16) n1;
id->m2 = (PRInt16) n2;
for (i = 0; i < 8; i++) {
id->m3[i] = (PRInt8) n3[i];
}
#ifdef DEBUG_shaver_iid
if (count == 11) {
fprintf(stderr, "IID parsed to ");
print_IID(id, stderr);
fputs("\n", stderr);
}
#endif
return (gboolean)(count == 11);
}

View File

@ -195,16 +195,12 @@ find_interfaces(IDL_tree_func_data *tfd, gpointer user_data)
return TRUE; return TRUE;
} }
/* parse str and fill id */
static const char nsIDFmt1[] =
"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}";
static const char nsIDFmt2[] =
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x";
#ifdef DEBUG_shaver #ifdef DEBUG_shaver
/* for calling from gdb */ /* for calling from gdb */
/* this should (instead) print to a string... and be the validator for iid
* handling in header mode. Don't forget also to check in the code in
* nsID.cpp.
*/
static void static void
print_IID(struct nsID *iid, FILE *file) print_IID(struct nsID *iid, FILE *file)
{ {
@ -218,44 +214,6 @@ print_IID(struct nsID *iid, FILE *file)
} }
#endif #endif
/* we cannot link against libxpcom, so we re-implement nsID::Parse here. */
static gboolean
fill_iid(struct nsID *id, char *str)
{
PRInt32 count = 0;
PRInt32 n1, n2, n3[8];
PRInt32 n0, i;
if (!str[0]) {
memset(id, 0, sizeof(*id));
return TRUE;
}
#ifdef DEBUG_shaver_iid
fprintf(stderr, "parsing iid %s\n", str);
#endif
count = sscanf(str, (str[0] == '{' ? nsIDFmt1 : nsIDFmt2),
&n0, &n1, &n2,
&n3[0],&n3[1],&n3[2],&n3[3],
&n3[4],&n3[5],&n3[6],&n3[7]);
id->m0 = (PRInt32) n0;
id->m1 = (PRInt16) n1;
id->m2 = (PRInt16) n2;
for (i = 0; i < 8; i++) {
id->m3[i] = (PRInt8) n3[i];
}
#ifdef DEBUG_shaver_iid
if (count == 11) {
fprintf(stderr, "IID parsed to ");
print_IID(id, stderr);
fputs("\n", stderr);
}
#endif
return (gboolean)(count == 11);
}
/* fill the interface_directory IDE table from the interface_map */ /* fill the interface_directory IDE table from the interface_map */
static gboolean static gboolean
fill_ide_table(gpointer key, gpointer value, gpointer user_data) fill_ide_table(gpointer key, gpointer value, gpointer user_data)
@ -264,18 +222,20 @@ fill_ide_table(gpointer key, gpointer value, gpointer user_data)
NewInterfaceHolder *holder = (NewInterfaceHolder *) value; NewInterfaceHolder *holder = (NewInterfaceHolder *) value;
struct nsID id; struct nsID id;
XPTInterfaceDirectoryEntry *ide; XPTInterfaceDirectoryEntry *ide;
char *iid;
XPT_ASSERT(holder); XPT_ASSERT(holder);
iid = holder->iid ? holder->iid : "";
#ifdef DEBUG_shaver_ifaces #ifdef DEBUG_shaver_ifaces
fprintf(stderr, "filling %s\n", holder->full_name); fprintf(stderr, "filling %s\n", holder->full_name);
#endif #endif
if (!fill_iid(&id, iid)) { if (holder->iid) {
IDL_tree_error(state->tree, "cannot parse IID %s\n", iid); if (!xpidl_parse_iid(&id, holder->iid)) {
return FALSE; IDL_tree_error(state->tree, "cannot parse IID %s\n", holder->iid);
return FALSE;
}
} else {
memset(&id, 0, sizeof(id));
} }
ide = &(HEADER(state)->interface_directory[IFACES(state)]); ide = &(HEADER(state)->interface_directory[IFACES(state)]);