Example #1
0
yylex() {
	static int ifdef=0;
	static char *op2[]={"||",  "&&" , ">>", "<<", ">=", "<=", "!=", "=="};
	static int  val2[]={OROR, ANDAND,  RS,   LS,   GE,   LE,   NE,   EQ};
	static char *opc="b\bt\tn\nf\fr\r\\\\";
	extern char fastab[];
	extern char *outp,*inp,*newp; extern int flslvl;
	register char savc, *s; char *skipbl(); int val;
	register char **p2;
	struct symtab {
		char *name;
		char *value;
	} *sp, *lookup();

for (;;) {
	extern int passcom;		/* this crap makes #if's work */
	int opt_passcom = passcom;	/* even with -C option */
	passcom = 0;			/* (else comments make syntax errs) */
	newp=skipbl(newp);
	passcom = opt_passcom;		/* nb: lint uses -C so its useful! */
	if (*inp=='\n') return(stop);	/* end of #if */
	savc= *newp; *newp='\0';
	for (p2=op2+8; --p2>=op2; )	/* check 2-char ops */
		if (0==strcmp(*p2,inp)) {val=val2[p2-op2]; goto ret;}
	s="+-*/%<>&^|?:!~(),";	/* check 1-char ops */
	while (*s) if (*s++== *inp) {val= *--s; goto ret;}
	if (*inp<='9' && *inp>='0') {/* a number */
		if (*inp=='0') yylval= (inp[1]=='x' || inp[1]=='X') ?
			tobinary(inp+2,16) : tobinary(inp+1,8);
		else yylval=tobinary(inp,10);
		val=number;
	} else if (isid(*inp)) {
		if (0==strcmp(inp,"defined")) {ifdef=1; ++flslvl; val=DEFINED;}
		else {
			sp=lookup(inp,-1); if (ifdef!=0) {ifdef=0; --flslvl;}
			yylval= (sp->value==0) ? 0 : 1;
			val=number;
		}
	} else 	if (*inp=='\'') {/* character constant */
		val=number;
		if (inp[1]=='\\') {/* escaped */
			char c; if (newp[-1]=='\'') newp[-1]='\0';
			s=opc;
			while (*s) if (*s++!=inp[2]) ++s; else {yylval= *s; goto ret;}
			if (inp[2]<='9' && inp[2]>='0') yylval=c=tobinary(inp+2,8);
			else yylval=inp[2];
		} else yylval=inp[1];
	} else if (0==strcmp("\\\n",inp)) {*newp=savc; continue;}
	else {
		*newp=savc; pperror("Illegal character %c in preprocessor if", *inp);
		continue;
	}
ret:
	*newp=savc; outp=inp=newp; return(val);
}
}
main()
{
      double p=653,q=751,N=p*q; //N=368292653
     // double p=2,q=3,N=p*q;
      double temp,x=313599//,temp;
      short msg=101,i,y;
      tobinary(msg);printf("Original Message: \n");
      for(i=0;i<16;i++)
                 printf("%d   ",arr[i]);    
      
      printf("\n\nEncrypted Message: \n");
      for(i=15;i>=0;i--)
       {
               // srand(NULL);
            
                y=yrange[rand()%7]; 
                //y=3;
                printf("\ny= %d     ",y);
                c[i]=fmod((pow(y,2)*pow(x,arr[i])),N); 
                printf("%ld ",c[i]);
       }        
      printf("\n\nDecrypted Message:  \n");
       //decryption  
     
     for(i=0;i<16;i++)
       {
                temp=c[i];        
                printf("%d   ",legendre(temp,p)); 
                
       }
      printf("\n\n\n");
      system("pause"); 
}     
std::ostream& operator << ( std::ostream& stream, 
                            const flowgraph::node* n )
{
   stream << tobinary( (void*) n ) << " :    ";

   if( n -> ins )
      stream << * ( n -> ins );
   else
      stream << "    ";

   stream << "       [ ";
   for( std::list< flowgraph::node* > :: const_iterator
           p = n -> succ. begin( );
           p != n -> succ. end( );
           ++ p )
   {
      if( p != ( n -> succ. begin( ))) 
         stream << ", ";
      stream << tobinary( (void*) *p ); 
   }
   stream << " ]"; 

#if 0
   stream << ", back[ ";
   for( std::list< flowgraph::node* > :: const_iterator
           p = n -> pred. begin( );
           p != n -> pred. end( );
           ++ p )
   {
      if( p != ( n -> pred. begin( )))
         stream << ", ";
      hexprint( stream, (void*) *p ); 
   }
   stream << " ]";
#endif

   return stream; 
}
std::ostream& operator << ( std::ostream& stream, const flowgraph& g ) 
{
   stream << "Flowgraph: \n";
   stream << "-----------------------------------\n";

   flowgraph::printer pp( stream );


   // A const_cast is necessary, because I didn't want to make
   // two visitors:

   flowgraph::visitnodes( pp, const_cast< flowgraph::node* > ( & (g.b)), 
                              & (g.e) ); 

   stream << "\n";
   stream << "(Endnode = " << tobinary( (void*) ( &g. e )) << ")\n";
   return stream;
}
std::ostream& operator << ( std::ostream& stream, flowgraph::const_iterator it )
{
   stream << tobinary( (void*) it. n );
   return stream;
}
void tokenizer::scan( )
{

   // First we ignore whitespace:

   while( r. lookahead == ' ' || r. lookahead == '\n' ||
          r. lookahead == '\t' )
   {
      r. moveforward( );
   }

   if( r. lookahead == EOF || r. lookahead == '#' )
   {
      lookahead. push_back( tkn_EOF );
      return;
   }

   if( r. lookahead == ':' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_COLON );
      return;
   }
   
   if( r. lookahead == ';' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_SEMICOLON );
      return;
   }

   if( r. lookahead == '?' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_QUESTIONMARK );
      return;
   }

   if( r. lookahead == ',' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_COMMA );
      return;
   }

   if( r. lookahead == '|' )
   {
      r. moveforward( );
      if( r. lookahead == '|' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_OR );
         return;
      }
      lookahead. push_back( tkn_SCANERROR );
      return;
   }

   if( r. lookahead == '&' )
   {
      r. moveforward( );
      if( r. lookahead == '&' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_AND );
         return;
      }
      lookahead. push_back( tkn_ADDRESSOF );
      return;
   }

   if( r. lookahead == '+' )
   {
      r. moveforward( );
      if( r. lookahead == '+' )
      {
         r. moveforward( ); 
         lookahead. push_back( tkn_PLUSPLUS );
         return;
      } 
      lookahead. push_back( tkn_PLUS );
      return;
   }

   if( r. lookahead == '-' )
   {
      r. moveforward( );
      if( r. lookahead == '-' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_MINUSMINUS );
         return;
      }
 
      if( r. lookahead == '>' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_ARROW );
         return;
      }

      lookahead. push_back( tkn_MINUS );
      return;
   }

   if( r. lookahead == '*' )
   {
      lookahead. push_back( tkn_TIMES );
      r. moveforward( );
      return; 
   }

   if( r. lookahead == '/' )
   {
      lookahead. push_back( tkn_DIVIDES );
      r. moveforward( );
      return;
   }

   if( r. lookahead == '!' )
   {
      r. moveforward( ); 
      if( r. lookahead == '=' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_NOTEQUAL );
         return;
      }
      lookahead. push_back( tkn_NOT );
      return;
   }

   if( r. lookahead == '(' )
   {
      lookahead. push_back( tkn_LPAR );
      r. moveforward( );
      return; 
   }

   if( r. lookahead == ')' )
   {
      lookahead. push_back( tkn_RPAR );
      r. moveforward( );
      return; 
   }

   if( r. lookahead == '[' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_LSQPAR );
      return;
   }

   if( r. lookahead == ']' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_RSQPAR );
      return;
   }

   if( r. lookahead == '{' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_LCURLY );
      return;
   }

   if( r. lookahead == '}' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_RCURLY );
      return;
   }

   if( r. lookahead == '=' )
   {
      r. moveforward( );
      if( r. lookahead == '=' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_EQUAL );
         return;
      }
      lookahead. push_back( tkn_ASSIGN );
      return; 
   }

   if( r. lookahead == '<' )
   {
      r. moveforward( );
      if( r. lookahead == '=' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_LESSEQUALTHAN );
         return;
      }
      lookahead. push_back( tkn_LESSTHAN );
      return;
   }

   if( r. lookahead == '>' )
   {
      r. moveforward( );
      if( r. lookahead == '=' )
      {
         r. moveforward( );
         lookahead. push_back( tkn_GREATEREQUALTHAN );
         return;
      }
      lookahead. push_back( tkn_GREATERTHAN );
      return;
   }

   if( r. lookahead == '.' )
   {
      r. moveforward( );
      lookahead. push_back( tkn_DOT );
      return;
   }

   if( r. lookahead == '\'' )
   {
      r. moveforward( );
      if( r. lookahead != '\'' && r. lookahead != '\n' && r. lookahead != EOF )
      {
         char c = r. lookahead; 
         r. moveforward( );
         {
            if( r. lookahead == '\'' )
            {
               r. moveforward( );
               lookahead. push_back( tkn_NUMBER );
               lookahead. back( ). ct. push_back( 
                  ctree( tobinary( c ),
                         ctype( type_prim, identifier( { "char" } ))));
               return;
            }
         }
      }
      lookahead. push_back( tkn_SCANERROR );
      return;
   }
  
   if( isletter( r. lookahead ) || r. lookahead == '_' )
   {
      std::string attr; 

      attr. push_back( r. lookahead );  
      r. moveforward( );

      while( isletter( r. lookahead ) || isdigit( r. lookahead ) ||
             r. lookahead == '_' )
      {
         attr. push_back( r. lookahead ); 
         r. moveforward( );
      }

      if( attr == "true" )
      {
         lookahead. push_back( tkn_NUMBER );
         lookahead. back( ). ct. push_back(
            ctree( tobinary( true ),
                   ctype( type_prim, identifier( { "bool" } ))));
         return; 
      }

      if( attr == "false" )
      {
         lookahead. push_back( tkn_NUMBER );
         lookahead. back( ). ct. push_back(
            ctree( tobinary( false ),
                   ctype( type_prim, identifier( { "bool" } ))));
         return;
      }

      if( attr == "while" )
      {
         lookahead. push_back( tkn_WHILE );
         return;
      }

      if( attr == "if" )
      {
         lookahead. push_back( tkn_IF );
         return;
      }

      if( attr == "then" )
      {
         lookahead. push_back( tkn_THEN );
         return;
      }

      if( attr == "else" )
      {
         lookahead. push_back( tkn_ELSE );
         return;
      }

      if( attr == "return" )
      {
         lookahead. push_back( tkn_RETURN );
         return;
      }
 
      lookahead. push_back( tkn_IDENTIFIER );
      lookahead. back( ). ct. push_back( 
            ctree( identifier( { attr } ), ctype( type_unknown )));
         // Type will be determined at lookup, which is done during 
         // type checking.
      return;
   }

   // We can only recognize positive numbers, because of
   // scanning conflicts with - .

   if( isdigit( r. lookahead ))
   {
      std::string s;
         // We keep the string, so that we can put it in 
         // a scanerror, if necessary.

      bool canbeint = true; 
         // If we see a . or an exponent, we set it to false.

      double val = 0.0;
      while( isdigit( r. lookahead ))
      {
         val = val * 10.0 + ( r. lookahead - '0' );

         s += r. lookahead; 
         r. moveforward( ); 
      }

      if( r. lookahead == '.' )
      { 
         canbeint = false; 
         double pos = 0.1;

         s += r. lookahead;
         r. moveforward( );

         if( !isdigit( r. lookahead ))
         {
            s += r. lookahead;
            r. moveforward( );

            lookahead. push_back( tkn_SCANERROR );
            lookahead. back( ). reason. push_back(s);
            return;
         }
 
         while( isdigit( r. lookahead ))
         {
            val += pos * ( r. lookahead - '0' );
            pos /= 10.0;

            s += r. lookahead;
            r. moveforward( );
         }
      }

      if( r. lookahead == 'e' || r. lookahead == 'E' )
      {
         canbeint = false;

         unsigned int ee = 0;
         int polarity = 1;

         s += r. lookahead;
         r. moveforward( );

         if( r. lookahead == '+' || r. lookahead == '-' )
         {
            if( r. lookahead == '-' )
               polarity = -1;   
    
            s += r. lookahead;
            r. moveforward( );
         }

         if( !isdigit( r. lookahead ))
         {
            s += r. lookahead;
            r. moveforward( );

            lookahead. push_back( tkn_SCANERROR );
            lookahead. back( ). reason. push_back(s);
            return;
         }

         while( isdigit( r. lookahead ))
         {
            ee = ee * 10 + ( r. lookahead - '0' );
            
            s += r. lookahead;
            r. moveforward( );
         }

         // We need to put val = val * 10^( polarity * ee ):

         // Is this efficient? Probably not, but it is simple. 

         if( polarity == 1 )
         {
            while( ee )
            { 
               val *= 10.0;
               -- ee;
            }
         }
         else
         {
            while( ee )
            {
               val /= 10.0;
               -- ee;
            }
         }

      }

      lookahead. push_back( tkn_NUMBER );

      if( !canbeint || floor( val ) != val || val > (double) INT_MAX )
      {
         lookahead. back( ). ct. push_back( 
            ctree( tobinary( val ),
                   ctype( type_prim, identifier( { "double" } ))));
         return; 
      }

      if( val == 0.0 || val == 1.0 )
      {  
         lookahead. back( ). ct. push_back(
            ctree( tobinary( val == 1.0 ),
                   ctype( type_prim, identifier( { "bool" } ))));
         return;
      }

      if( val < 256 ) 
      {  
         lookahead. back( ). ct. push_back(
            ctree( tobinary( static_cast< char > ( val )),
                   ctype( type_prim, identifier( { "char" } ))));
          return;
      }

      // Remaining case is just int:

      lookahead. back( ). ct. push_back(
         ctree( tobinary( static_cast< int > ( val )),
                ctype( type_prim, identifier( { "int" } ))));
           
      return;
   } 

   // If we could not recognize anything, then we produce
   // a scan error.

   lookahead. push_back( tkn_SCANERROR );

   std::string s;
   if( r. lookahead != EOF )
   { 
      s += r. lookahead;  
      r. moveforward( );
         // It is important that we always advance the reader,
         // because otherwise the tokenizer hangs.
   }
   else
   {
      s += "eof";   // This should actually be unreachable, because
                    // EOF is checked in the beginning. 
   }
   lookahead. back( ). reason. push_back(s);
   return;  
}
int main(int argc,char *argv[])
 {int a,l,b1,b2,ch;
l=strlen(argv[3]);
char *in=argv[3];
       b1=atoi(argv[1]);
       b2=atoi(argv[2]);
if((b1==2)&&(b2==8))
ch=1;
else if((b1==2)&&(b2==10))
ch=2;
else if((b1==2)&&(b2==16))
ch=3;
else if((b1==8)&&(b2==2))
ch=4;
else if((b1==8)&&(b2==10))
ch=5;
else if((b1==8)&&(b2==16))
ch=6;
else if((b1==10)&&(b2==2))
ch=7;
else if((b1==10)&&(b2==8))
ch=8;
else if((b1==10)&&(b2==16))
ch=9;
else if((b1==16)&&(b2==2))
ch=10;
else if((b1==16)&&(b2==8))
ch=11;
else if((b1==16)&&(b2==10))
ch=12;
else if((b1==2)&&(b2==2))
    ch=13;
else if((b1==8)&&(b2==8))
    ch=14;
else if((b1==10)&&(b2==10))
    ch=15;
else if ((b1==16)&&(b2==16))
    ch=16;
switch(ch)
{
case 1:
    b1=2;b2=8;
    a=checkbi(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");

}break;
case 2:
    b1=2,b2=10;
    a=checkbi(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
          else {printf("0");

}break;
case 3:
    b1=2;
    a=checkbi(in,l);
    if(a==1)
        tohex(in,b1,l);
        else {printf("0");

}break;
case 4:
    b1=8,b2=2;
    a=checkoct(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");

}break;
case 5:
    b1=8,b2=10;
    a=checkoct(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");

}break;
case 6:
    b1=8;
    a=checkoct(in,l);
    if(a==1)
        tohex(in,b1,l);
        else {printf("0");
}break;
case 7:
    b1=10,b2=2;
    a=checkdeci(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
         else {printf("0");
}break;
case 8:
    b1=10,b2=8;
    a=checkdeci(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
          else {printf("0");
}break;
case 9:
    b1=10;
    a=checkdeci(in,l);
    if(a==1)
        tohex(in,b1,l);
        else {printf("0");
}break;

case 10:
    b1=16,b2=2;
    a=checkhex(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");
}break;

case 11:
    b1=16,b2=8;
    a=checkhex(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");
}break;
case 12:
    b1=16,b2=10;
    a=checkhex(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");
}break;

case 13:
    b1=2,b2=2;
    a=checkbi(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");
}break;

case 14:
    b1=8,b2=8;
    a=checkoct(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
         else {printf("0");
}break;
case 15:
    b1=8,b2=8;
    a=checkdeci(in,l);
    if(a==1)
        tobinary(in,b1,b2,l);
        else {printf("0");
}break;
case 16:
    b1=16;
    a=checkhex(in,l);
    if(a==1)
        tohex(in,b1,l);
        else {printf("0");
}break;

}
printf("\n");
return 0;
}