#include"tcpdl.h"

#define debug(x) ;

struct namedata * __saveds
getfilenumber( char *urlname )
{
LONG i;
char tempstring[PFNSIZE+512];
struct namedata *urldata;
ULONG numbertotest;
ULONG expsum;
LONG exp;
struct namedata *urldatatest;
struct namedata *urldatamin;
LONG  compresult;
struct strippedurl surl;

   while( TRUE )
   {
      Forbid();
      if( mmpoint->namedatainuse==FALSE )
      {
         mmpoint->namedatainuse=TRUE;
         Permit();
         break;
      }
      Permit();
      Delay(1);
   }
   
   if( mmpoint->numberurldata!=0 )
   {
      numbertotest=mmpoint->numberurldata;
      
      urldatamin=mmpoint->firsturldata;
      
      while( TRUE )
      {
         exp=0;
         expsum=1;
         while( expsum < numbertotest )
         {
            exp++;
            expsum=expsum*2;
            debug( printf("exp=%d, expsum=%d\n", exp, expsum ); );
         }
         
         urldatatest=urldatamin;
         
         for( i=0;i<exp;i++ )
            urldatatest=urldatatest->next;
         
         compresult = Strnicmp( urldatatest->urlname, urlname, -1 );   
         debug( printf("urldatatest->urlname=%s, urlname=%s, compresult=%d, exp=%d, numbertotest=%d\n", urldatatest->urlname, urlname, compresult, exp, numbertotest ); );
         
         if( compresult==0 )
         {
            Forbid();
            mmpoint->namedatainuse=FALSE;
            Permit();
            debug( printf( "hittad\n"); );
            return( urldatatest );
         }
         
         if( compresult==-1 )
         {
            numbertotest=numbertotest-exp;
            urldatamin=urldatatest;
         }
         else
         {
            numbertotest=exp;
            /*urldatatest=urldatatest;*/
         }
         
         if( exp==0 )
            break;
      }
   }
   
   urldata = AllocMem( sizeof( struct namedata ), MEMF_CLEAR|MEMF_PUBLIC );
   if( urldata==0 )
   {
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( 0 );
   }
   
   urldata->retriesleft=NUMBERRETRIES;
   
   while( *(urlname+urldata->urlnamelength)!=0 )
      urldata->urlnamelength++;
   urldata->urlnamelength++;
         
   urldata->urlname = AllocMem( urldata->urlnamelength, MEMF_CLEAR|MEMF_PUBLIC );
   if( urldata->urlname==0 )
   {
      FreeMem( urldata, sizeof( struct namedata ) );
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( 0 );
   }
   
   sprintf( urldata->urlname, "%s", urlname );
   
   makefilename( tempstring, urlname );
   
   while( *(tempstring+urldata->urlfilenamelength)!=0 )
      urldata->urlfilenamelength++;
   urldata->urlfilenamelength++;
   
   urldata->urlfilename = AllocMem( urldata->urlfilenamelength, MEMF_CLEAR|MEMF_PUBLIC );
   if( urldata->urlfilename==0 )
   {
      FreeMem( urldata->urlname, urldata->urlnamelength );
      FreeMem( urldata, sizeof( struct namedata ) );
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( 0 );
   }
   
   sprintf( urldata->urlfilename, "%s", tempstring );
   
   phrasestring( &surl, urldata->urlname );
   
   urldata->port=surl.port;
   
   
   /**/
   while( surl.type[urldata->typenamelength]!=0 )
      urldata->typenamelength++;
   urldata->typenamelength++;
   
   urldata->typename = AllocMem( urldata->typenamelength, MEMF_CLEAR|MEMF_PUBLIC );
   if( urldata->typename==0 )
   {
      FreeMem( urldata->urlname, urldata->urlnamelength );
      FreeMem( urldata->urlfilename, urldata->urlfilenamelength );
      FreeMem( urldata, sizeof( struct namedata ) );
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( 0 );
   }
   
   sprintf( urldata->typename, "%s", surl.type );
   
   /**/
   
   /**/
   while( surl.host[urldata->hostnamelength]!=0 )
      urldata->hostnamelength++;
   urldata->hostnamelength++;
   
   urldata->hostname = AllocMem( urldata->hostnamelength, MEMF_CLEAR|MEMF_PUBLIC );
   if( urldata->hostname==0 )
   {
      FreeMem( urldata->typename, urldata->typenamelength );
      FreeMem( urldata->urlname, urldata->urlnamelength );
      FreeMem( urldata->urlfilename, urldata->urlfilenamelength );
      FreeMem( urldata, sizeof( struct namedata ) );
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( 0 );
   }
   
   sprintf( urldata->hostname, "%s", surl.host );
   
   /**/
   
   /**/
   while( surl.pathfilename[urldata->pathnamelength]!=0 )
      urldata->pathnamelength++;
   urldata->pathnamelength++;
   
   urldata->pathname = AllocMem( urldata->pathnamelength, MEMF_CLEAR|MEMF_PUBLIC );
   if( urldata->pathname==0 )
   {
      FreeMem( urldata->hostname, urldata->hostnamelength );
      FreeMem( urldata->typename, urldata->typenamelength );
      FreeMem( urldata->urlname, urldata->urlnamelength );
      FreeMem( urldata->urlfilename, urldata->urlfilenamelength );
      FreeMem( urldata, sizeof( struct namedata ) );
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( 0 );
   }
   
   sprintf( urldata->pathname, "%s", surl.pathfilename );
   
   /**/

   
   if( mmpoint->numberurldata==0 )
   {
      mmpoint->firsturldata=urldata;
      mmpoint->numberurldata++;
      debug( printf( "1: %s\n", urldata->urlname ); );
      Forbid();
      mmpoint->namedatainuse=FALSE;
      Permit();
      return( urldata );
   }
   
   
   debug( printf("2:\n"); );
   
   mmpoint->numberurldata++;
   if( mmpoint->firsturldata==urldatatest )
   {
      if( compresult==1 )
      {
         urldata->next=mmpoint->firsturldata;
         mmpoint->firsturldata=urldata;
         debug( printf("test1\n"); );
      }
      else
      {
         urldata->next=urldatatest->next;
         urldatatest->next=urldata;
         debug( printf("test2\n"); );
      }
   }
   else
   {
      urldata->next=urldatamin->next;
      urldatamin->next=urldata;
      debug( printf("test3\n"); );
   }
   
   urldatatest=mmpoint->firsturldata;
   while( urldatatest!=0 )
   {
      debug( printf( "%s\n", urldatatest->urlname ); );
      urldatatest=urldatatest->next;
   }
   
   debug( printf("---\n"); );
   
   Forbid();
   mmpoint->namedatainuse=FALSE;
   Permit();
   return( urldata );
   
}

