/*
  Esteganografia (Steganography)

  Language: C

  Author: Tulio Faria - www.tuliofaria.net

*/
#include "stdio.h"
#include "math.h"
main(npa,params)
  int npa;
  char *params[];
{
  FILE *destfile,*thedata;
  int ch=0;
  int nChar1, nChar2;
  int k,i, CC, index, resto;
  int cont = 0;
  int vcasa;
//npa = 4;
  if (npa==4){

  char alfabeto[3];
  int tamAlfabeto = 3;
  int nBits = 6;

  alfabeto[0] =    0;
  alfabeto[1] =   32;
  alfabeto[2] = 160;

  // texto que vai abrigar a mensagem
  thedata = fopen( params[1], "r" );
  destfile = fopen(params[2], "w");

//  thedata = fopen( "texto puro.txt", "r" );
//  destfile = fopen("texto com msg.txt", "w");
   char mensagem[100];
   FILE *origem = fopen(params[3], "r");
   if (origem==NULL){
      printf("arquivo com msg invalido!");
      system("pause");
      exit(1);
   }
    i = 0;
    while ( (ch = getc(origem)) != EOF ){ 
      mensagem[i] = ch;
      i++;
    }
    mensagem[i] = '\n';

//   char mensagem[100] = "auditoria";

   //strcpy(mensagem, params[3]);
   char mensagemC[100];
    
   for(i=0; i<100;i++){
      mensagemC[i] = 0;
   }

   if (thedata != NULL ){
       // descobrindo quanto de informacao poder guardar...
       while ( (ch = getc(thedata)) != EOF ){ 
            if (ch==32)
              cont++;
         }

       // verificando se o texto comporta a mensagem
       if ((cont/nBits)<(strlen(mensagem)+1)*6){
          printf("Voce precisa de no minimo %d espacos no arquivo.\n", cont/nBits);
          system("pause");
          exit(1);
       }

       // codificando a mensagem em caracteres: 0, 1 e 2
       for(i=0; i<strlen(mensagem); i++){
          //printf("char: %c [%d]\n", mensagem[i],mensagem[i]);
          CC = mensagem[i];
          for(k=nBits-1; k>=0;k--){
             // resto = valor do bit
             vcasa = pow(tamAlfabeto, k);
             resto = CC % vcasa;  // assume K > 1
             CC    = CC / vcasa;  // integer division
             //printf("%d ", CC);
             mensagemC[i*nBits+k] = alfabeto[CC];
             CC = resto;
          }
          //printf("\n");
       }
       // marcando o fim da mensagem
      for(k=nBits-1; k>=0;k--){
         mensagemC[i*nBits+k] = alfabeto[2];
      }
       //printf("%d  %s %d", i*nBits+k+1, &mensagemC, '\0');
        //printf("Teste: %d   ", strlen(mensagem));
       // colocando a mensagem codificada no texto real
        rewind(thedata);
        i = 0;
        while ( (ch = getc(thedata)) != EOF ){ 
            if ((ch==32)&&(i<strlen(mensagem)*7)){
              //printf("[%d] %d ", i,mensagemC[i]);
              putc(mensagemC[i], destfile);
              i++;
            }else{
              //printf("%c", ch);
              putc(ch, destfile);
            }
         }
       putc('\0', destfile);
       printf("Mensagem escondida com sucesso!\n");
       fclose(thedata);
       fclose(destfile);    
       
   }else{
       printf("\nerro ao abrir o arquivo..\n");
   }
       // printf("Total de espacos: %d", cont);
   }else{
      printf("\nParametros invalidos.\n\nExecute da seguinte maneira:\n escrevertexto.exe <nome do texto puro> <arquivo de destino> <arquivo com mensagem>\n\n ");
   }
      system("pause");
}
