/*Last Modified: 7-JAN-1992 13:58:39.00, By: MARK */ /* * This is a crude attempt at doing some object-based programming in C */ #include "gopher.h" void GSinit(gs) GopherStruct *gs; { GSsetType(gs, '\0'); gs->sPath[0] = '\0'; gs->sTitle[0] = '\0'; gs->sHost[0] = '\0'; gs->iPort = 0; gs->iItemnum = 0; } #ifdef GOPHER_SERVER void GStoNet(gs, sockfd) GopherStruct *gs; int sockfd; { static char buf[1024]; buf[0] = GSgetType(gs); sprintf(buf + 1, "%s\t%s\t%s\t%d\r\n", GSgetTitle(gs), GSgetPath(gs), GSgetHost(gs), GSgetPort(gs)); writestring(sockfd, buf); if (DEBUG) fprintf(stderr, buf); } #endif /* GOPHER_SERVER */ /** Copy a gopherstruct ***/ void GScpy(dest, orig) GopherStruct *dest, *orig; { dest->sFileType = orig->sFileType; dest->iPort = orig->iPort; dest->iItemnum = orig->iItemnum; strcpy(dest->sTitle, orig->sTitle); strcpy(dest->sPath, orig->sPath); strcpy(dest->sHost, orig->sHost); } /** Compare two GopherStructs ***/ int GScmp(gs1, gs2) GopherStruct *gs1, *gs2; { return(strcmp(GSgetTitle(gs1), GSgetTitle(gs2))); } /*********************************************************************** ** Stuff for GopherDirObjs ** ***********************************************************************/ /** This proc adds a Gopherstruct to a gopherdir. **/ void GDaddGS(gd, gs) GopherDirObj *gd; GopherStruct *gs; { int x; int Top; Top = GDgetTop(gd); /* if (DEBUG) fprintf(stderr, "Adding %s, Top=%d, Num=%d\n", GSgetTitle(gs), Top, GSgetNum(gs)); */ if ((x = GSgetNum(gs)) != 0) { /** someone wants this to be the nth item. **/ if ((x-1) <= gd->Top) { while (GSgetNum(GDgetEntry(gd, Top)) !=0) Top++; GScpy(GDgetEntry(gd, Top), GDgetEntry(gd, x-1)); GDsetTop(gd, ++Top); } GScpy(GDgetEntry(gd, x-1), gs); } else { /*** First make sure a user-ordered object isn't there ***/ while (GSgetNum(GDgetEntry(gd, Top)) !=0) Top++; /*** Now tack it on the end ***/ GScpy(GDgetEntry(gd, Top), gs); GDsetTop(gd, ++Top); } } #ifdef GOPHER_SERVER void GDsort(gd) GopherDirObj *gd; { int i; /*** Find first non-numbered entry ***/ for (i=0; ; i++) { if (GSgetNum(GDgetEntry(gd, i)) == 0) break; } /*** Everything up to i is already sorted by user-defined ordering ***/ if (GDgetTop(gd) <= i) /** No more sorting needed ***/ return; qsort((char *) GDgetEntry(gd, i), gd->Top-i, sizeof(GopherStruct),GScmp); } #endif void GDinit(gd) GopherDirObj *gd; { int i; for (i=0; i