Guest User

BRAINFUCK_ASCII_ART_CONVERTER

a guest
Dec 23rd, 2013
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.38 KB | None | 0 0
  1. /* BF:BRAINFUCK_ASCII_ART_CONVERTER 2013-12-23 v1.0      *
  2.  * file:main.c                                           *
  3.  * Compile:gcc -o BFConverter main.c                     *
  4.  * gcc(1):http://gcc.gnu.org/releases.html               *
  5.  * gcc(2):http://www.bloodshed.net/download.html         *
  6.  * BF generator:http://brainfuck.tk/                     *
  7.  * Credits:w2ch.org-Anon                                 */
  8.  
  9.  
  10. #include <stdio.h> //FILE, fopen(), fprintf(), fclose(), perror()
  11.  
  12.  
  13. void CalculateSmallesValueToGetNumber(char*, char*, char*, char unsigned);
  14.  
  15.  
  16. char unsigned strASCIITable[256]; /* all ASCII char */ //this is global because all need to be 0 in the str
  17. //NOTE:Shall it not be '+' instead of "+"???
  18. //fputc('>', fpOutput); - ???????
  19.  
  20.  
  21. int main(int argc, char **argv)
  22. {
  23.     if(argc!=3)
  24.     {
  25.         fprintf(stderr, "Usage:%s output.txt input.txt\n", argv[0]);
  26.         return 0;
  27.     }
  28.    
  29.    
  30.     FILE *fpOutput, *fpInput;
  31.    
  32.     fpOutput = fopen(argv[1],"a");
  33.     if(fpOutput==NULL)
  34.     {
  35.         perror("Error opening file"); //fprintf(stderr, "ERORR0!:output.txt(%s) could not be open\n", argv[1]);
  36.         return 1;
  37.     }
  38.     fpInput = fopen(argv[2],"r");
  39.     if(fpInput==NULL)
  40.     {
  41.         if(fclose(fpOutput)==EOF) fprintf(stderr, "ERORR2!:fclose(%s) failed\n", argv[1]); //perror ?
  42.         perror("Error opening file"); //fprintf(stderr, "ERORR1!:input.txt(%s) could not be open\n", argv[2]);
  43.         return 1;
  44.     }
  45.    
  46.     /* ---------------------------------------------------------------------- */
  47.     char unsigned cBrainFuckInputCharecter;
  48.     char unsigned cX, cY;
  49.     char signed cOverflow;
  50.    
  51.     char unsigned cPosision=0;
  52.    
  53.     //Extra for displaying values for debuging
  54.     //for(cBrainFuckInputCharecter=1; cBrainFuckInputCharecter!=75; ++cBrainFuckInputCharecter) CalculateSmallesValueToGetNumber(&cX, &cY, &cOverflow, cBrainFuckInputCharecter);
  55.     //CalculateSmallesValueToGetNumber(&cX, &cY, &cOverflow, cBrainFuckInputCharecter);
  56.    
  57.     while((cBrainFuckInputCharecter=(char unsigned)fgetc(fpInput))!=(char unsigned)EOF)
  58.     {
  59.         for(cOverflow=0; strASCIITable[cOverflow]!=cBrainFuckInputCharecter && strASCIITable[cOverflow]!=0; ++cOverflow);
  60.        
  61.         if(strASCIITable[cOverflow])
  62.         {
  63.             if(cPosision!=cOverflow)
  64.             {
  65.                 if(cPosision>cOverflow) for (;cPosision>cOverflow; --cPosision) fprintf(fpOutput, "<");
  66.                 else for(;cPosision<cOverflow; ++cPosision) fprintf(fpOutput, ">");
  67.             }
  68.         }
  69.         else
  70.         {
  71.             for(;cPosision<cOverflow; ++cPosision) fprintf(fpOutput, ">");
  72.             strASCIITable[cOverflow]=cBrainFuckInputCharecter;
  73.            
  74.             CalculateSmallesValueToGetNumber(&cX, &cY, &cOverflow, cBrainFuckInputCharecter);
  75.             if(cX)
  76.             {
  77.                 fprintf(fpOutput, ">"); //e.g:>+++[<+++++>-]<+
  78.                 while(cX--) fprintf(fpOutput, "+");
  79.                 fprintf(fpOutput, "[<");
  80.                 while(cY--) fprintf(fpOutput, "+");
  81.                 fprintf(fpOutput, ">-]<"); //NOTE:I never counted on that last '<'!
  82.             }
  83.             if(cOverflow>=0) while(cOverflow--) fprintf(fpOutput, "+");
  84.             else while(cOverflow++) fprintf(fpOutput, "-");
  85.         }
  86.        
  87.         fprintf(fpOutput, ".");
  88.     }
  89.    
  90.     /* ---------------------------------------------------------------------- */
  91.    
  92.     if(fclose(fpOutput)==EOF || fclose(fpInput)==EOF) fprintf(stderr, "ERORR3!:fclose(%s) or fclose(%s) failed\n", argv[1], argv[2]);
  93.     return 0;
  94. }
  95.  
  96.  
  97. void CalculateSmallesValueToGetNumber(char *cX, char *cY, char *cRest, char unsigned cNumberToCalculate) //NOTE:This function you can make better like value 57(+1 instead of +2) but that I will do later version!
  98. {
  99.     char unsigned cXMax=0, cYMax=0;
  100.     char unsigned cXMaxOneDown=0, cYMaxOneDown=0;
  101.     char signed cOverflow=0; //need not to be unsigned as it must be minus to say how many steps we need to "walk" to get to cNumberToCalculate, NOTE:This must be from range -16 to +16(32 numbers in tottal) as the max value of cXMax is 16. More info you find in math!
  102.    
  103.     //Extra for displaying values for debuging
  104.     //fprintf(stdout, "cNumberToCalculate:%d\n", (int)cNumberToCalculate);
  105.    
  106.     if(cNumberToCalculate>14) // step0:Is it bigger then 14?
  107.     {
  108.         //step1:What range is it max?
  109.         for(cXMax=8; ((cYMax=(cXMax/2))*(cXMax-cYMax)) < cNumberToCalculate; cXMax++); //need to start at 8 as 7 is below(14-6/2=7/2) making it go faster! NOTE:cYMax is being handeled like overflow!
  110.         cXMax=cXMax-cYMax;
  111.        
  112.         //step1.5:Adjust cXMax and cYMax rang and add cXMaxOneDown and cYMaxOneDown range
  113.         for(;(((cXMax*cYMax)-cNumberToCalculate) > 0); cXMax+=1, cYMax-=1);
  114.         cXMaxOneDown=cXMax-1; //2nd time to "adjust"
  115.         cYMaxOneDown=cYMax+1;
  116.        
  117.         //step2:Minus or Plus for overflow
  118.         if(!((cXMax*cYMax)-cNumberToCalculate)) ;
  119.         else
  120.         {
  121.             if((((cXMax*cYMax)-cNumberToCalculate) < (cNumberToCalculate-(cXMaxOneDown*cYMaxOneDown)))) cOverflow=cNumberToCalculate-(cXMaxOneDown*cYMaxOneDown);
  122.             else cOverflow=cNumberToCalculate-(cXMax*cYMax);
  123.         }
  124.        
  125.         //Extra for displaying values for debuging nothing more here!
  126.         //fprintf(stdout, "Start:%d\tcXMax(%d)*cYMax(%d)=%d\nStart:%d\tcXMaxOneDown(%d)*cYMaxOneDown(%d)=%d\n", (int)(cXMax+cYMax), (int)cXMax, (int)cYMax, (int)(cXMax*cYMax), (int)(cXMaxOneDown+cYMaxOneDown), (int)cXMaxOneDown, (int)cYMaxOneDown, (int)(cXMaxOneDown*cYMaxOneDown));
  127.     }
  128.     else cOverflow=cNumberToCalculate;
  129.    
  130.     //Extra for displaying values for debuging
  131.     //fprintf(stdout, "cOverflow:%d\n", (int)cOverflow);
  132.    
  133.     if(cNumberToCalculate==((cXMaxOneDown*cYMaxOneDown)+cOverflow)) //return value for function
  134.     {
  135.         *cX=cXMaxOneDown;
  136.         *cY=cYMaxOneDown;
  137.     }
  138.     else
  139.     {
  140.         *cX=cXMax;
  141.         *cY=cYMax;
  142.     }
  143.     *cRest=cOverflow;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment