зеркало из https://github.com/mozilla/pjs.git
slightly faster parser
This commit is contained in:
Родитель
5c4146ac85
Коммит
6c0d9026ee
|
@ -71,91 +71,124 @@ cookiePropValue (char* cookie, char* prop) {
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
AnswerOpenDirQuery (WriteClientProc callBack, void* obj, char *query, char* cookie) {
|
||||
char buff[1000];
|
||||
RDF_Resource narrow = RDF_GetResource("narrow", 1);
|
||||
RDF_Resource link = RDF_GetResource("link", 1);
|
||||
RDF_Resource name = RDF_GetResource("name", 1);
|
||||
RDF_Resource topic = RDF_GetResource("Topic", 1);
|
||||
RDF_Resource desc = RDF_GetResource("description", 1);
|
||||
RDF_Resource editor = RDF_GetResource("editor", 1);
|
||||
RDF_Resource newsGroup = RDF_GetResource("newsGroup", 1);
|
||||
RDF_Resource node = getNodeFromQuery(query);
|
||||
char widthc = cookiePropValue(cookie, "cols");
|
||||
char sort = cookiePropValue(cookie, "sort");
|
||||
size_t rw = (widthc ? ((int)widthc - 48) : 3);
|
||||
RDF_Resource gNarrow;
|
||||
RDF_Resource gLink;
|
||||
RDF_Resource gName;
|
||||
RDF_Resource gTopic;
|
||||
RDF_Resource gDesc;
|
||||
RDF_Resource gEditor;
|
||||
RDF_Resource gNewsGroup;
|
||||
char* gTemplate;
|
||||
int gInited = 0;
|
||||
#define MAX_TEMPLATE_SIZE 20000
|
||||
|
||||
if (!sort) sort = 'D';
|
||||
void
|
||||
Init () {
|
||||
if (!gInited) {
|
||||
int n = 0;
|
||||
FILE *templateFile = fopen("template.html", "r");
|
||||
gInited = 1;
|
||||
gNarrow = RDF_GetResource("narrow", 1);
|
||||
gLink = RDF_GetResource("link", 1);
|
||||
gName = RDF_GetResource("name", 1);
|
||||
gTopic = RDF_GetResource("Topic", 1);
|
||||
gDesc = RDF_GetResource("description", 1);
|
||||
gEditor = RDF_GetResource("editor", 1);
|
||||
gNewsGroup = RDF_GetResource("newsGroup", 1);
|
||||
gTemplate = malloc(MAX_TEMPLATE_SIZE+1);
|
||||
memset(gTemplate, '\0', MAX_TEMPLATE_SIZE);
|
||||
n = fread(gTemplate, 1, MAX_TEMPLATE_SIZE, templateFile);
|
||||
gTemplate[n] = '\0';
|
||||
fclose(templateFile);
|
||||
}
|
||||
}
|
||||
|
||||
char*
|
||||
resourceName (RDF_Resource u) {
|
||||
char* nm = (char*) RDF_OnePropValue(0, u, gName, RDF_STRING_TYPE);
|
||||
char* id = RDF_ResourceID(u);
|
||||
if (!nm || strchr(nm, '/')) nm = strrchr(id, '/') +1;
|
||||
return nm;
|
||||
}
|
||||
|
||||
void
|
||||
outputTopicName (WriteClientProc callBack, void* obj, RDF_Resource node) {
|
||||
char* nm = (char*) RDF_OnePropValue(0, node, gName, RDF_STRING_TYPE);
|
||||
char* id = RDF_ResourceID(node);
|
||||
|
||||
if (!nm || strchr(nm, '/'))
|
||||
if (strchr(id, '/')) {
|
||||
nm = strrchr(id, '/') +1;
|
||||
} else {
|
||||
nm = id;
|
||||
}
|
||||
|
||||
(*callBack)(obj, nm);
|
||||
}
|
||||
|
||||
void
|
||||
listSubTopics (WriteClientProc callBack, void* obj, RDF_Resource node, char* cookie, RDF_Resource p) {
|
||||
if (node) {
|
||||
RDF_Cursor c = RDF_GetTargets(0, node, narrow, RDF_RESOURCE_TYPE);
|
||||
RDF_Resource u = (RDF_Resource) RDF_NextValue(c);
|
||||
(*callBack)(obj, PREFIX);
|
||||
listParents(callBack, obj, node, 0);
|
||||
if (u) {
|
||||
(*callBack)(obj, "<BR><hr><table cellspacing=\"6\" cellpadding=\"6\" width=\"80%\">");
|
||||
while (u) {
|
||||
int w = 0;
|
||||
(*callBack)(obj, "<tr>");
|
||||
while ((w < rw) && u) {
|
||||
char* nm = (char*) RDF_OnePropValue(0, u, name, RDF_STRING_TYPE);
|
||||
char* id = RDF_ResourceID(u);
|
||||
if (!nm || strchr(nm, '/')) nm = strrchr(id, '/') +1;
|
||||
sprintf(buff, "<td width=\"%i%\"><li><a href=\"OpenDir?browse=%s\">%s</a></td>",
|
||||
(100 / rw), id, (nm ? nm : id));
|
||||
(*callBack)(obj, buff);
|
||||
w++;
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
}
|
||||
(*callBack)(obj, "</tr>");
|
||||
}
|
||||
(*callBack)(obj, "</table>");
|
||||
RDF_Cursor c = RDF_GetTargets(0, node, p, RDF_RESOURCE_TYPE);
|
||||
char widthc = cookiePropValue(cookie, "cols");
|
||||
RDF_Resource u;
|
||||
char buff[5000];
|
||||
RDF_Resource subTopicList[200];
|
||||
int n = 0;
|
||||
int w = 0;
|
||||
while (u = (RDF_Resource) RDF_NextValue(c)) {
|
||||
subTopicList[n++] = u;
|
||||
}
|
||||
|
||||
RDF_DisposeCursor(c);
|
||||
(*callBack)(obj, "<hr><UL>");
|
||||
c = RDF_GetTargets(0, node, link, RDF_RESOURCE_TYPE);
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
while (u) {
|
||||
describeItem(callBack, obj, u);
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
}
|
||||
(*callBack)(obj, "</UL>");
|
||||
RDF_DisposeCursor(c);
|
||||
|
||||
c = RDF_GetTargets(0, node, newsGroup, RDF_RESOURCE_TYPE);
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
if (u) {
|
||||
(*callBack)(obj, "<hr><b>NewsGroups:</B>");
|
||||
while (u) {
|
||||
char* id = RDF_ResourceID(u);
|
||||
sprintf(buff, "<li><a href=\"%s\">%s</a>", id, id);
|
||||
(*callBack)(obj, buff);
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
for (w = 0; w < n; w++) {
|
||||
char* id;
|
||||
if (((w == 0) || (w == ((n+1)/2))) && (p == gNarrow)) {
|
||||
if (w != 0) (*callBack)(obj, "</td>");
|
||||
(*callBack)(obj, "</UL>\n<TD width=\"40%\" valign=top><UL><FONT Face=\"sans-serif, Arial, Helvetica\">\n<UL>\n");
|
||||
}
|
||||
(*callBack)(obj, "</UL>");
|
||||
}
|
||||
RDF_DisposeCursor(c);
|
||||
|
||||
|
||||
c = RDF_GetTargets(0, node, editor, RDF_RESOURCE_TYPE);
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
if (u) {
|
||||
(*callBack)(obj, "<hr><b>Editors:</b>");
|
||||
while (u) {
|
||||
char* id = RDF_ResourceID(u);
|
||||
sprintf(buff, " %s", id);
|
||||
(*callBack)(obj, buff);
|
||||
u = (RDF_Resource) RDF_NextValue(c);
|
||||
}
|
||||
|
||||
RDF_DisposeCursor(c);
|
||||
u = subTopicList[w];
|
||||
id = RDF_ResourceID(u);
|
||||
if (p == gNarrow) {
|
||||
sprintf(buff, "<li><a href=\"OpenDir?browse=%s\">%s</a>\n", id, resourceName(u));
|
||||
} else {
|
||||
char* des = (char*) RDF_OnePropValue(0, u, gDesc, RDF_STRING_TYPE);
|
||||
sprintf(buff, "<li><a href=\"%s\">%s</a> %s %s\n", id, resourceName(u),
|
||||
(des ? " : " : ""), (des ? des : ""));
|
||||
}
|
||||
(*callBack)(obj, buff);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
AnswerOpenDirQuery (WriteClientProc callBack, void* obj, char *query, char* cookie) {
|
||||
RDF_Resource node = getNodeFromQuery(query);
|
||||
size_t n = 0;
|
||||
char buff[MAX_TEMPLATE_SIZE];
|
||||
char* pbegin = 0;
|
||||
char* begin;
|
||||
Init();
|
||||
begin = gTemplate;
|
||||
while (pbegin = strstr(begin, "&Topic")) {
|
||||
memset(buff, '\0', 10000);
|
||||
memcpy(buff, begin, pbegin-begin);
|
||||
(*callBack)(obj, buff);
|
||||
if (startsWith("&TopicName;", pbegin)) {
|
||||
outputTopicName(callBack, obj, node);
|
||||
} else if (startsWith("&TopicPath;", pbegin)) {
|
||||
listParents(callBack, obj, node, 0);
|
||||
} else if (startsWith("&TopicSubTopics;", pbegin)) {
|
||||
listSubTopics(callBack, obj, node, cookie, gNarrow);
|
||||
} else if (startsWith("&TopicItems;", pbegin)) {
|
||||
listSubTopics(callBack, obj, node, cookie, gLink);
|
||||
}
|
||||
|
||||
begin = pbegin + (strchr(pbegin, ';') - pbegin) + 1;
|
||||
|
||||
}
|
||||
(*callBack)(obj, begin);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void describeCategory (WriteClientProc callBack, void* obj, RDF_Resource u) {
|
||||
char buff[1000];
|
||||
|
@ -198,11 +231,11 @@ AnswerSearchQuery (WriteClientProc callBack, void* obj, char *query, char* cooki
|
|||
RDF_Resource topic = RDF_GetResource("Topic", 1);
|
||||
RDF_Resource type = RDF_GetResource("type", 1);
|
||||
RDF_Resource u ;
|
||||
RDF_Resource* cats = (RDF_Resource*)xGetMem(sizeof(RDF_Resource) * (MRN + 1));
|
||||
RDF_Resource* items = (RDF_Resource*)xGetMem(sizeof(RDF_Resource) * (MRN + 1));;
|
||||
size_t catn = 0;
|
||||
size_t itemn = 0;
|
||||
size_t index;
|
||||
RDF_Resource* cats = (RDF_Resource*)xGetMem(sizeof(RDF_Resource) * (MRN + 1));
|
||||
RDF_Resource* items = (RDF_Resource*)xGetMem(sizeof(RDF_Resource) * (MRN + 1));
|
||||
char showDesc = cookiePropValue(cookie, "searchDesc");
|
||||
|
||||
(*callBack)(obj, PREFIX);
|
||||
|
|
|
@ -68,9 +68,11 @@ TNS
|
|||
findChildOfChar (TNS node, char c) {
|
||||
TNS ch = node->child;
|
||||
char c1 = tolower(c);
|
||||
int n = 0;
|
||||
while (ch) {
|
||||
if (c1 == ch->c) return ch;
|
||||
ch = ch->next;
|
||||
n++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -52,14 +52,14 @@ Run(ServerSession_t obj)
|
|||
val++;
|
||||
*(val -1) = '\0';
|
||||
WAIStartResponse(obj);
|
||||
WriteClient(obj, PREFIX);
|
||||
/* WriteClient(obj, PREFIX); */
|
||||
|
||||
if (strcmp(query, "browse") == 0) {
|
||||
AnswerOpenDirQuery(WriteClient, obj, val, cookie);
|
||||
} else if (strcmp(query, "search") == 0) {
|
||||
AnswerSearchQuery(WriteClient, obj, val, cookie);
|
||||
}
|
||||
WriteClient(obj, POSTFIX);
|
||||
/* WriteClient(obj, POSTFIX); */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -71,6 +71,7 @@ int WINAPI WinMain(
|
|||
LPSTR lpCmdLine, // pointer to command line
|
||||
int nCmdShow // show state of window
|
||||
)
|
||||
|
||||
{
|
||||
int argc = 0;
|
||||
char **argv = NULL;
|
||||
|
@ -80,7 +81,8 @@ int main(int argc, char **argv)
|
|||
#endif
|
||||
char localhost[256];
|
||||
char *host;
|
||||
RDF_Resource u;
|
||||
RDF_Resource u;
|
||||
int n = 2;
|
||||
IIOPWebAppService_t obj;
|
||||
|
||||
//
|
||||
|
@ -106,6 +108,7 @@ int main(int argc, char **argv)
|
|||
// that appears as argv[0].
|
||||
// GetCommandLine can be used to retrieve the
|
||||
// whole thing.
|
||||
n = 1;
|
||||
if (lpCmdLine && *lpCmdLine){
|
||||
if (*lpCmdLine != '-'){
|
||||
char *sep = strchr(lpCmdLine, ' ');
|
||||
|
@ -129,8 +132,13 @@ int main(int argc, char **argv)
|
|||
WAIregisterService(obj, host);
|
||||
RDF_Initialize();
|
||||
printf("RDF Initialized!\n");
|
||||
RDF_ReadFile(argv[2]);
|
||||
|
||||
if (argc == 0) {
|
||||
RDF_ReadFile("three_level");
|
||||
} else {
|
||||
while (n <= argc) {
|
||||
RDF_ReadFile(argv[n++]);
|
||||
}
|
||||
}
|
||||
printf("done");
|
||||
|
||||
WAIimplIsReady();
|
||||
|
|
|
@ -236,12 +236,13 @@ parseNextRDFXMLBlobInt(RDFT f, char* blob, int size) {
|
|||
if ((c == '\n') || (c == '\r')) lineNumber++;
|
||||
m = 0;
|
||||
somethingseenp = 0;
|
||||
memset(f->line, '\0', RDF_BUF_SIZE-1);
|
||||
/* memset(f->line, '\0', RDF_BUF_SIZE-1); */
|
||||
if (f->holdOver[0] != '\0') {
|
||||
memcpy(f->line, f->holdOver, strlen(f->holdOver));
|
||||
m = strlen(f->holdOver);
|
||||
somethingseenp = 1;
|
||||
memset(f->holdOver, '\0', RDF_BUF_SIZE-1);
|
||||
f->holdOver[0] = '\0';
|
||||
/* memset(f->holdOver, '\0', RDF_BUF_SIZE-1); */
|
||||
}
|
||||
while ((n < size) && (wsCharp(c)) && (!somethingseenp)) {
|
||||
c = blob[++n];
|
||||
|
@ -256,19 +257,23 @@ parseNextRDFXMLBlobInt(RDFT f, char* blob, int size) {
|
|||
else break;
|
||||
if ((c == '\n') || (c == '\r')) lineNumber++;
|
||||
}
|
||||
f->line[m] = '\0';
|
||||
f->line[m+1] = '\0';
|
||||
if (c == '>') f->line[m] = c;
|
||||
n++;
|
||||
if (m > 0) {
|
||||
if ((c == '<') || (c == '>')) {
|
||||
last = n;
|
||||
if (c == '<') f->holdOver[0] = '<';
|
||||
if (c == '<') {
|
||||
f->holdOver[0] = '<';
|
||||
f->holdOver[1] = '\0';
|
||||
}
|
||||
if (somethingseenp == 1) {
|
||||
int ok = parseNextRDFToken(f, f->line);
|
||||
if (!ok)
|
||||
return 0;
|
||||
}
|
||||
parseNextRDFToken(f, f->line);
|
||||
}
|
||||
} else if (size > last) {
|
||||
memcpy(f->holdOver, f->line, m);
|
||||
f->holdOver[m+1] = '\0';
|
||||
}
|
||||
} else if (c == '<') f->holdOver[0] = '<';
|
||||
}
|
||||
|
|
|
@ -0,0 +1,131 @@
|
|||
<html><head><title>Open Directory - Business</title>
|
||||
</head>
|
||||
<body bgcolor="#ffffff" text="#000000" link="#0000ee" vlink="#551a8b" alink="#ff0000">
|
||||
<!-- BAN_NAV:START:TOP -->
|
||||
<CENTER>
|
||||
<!-- Netscape Logo & GLOBAL UTILITY -->
|
||||
<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=600>
|
||||
<TR>
|
||||
<TD ROWSPAN=2 WIDTH=135 HEIGHT=35 VALIGN="TOP">
|
||||
<!-- Netscape lockup image and link go in this cell -->
|
||||
<!-- E1:START:NSCP_LOCKUP --><A HREF="http://home.netscape.com/"><IMG SRC="/images/nnc_lockup.gif" ALT="Netscape Netcenter"
|
||||
WIDTH=123 HEIGHT=33 BORDER=0></A><!-- E1:END:NSCP_LOCKUP --></TD>
|
||||
<TD WIDTH=465 BGCOLOR="#99CCCC" HEIGHT=17 ALIGN="RIGHT" VALIGN="middle">
|
||||
<!-- Netscape Global Utilities Bar belongs in this cell-->
|
||||
<FONT FACE="sans-serif, Arial, Helvetica" SIZE="2">
|
||||
<!-- E2:START:GLOBAL_UTILITY-->
|
||||
<A HREF="http://home.netscape.com/misc/nav_redir/netsearch.html">Net Search</A> | <A HREF="http://home.netscape.com/misc/nav_redir/webmail.html">WebMail</A> | <A HREF="http://home.netscape.com/misc/nav_redir/personalize.html">Personalize</A> | <A HREF="http://home.netscape.com/misc/nav_redir/members.html">Members</A> | <A HREF="http://home.netscape.com/misc/nav_redir/download.html">Download</A>
|
||||
|
||||
<!-- E2:END:GLOBAL_UTILITY --></FONT></TD></TR>
|
||||
<!-- Blank cells for spacing: do not remove -->
|
||||
<TR> <TD HEIGHT=20></TD> </TR>
|
||||
</TABLE>
|
||||
|
||||
<!-- start AD -->
|
||||
|
||||
<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0 WIDTH=600>
|
||||
<TR><TD ALIGN="CENTER" VALIGN="TOP">
|
||||
<!-- AD CEll -->
|
||||
<!-- E3:START:AD -->
|
||||
<FONT FACE="sans-serif, Arial, Helvetica" SIZE="2">
|
||||
|
||||
<!--AD_TAG VENDOR=ADFORCE WIDTH=468 HEIGHT=60-->
|
||||
<IFRAME WIDTH=468 HEIGHT=60 NORESIZE SCROLLING=No FRAMEBORDER=0 MARGINHEIGHT=0 MARGINWIDTH=0
|
||||
SRC="http://adforce.imgis.com/?adiframe|2.0|9|20894|1|1|ADFORCE;">
|
||||
<A href="http://adforce.imgis.com/?adlink|9|20894|1|1|misc=916957047;AdId=35443;BnId=1;IMGIS;loc=400;" TARGET=_top><IMG SRC="http://imageserv.imgis.com/images/Ad35443St1Sz1Sq1Id1_Ban1.gif" NAME=imgisad BORDER=0 ALT='Internet access as low as 14.95 per month! Click here!' WIDTH=468 HEIGHT=60></A>
|
||||
|
||||
</IFRAME>
|
||||
<BR><A href="http://adforce.imgis.com/?adlink|2.0|9|20894|1|1|IMGIS;loc=100;" target=_top><B>Click Here!</B></A>
|
||||
|
||||
|
||||
</FONT></TD></TR></TABLE>
|
||||
|
||||
<TABLE BORDER=0 WIDTH=600 CELLSPACING=0 CELLPADDING=0>
|
||||
<TR> <TD ALIGN="CENTER"><HR WIDTH=600 NOSHADE SIZE=1></TD></TR>
|
||||
<TR VALIGN="TOP">
|
||||
<TD ALIGN="LEFT"><FONT FACE="sans-serif, Arial, Helvetica" SIZE="2" COLOR="#CC0033">You are here:</FONT>
|
||||
<FONT FACE="sans-serif, Arial, Helvetica" SIZE="2">
|
||||
<A HREF="http://home.netscape.com/">Home</A> > &TopicPath;
|
||||
</FONT></TD></TR></TABLE>
|
||||
|
||||
<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=600>
|
||||
<TR VALIGN="BOTTOM">
|
||||
<TD><FONT FACE="sans-serif, Arial, Helvetica" SIZE="5"><B>&TopicName;
|
||||
</B></FONT>
|
||||
</TD>
|
||||
<TD ALIGN="RIGHT"></TD>
|
||||
</TR>
|
||||
<TR><TD HEIGHT=2 COLSPAN=2></TD></TR>
|
||||
</TABLE>
|
||||
<HR NOSHADE SIZE=1 WIDTH=600>
|
||||
|
||||
<TABLE Border=0 Cellpadding=0 Cellspacing=0 Width=600>
|
||||
<TR><TD>
|
||||
|
||||
<FORM method=get action="/cgi-bin/search">
|
||||
<INPUT size=25 name=search> <INPUT type=submit value=Search>
|
||||
<FONT Face="sans-serif, Arial, Helvetica">
|
||||
<BR><INPUT type=radio name=all value=yes checked>Search the entire directory
|
||||
<INPUT type=radio name=all value=no>Search only in <B>&TopicName;</B>
|
||||
<INPUT type=hidden name=cat value="Business">
|
||||
</FONT></TD></TR></TABLE>
|
||||
<HR Width=600 Noshade Size=1>
|
||||
<TABLE Border=0 Cellpadding=0 Cellspacing=0 Width=600>
|
||||
<TR>
|
||||
&TopicSubTopics;
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<HR Width=600 Noshade Size=1>
|
||||
<TABLE Border=0 Cellpadding=0 Cellspacing=0 Width=600>
|
||||
<TR>
|
||||
<TD width="%" valign=top><UL><FONT Face="sans-serif, Arial, Helvetica">
|
||||
<P>
|
||||
&TopicItems;
|
||||
</TD>
|
||||
</TR></TABLE>
|
||||
<HR Width=600 Noshade Size=1>
|
||||
|
||||
<TABLE Border=0 Cellpadding=0 Cellspacing=0 Width=600>
|
||||
<TR>
|
||||
<TD valign=bottom><SMALL><A href="/about.html">About the Open Directory Project</A>
|
||||
<BR><A href=&TopicAddURL;>Add URL</A> <B>-</B>
|
||||
<A href=&TopicBecomeEditor;>Become an Editor</A>
|
||||
</TD>
|
||||
<TD><DIV align=right><TABLE bgcolor="#f0f0f0"><TR><TD><TABLE><TR><TD valign=top><FONT Face="sans-serif, Arial, Helvetica"><SMALL>Category editor:</SMALL></TD>&TopicEditors;</TR></TABLE></TD></TR></TABLE></DIV>
|
||||
</TD></TR></TABLE>
|
||||
<HR Width=600 Noshade Size=1>
|
||||
<CENTER><FONT Face="sans-serif, Arial, Helvetica"></CENTER>
|
||||
</FORM>
|
||||
|
||||
<TABLE WIDTH=600 BORDER=0 CELLPADDING=0 CELLSPACING=0>
|
||||
|
||||
<TR><TD ALIGN=LEFT VALIGN=TOP><FONT FACE="sans-serif, Arial, Helvetica" SIZE=-2><A HREF="http://home.netscape.com/misc/nav_redir/help.html" TARGET="_top">Help</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/site_map.html" TARGET="_top">Site Map</A> | <A HREF="http://home.netscape.com/misc/nav_redir/company_info.html" TARGET="_top">Company Information</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/howtoget.html" TARGET="_top">How to Get Netscape Products</A> | <A HREF="http://home.netscape.com/misc/nav_redir/ad.html" TARGET="_top">Advertise With Us</A> | <A HREF="http://home.netscape.com/misc/nav_redir/addsite.html" TARGET="_top">Add Site</A></FONT></TD></TR>
|
||||
<TR>
|
||||
<TD WIDTH=600 HEIGHT=8 COLSPAN=0></TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD ALIGN=LEFT VALIGN=TOP>
|
||||
<FONT FACE="sans-serif, Arial, Helvetica" SIZE=-2><A HREF="http://home.netscape.com/misc/nav_redir/channels/autos.html" TARGET="_top">Autos</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/business.html" TARGET="_top">Business</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/computers_internet.html" TARGET="_top">Computing & Internet</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/education.html" TARGET="_top">Education</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/entertainment.html" TARGET="_top">Entertainment</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/games.html" TARGET="_top">Games</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/health.html" TARGET="_top">Health</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/kids_family.html" TARGET="_top">Kids & Family</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/lifestyles.html" TARGET="_top">Lifestyles</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/local.html" TARGET="_top">Local</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/netscape.html" TARGET="_top">Netscape</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/news.html" TARGET="_top">News</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/personalize_finance.html" TARGET="_top">Personal Finance</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/real_estate.html" TARGET="_top">Real Estate</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/shopping.html" TARGET="_top">Shopping</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/smallbiz.html" TARGET="_top">Small Business</A> | <A
|
||||
HREF="http://home.netscape.com/misc/nav_redir/channels/sports.html" TARGET="_top">Sports</A> | <A HREF="http://home.netscape.com/misc/nav_redir/channels/travel.html" TARGET="_top">Travel</A></FONT></TD></TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE WIDTH=600 BORDER=0 CELLPADDING=0 CELLSPACING=0>
|
||||
<TR><TD WIDTH=600 HEIGHT=8 COLSPAN=0></TD></TR>
|
||||
<TR>
|
||||
<TD WIDTH=600 COLSPAN=5 VALIGN=TOP ALIGN=LEFT>
|
||||
<FONT FACE="sans-serif, Arial, Helvetica" SIZE=-2>
|
||||
© 1999 Netscape, All Rights Reserved. <A HREF="http://home.netscape.com/legal_notices/index.html">Legal & Privacy Notices</A><BR>This site powered by <A HREF="http://home.netscape.com/comprod/server_central/index.html" TARGET="_top">Netscape SuiteSpot servers</A>.</FONT></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</CENTER></BODY></HTML>
|
Загрузка…
Ссылка в новой задаче