Handle nsID, nsIID and nsCID via a custom string-compare hack. (Ugly, but we

need 0.6.3 for a better fix, and this'll do for now.)
When sorting IDEs, sort entries with identical IIDs by namespace::name.
This commit is contained in:
shaver%netscape.com 1999-03-09 19:59:42 +00:00
parent 5702320be6
commit be86a9ee70
2 changed files with 106 additions and 18 deletions

View File

@ -208,19 +208,37 @@ fill_ide_table(gpointer key, gpointer value, gpointer user_data)
}
static int
compare_iids(const void *ap, const void *bp)
compare_IDEs(const void *ap, const void *bp)
{
const nsID *a = ap, *b = bp;
const XPTInterfaceDirectoryEntry *a = ap, *b = bp;
const nsID *aid = &a->iid, *bid = &b->iid;
const char *ans, *bns;
int i;
#define COMPARE(field) if (a->field > b->field) return 1; \
if (b->field > a->field) return -1;
#define COMPARE(field) if (aid->field > bid->field) return 1; \
if (bid->field > aid->field) return -1;
COMPARE(m0);
COMPARE(m1);
COMPARE(m2);
for (i = 0; i < 8; i++) {
COMPARE(m3[i]);
}
return 0;
/* defend against NULL name_space by using empty string. */
ans = a->name_space ? a->name_space : "";
bns = b->name_space ? b->name_space : "";
if (a->name_space && b->name_space) {
if ((i = strcmp(a->name_space, b->name_space)))
return i;
} else {
if (a->name_space || b->name_space) {
if (a->name_space)
return -1;
return 1;
}
}
return strcmp(a->name, b->name);
#undef COMPARE
}
@ -241,7 +259,7 @@ sort_ide_block(TreeState *state)
}
#endif
qsort(HEADER(state)->interface_directory, IFACES(state),
sizeof(*ide), compare_iids);
sizeof(*ide), compare_IDEs);
#ifdef DEBUG_shaver_sort
fputs("after sort:\n", stderr);
for (i = 0; i < IFACES(state); i++) {
@ -520,9 +538,35 @@ fill_td_from_type(TreeState *state, XPTTypeDescriptor *td, IDL_tree type)
}
break;
}
case IDLN_NATIVE:
td->prefix.flags = TD_VOID | XPT_TDP_POINTER;
break;
case IDLN_NATIVE: {
char *ident = IDL_IDENT(type).str;
gboolean isID = FALSE;
/* check for nsID, nsCID, nsIID */
if (ident[0] == 'n' && ident[1] == 's') {
ident += 2;
if (ident[0] == 'C')
ident ++;
else if (ident[0] == 'I' && ident[1] == 'I')
ident ++;
if (ident[0] == 'I' && ident[1] == 'D' &&
ident[2] == '\0')
isID = TRUE;
}
if (isID) {
#ifdef DEBUG_shaver
fprintf(stderr, "doing nsID for %s\n",
IDL_IDENT(type).str);
#endif
td->prefix.flags = TD_PNSIID | XPT_TDP_POINTER;
} else {
#ifdef DEBUG_shaver
fprintf(stderr, "not doing nsID for %s\n",
IDL_IDENT(type).str);
#endif
td->prefix.flags = TD_VOID | XPT_TDP_POINTER;
}
break;
}
default:
if (IDL_NODE_TYPE(IDL_NODE_UP(up)) == IDLN_TYPE_DCL) {
/* restart with the underlying type */

View File

@ -208,19 +208,37 @@ fill_ide_table(gpointer key, gpointer value, gpointer user_data)
}
static int
compare_iids(const void *ap, const void *bp)
compare_IDEs(const void *ap, const void *bp)
{
const nsID *a = ap, *b = bp;
const XPTInterfaceDirectoryEntry *a = ap, *b = bp;
const nsID *aid = &a->iid, *bid = &b->iid;
const char *ans, *bns;
int i;
#define COMPARE(field) if (a->field > b->field) return 1; \
if (b->field > a->field) return -1;
#define COMPARE(field) if (aid->field > bid->field) return 1; \
if (bid->field > aid->field) return -1;
COMPARE(m0);
COMPARE(m1);
COMPARE(m2);
for (i = 0; i < 8; i++) {
COMPARE(m3[i]);
}
return 0;
/* defend against NULL name_space by using empty string. */
ans = a->name_space ? a->name_space : "";
bns = b->name_space ? b->name_space : "";
if (a->name_space && b->name_space) {
if ((i = strcmp(a->name_space, b->name_space)))
return i;
} else {
if (a->name_space || b->name_space) {
if (a->name_space)
return -1;
return 1;
}
}
return strcmp(a->name, b->name);
#undef COMPARE
}
@ -241,7 +259,7 @@ sort_ide_block(TreeState *state)
}
#endif
qsort(HEADER(state)->interface_directory, IFACES(state),
sizeof(*ide), compare_iids);
sizeof(*ide), compare_IDEs);
#ifdef DEBUG_shaver_sort
fputs("after sort:\n", stderr);
for (i = 0; i < IFACES(state); i++) {
@ -520,9 +538,35 @@ fill_td_from_type(TreeState *state, XPTTypeDescriptor *td, IDL_tree type)
}
break;
}
case IDLN_NATIVE:
td->prefix.flags = TD_VOID | XPT_TDP_POINTER;
break;
case IDLN_NATIVE: {
char *ident = IDL_IDENT(type).str;
gboolean isID = FALSE;
/* check for nsID, nsCID, nsIID */
if (ident[0] == 'n' && ident[1] == 's') {
ident += 2;
if (ident[0] == 'C')
ident ++;
else if (ident[0] == 'I' && ident[1] == 'I')
ident ++;
if (ident[0] == 'I' && ident[1] == 'D' &&
ident[2] == '\0')
isID = TRUE;
}
if (isID) {
#ifdef DEBUG_shaver
fprintf(stderr, "doing nsID for %s\n",
IDL_IDENT(type).str);
#endif
td->prefix.flags = TD_PNSIID | XPT_TDP_POINTER;
} else {
#ifdef DEBUG_shaver
fprintf(stderr, "not doing nsID for %s\n",
IDL_IDENT(type).str);
#endif
td->prefix.flags = TD_VOID | XPT_TDP_POINTER;
}
break;
}
default:
if (IDL_NODE_TYPE(IDL_NODE_UP(up)) == IDLN_TYPE_DCL) {
/* restart with the underlying type */