quarta-feira, 25 de julho de 2012

C Sample Code

#include
#include
#include
#include
#include
#include
#include
#define EQUATION_SIZE 10
#define EQUATION_SIZE_MIN 4
#define NAME_SIZE 3 //A22 3 PARA DADOS 2 1 PARA O \0
#define MSG_ERROR  "[ error ] - "
#define MSG_SUCESS "[ sucess] - "
#define MSG_INPUT  "[ input ] - "
#define MSG_STATUS "[ status] - "
#define MSG_BUSY   "[ busy  ] - "
#define LAPUINKA   "written by Lapuinka, Fabio"
struct cell
{
 char name    [NAME_SIZE];          //nome da celula p.e A1,B34
 char equation [EQUATION_SIZE];      //p.e 10/*b2
 cell *next;
 cell *back;
}list_entry;

//funcoes de alocacao
cell *New   (char *Aname,char *Aequation);
int  Del    (cell **idx);
//funcoes de interface
char menu(cell **Astart);
int  read_cellname (char *Aname);
void janela(int x1,int x2,int y1,int y2,int tempo);
//funcoes de manipulacao de dados
int  Insert  (cell **Astart,cell **Alast,cell **ACell);
int  Delete  (cell **Astart,cell **Alast,cell **ACell);
int  Edit    (cell **ACell);
cell *Search (cell **Astart,char *Aname);
int  Select   (cell **Astart);
int  ViewSheet(cell **Astart);
//funcoes miscelaneas
int  calcula_indice(char *Aname);
int  calcula_nome(int Aindice,char *Aname);
int Leia(char *szPalavra,int AMin,int AMax);
void msgbox(char *msg)
{
 janela(1,31,1,31,0);
}
int c=5,l=5;
void main(void)
{
 cell *start; // primeiro elemento da lista
 cell *last;  // ultimo elemento da lista
 cell *idx;   // celula temporia
 char name[NAME_SIZE]    ={'\0'};
 char equation[EQUATION_SIZE]={'\0'};
 int continua=1;
 int indice=0;
 int itotal=0;
 int c=5,l=5;
 start=NULL;
 last =NULL;
 textcolor(LIGHTGRAY);
 textbackground(BLACK);

 /*
 COLORS (text mode)
 ßßßßßßßßßßßßßßßßßßß³Back-³Fore-
 Constant     ³Value³grnd?³grnd?
 ÍÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍ
 BLACK        ³  0  ³ Yes ³ Yes
 BLUE         ³  1  ³ Yes ³ Yes
 GREEN        ³  2  ³ Yes ³ Yes
 CYAN         ³  3  ³ Yes ³ Yes
 RED          ³  4  ³ Yes ³ Yes
 MAGENTA      ³  5  ³ Yes ³ Yes
 BROWN        ³  6  ³ Yes ³ Yes
 LIGHTGRAY    ³  7  ³ Yes ³ Yes
 DARKGRAY     ³  8  ³ No  ³ Yes
 LIGHTBLUE    ³  9  ³ No  ³ Yes
 LIGHTGREEN   ³ 10  ³ No  ³ Yes
 LIGHTCYAN    ³ 11  ³ No  ³ Yes
 LIGHTRED     ³ 12  ³ No  ³ Yes
 LIGHTMAGENTA ³ 13  ³ No  ³ Yes
 YELLOW       ³ 14  ³ No  ³ Yes
 WHITE        ³ 15  ³ No  ³ Yes
 ÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄ
 BLINK        ³128  ³ No  ³ ***
 */
 do
 {
  itotal=ViewSheet(&start);
  switch(menu(&start))
  {
   case 'I':
   {

    indice=read_cellname(name);
    if(indice==-1)
    {
     break;
    }
    else
    {
     calcula_nome(indice,name);
     idx = Search(&start,name);
     if(idx==NULL)
     {
      idx = New(name,equation);
      if(idx==NULL)
      {
      break;
      }
      Insert(&start,&last,&idx);
      Edit(&idx);
     }
     else
     {
      gotoxy(c,l++);printf("%snome duplicado",MSG_ERROR);
      getche();
     }
    }
    continua=1;
   }
   break;
   case 'E':
   {
    indice=read_cellname(name);
    if(indice==-1)
    {
     gotoxy(c,l++);printf("%sindice %d",MSG_ERROR,indice);
     getche();
    }
    else
    {
     calcula_nome(indice,name);
     idx = Search(&start,name);
     if(idx==NULL)
     {
     gotoxy(c,l++);printf("%sname=%s not found"  ,MSG_ERROR,name);
     getche();
     break;
     }
     Edit(&idx);
    }
   }
   break;
   case 'X':
   {
   indice=read_cellname(name);
    if(indice==-1)
    {
     gotoxy(c,l++);printf("%sindice %d",MSG_ERROR,indice);
     getche();
    }
    else
    {
     calcula_nome(indice,name);
     idx = Search(&start,name);
     if(idx==NULL)
     {
     gotoxy(c,l++);printf("%sname=%s not found"  ,MSG_ERROR,name);
     getche();
     break;
     }
     Delete(&start,&last,&idx);
     getche();
    }
   }
   break;
   case 'V':
   {
    itotal=ViewSheet(&start);
    getch();
   }
   break;
   case 'S':
   {
    continua=0;
   }
   break;
  }

 }while(continua);
 clrscr();
 idx=start;
 if(idx!=NULL)
 {
  gotoxy(c,l++);printf("%sliberando memoria para o S.O...");
  while(idx!=NULL)
  {
   Delete(&start,&last,&idx);
   idx=start;
  }
 }

 gotoxy(c,l++);printf("%sHave a nice day...;-)",MSG_SUCESS);
 textcolor(LIGHTGRAY);
 textbackground(BLACK);
 getche();
}
void janela(int x1,int x2,int y1,int y2,int tempo)
{
 int cx,cy;
 unsigned register int x=0,y=0;
 clrscr();
 c=x1+5;
 l=y1+5;
 cx=x1+(x2-x1)/2;
 cy=y1+(y2-y1)/2;

 for(x=0;x {
  if(x>0)
  {
  for(y=0;y  {
   gotoxy(cx-x,cy-(y-1));printf("³ ");
   gotoxy(cx-x,cy+(y-1));printf("³ ");
   gotoxy(cx+x,cy-(y-1));printf(" ³²");
   gotoxy(cx+x,cy+(y-1));printf(" ³²");

   gotoxy(cx-(x),y1);printf("ÚÄ");
   gotoxy(cx+(x),y1);printf("Ä¿");
   gotoxy(cx-(x),y2);printf("ÀÄ");
   gotoxy(cx+(x),y2);printf("ÄÙ²");
   gotoxy(cx-(x),y2+1);printf("  ²");
   gotoxy(cx+(x),y2+1);printf("²²²");
   if(x==2)
   {
    gotoxy(cx,y2+1);printf("²");
   }
  }
  delay(tempo);
  }
  else
  {
  for(y=0;y  {
   gotoxy(cx,cy-y);printf("³");
   gotoxy(cx,cy+y);printf("³");
   delay(tempo*2);
  }

  }

 }
 gotoxy(x2-strlen(LAPUINKA),y2-2);printf(LAPUINKA);
}
char menu(cell **Astart)
{
 char op;

 c=5;
 l=35
 ;
 gotoxy(c+10,l++);printf("Menu de opcoes:");
 l++;
 gotoxy(c,l);printf("[(I)nserir>]");
 if(*Astart!=NULL)
 {
  gotoxy(c+=15,l);  printf("[e(X)cluir]");
  gotoxy(c+=15,l);  printf("[(E)ditar ]");
 }
 gotoxy(c+=15,l);   printf("[(S)air]");
 c=5;
 l+=2;
 while(1)
 {
  op=toupper(getch());
  if(*Astart!=NULL)
  {
   if(op=='I' || op=='E' || op=='X' || op=='S' )
   {
    return op;
    break ;
   }
  }
  else
  {
   if(op=='I' ||op=='S')
   {
    return op;
    break ;
   }
  }
 }

}
cell *New(char *Aname,char *Aequation)
{
 cell *tmp;
 tmp=(cell *)malloc(sizeof(cell)*1);
 if(tmp!=NULL)
 {
  tmp->next=NULL;
  tmp->back=NULL;
  tmp->name[0]='\0';
  tmp->equation[0]='\0';
  strcat(tmp->name,Aname);
  strcat(tmp->equation,Aequation);
 }
 else
 {
  gotoxy(5,50);printf("%sout of memory",MSG_ERROR);
 }
 return tmp;
}
int Del(cell **idx)
{
  free(*idx);
  *idx=NULL;
  return 1;
}
int Delete(cell **Astart,cell **Alast,cell **ACell)
{
  cell *idx; //indice para pesquisa
  if(*Astart==*Alast)//so tem um elemento, apaga
  {
   Del(Astart); //a funcao que libera memoria ja configura para NULL
   ACell=Alast=Astart;
   return 0; //no more!
  }
  else
  {
   //vamos tentar otimizar
   //o elemento esta nos pontas?
   if(*Astart==*ACell)
   {
     (*Astart)->next->back=NULL;
     *Astart=(*Astart)->next; //atualiza o comeco
     Del(ACell);
     return 1;
   }
   if(*Alast==*ACell)
   {
     (*Alast)->back->next=NULL;
     *Alast=(*Alast)->back; //atualiza o comeco
     Del(ACell);
     return 1;
   }
   //esta no meio, vamos ajeitar atualizar quem aponta para ele.
   (*ACell)->back->next= (*ACell)->next;
   (*ACell)->next->back= (*ACell)->back;
   Del(ACell);
     return 1;
  }
}
int Insert(cell **Astart,cell **Alast,cell **ACell)
{
 if(*Astart==NULL) //primeiro elemento
 {
  *Astart=*ACell;
  *Alast=*ACell;
  (*ACell)->next =NULL;
  (*ACell)->back=NULL;
 }
 else //ha mais elementos... insiro no final
 {
  (*Alast)->next=*ACell; //ligo os 2
  (*ACell)->back=*Alast;
  //atualizo o Last
  *Alast=*ACell;
 }
 return 1;
}

int read_cellname(char *Aname)
{
  register unsigned int i=0;
  char *p;
  p = Aname;
  gotoxy(c,l++);printf("%sCelula: (Ex: A1): ",MSG_INPUT);
  for(i=0;i  {
   if(i==0)
   {
    *p=64;
    do
    {
    if(*p<65 || *p>90)
    {
     *p=toupper(getch());
     if(*p==27)
      return -1;
    }
    else
    {
     printf("%c",*p);
     break;
    }
    }while(1);
   }
  else
  {
   *p=47;
   do
   {
    if(*p<48 || *p>57)
    {
      *p=toupper(getch());
     if(*p==27)
      return -1;
    }
    else
    {
      printf("%c",*p);
      break;
    }
   }while(1);
   }
   p++;
  }
 *p='\0';
 return calcula_indice(Aname);
}
cell  *Search (cell **Astart,char *Aname)
{
  cell *idx;
  //vamos tentar otimizar
  idx=*Astart;
  while(idx!=NULL)
  {
   if(!strcmp(idx->name,Aname))
    break;
   idx=idx->next;
  }
  return idx;
}
int  Edit   (cell **ACell)
{
  char op;
  if( ((*ACell)->equation=='\0') )
  {
   gotoxy(c,l++);printf("%s formula: ",MSG_INPUT);
   Leia((*ACell)->equation,EQUATION_SIZE_MIN,EQUATION_SIZE);
  }
  else
  {
   gotoxy(c,l++);printf("%sformula: %s ",MSG_STATUS,(*ACell)->equation);
   op=toupper(getche());
   switch(op)
   {
    case 'A':
    {
     gotoxy(c,l++);printf("%sformula: ",MSG_INPUT);
     Leia((*ACell)->equation,EQUATION_SIZE_MIN,EQUATION_SIZE);
     return 1;
    }

     return 0;
   }
  }

 return 1;
}

int Leia(char *szPalavra,int AMin,int AMax)
{
 int i     = 0;
 int ABORT = 0;
 char *szTmp  ;
 int iDesenhou=0;
 int iLeu=0;
 char *p;
 char ch = ' ';
 szTmp = (char *) malloc(AMax * (unsigned) sizeof(char));
 if(szTmp==NULL) return 0;
 *szTmp='\0';
 p=szTmp;
 while(1)
 {
 for(i=0;i {
  ch=getch();


  if(ch==27)
  {
   ABORT=1;
   break;
  }
  if(ch=='\r' && i>=AMin)
  {
    break;
  }
  if(ch=='\b')
  {
   if(i>0)
   {
    p--;
    *p='\0';
    printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b [%2.d -%2.d] %s ",i,AMax,(i>=AMin?"[OK] ":"(ESC)"));
    i-=2;
    continue;
   }
   else
   {
    if(iDesenhou)
     printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b [%2.d -%2.d] %s ",i+1,AMax,(i>=AMin?"[OK] ":"(ESC)"));
    i--;
    continue;
   }
  }

  if(ch=='\r')
  {
    i--;
    continue;
  }
  if(i>0 || iDesenhou)
  {
   printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%c [%2.d -%2.d] %s ",ch,i+1,AMax,(i>=AMin?"[OK] ":"(ESC)"));
  }
  else
  {
   iDesenhou=1;
   printf("%c [%2.d -%2.d] %s ",ch,i+1,AMax,(i>=AMin?"[OK] ":"(ESC)"));
  }

  *p=ch;
  *(p+1)='\0';
  p++;
 }
 p=szTmp;
 if(ABORT)
 {
  free(szTmp);
  *szPalavra='\0';
  return 0;
 }
  printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b [ENTER]      ");
  while(1) //espera o ENTER
  {
   ch=getch();
   if(ch=='\r')
   {
    iLeu=1;
    break;
   }
   if(ch=='\b')
    break;
   if(ch==27)
   {
       ABORT=1;
     break;
    }
  }
 if(ABORT)
 {
  free(szTmp);
  *szPalavra='\0';
  return 0;
 }
  if(iLeu)
   break;
    else
   {
   int z=0;
   for(z=0;z     printf("\b");
   for(z=0;z     printf(" ");
   for(z=1;z     printf("\b");


   }
 }

 printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b                ");
 *szPalavra='\0';
 strcat(szPalavra,szTmp);
 free(szTmp);
 return 1;

}
int  Select  (cell **Astart)
{
  cell *idx;
  int total=0;
  idx=*Astart;
  while(idx!=NULL)
  {
   printf("\nname=%20s idx=%4d  equation %20s ",idx->name,calcula_indice(idx->name),idx->equation);
   idx=idx->next;
   total++;
  }
 return total;
}
int  ViewSheet(cell **Astart)
{
  cell *idx;
  int total=0,x=0,y=0;
  char name[3];

  janela(1,75,1,41,1);
 /*
 COLORS (text mode)
 ßßßßßßßßßßßßßßßßßßß³Back-³Fore-
 Constant     ³Value³grnd?³grnd?
 ÍÍÍÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍ
 BLACK        ³  0  ³ Yes ³ Yes
 BLUE         ³  1  ³ Yes ³ Yes
 GREEN        ³  2  ³ Yes ³ Yes
 CYAN         ³  3  ³ Yes ³ Yes
 RED          ³  4  ³ Yes ³ Yes
 MAGENTA      ³  5  ³ Yes ³ Yes
 BROWN        ³  6  ³ Yes ³ Yes
 LIGHTGRAY    ³  7  ³ Yes ³ Yes
 DARKGRAY     ³  8  ³ No  ³ Yes
 LIGHTBLUE    ³  9  ³ No  ³ Yes
 LIGHTGREEN   ³ 10  ³ No  ³ Yes
 LIGHTCYAN    ³ 11  ³ No  ³ Yes
 LIGHTRED     ³ 12  ³ No  ³ Yes
 LIGHTMAGENTA ³ 13  ³ No  ³ Yes
 YELLOW       ³ 14  ³ No  ³ Yes
 WHITE        ³ 15  ³ No  ³ Yes
 ÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄ
 BLINK        ³128  ³ No  ³ ***
 */
  c=5;
  gotoxy(c,l++);
  for(x=65;x<=90;x++)
  {
   for(y=48;y<=57;y++)
   {
     name[0]=toupper(x);
     name[1]=toupper(y);
     name[2]='\0';
     idx = Search(Astart,name);
     if(idx==NULL)
     {
     textcolor(LIGHTGRAY);
     textbackground(BLACK);
      gotoxy(c+=5,l);printf(" %c%c ",x,y);
     }
     else
     {
     if(*idx->equation==NULL)
     {
      textcolor(BLINK);
      textbackground(RED);
     }
     else
      textbackground(BLUE);
     gotoxy(c+=5,l);cprintf("{%c%c}",x,y);
     }
   }
   c=5;
   gotoxy(c,l++);
  }
 return total;
}

int calcula_indice(char *Aname)
{
  register unsigned int i=0;
  char *p;
  int indice=0;
  p = Aname;
  for(i=0;i<(NAME_SIZE-1);i++)
  {
   if(i==0)
   {
    do
    {
    if(*p<65 || *p>90)
     return -1; //indice invalido
    else
    {
     indice=pow(10,NAME_SIZE-(i+2)) *(*p-65);
     break;
    }
    }while(1);
   }
  else
  {
   do
   {
    if(*p<48 || *p>57)
     return -1; //nome invalido
    else
    {
      indice+=pow(10,NAME_SIZE-(i+2)) *(*p-48);
      break;
    }
   }while(1);
   }
  p++;
  }
 return indice;
}
int calcula_nome(int Aindice,char *Aname)
{
  register unsigned int i=0;
  char name[NAME_SIZE]={'\0'};
  char *tmp;
  int denominador=0;

  //A11  11
  //B11 111
  for(i=0;i<(NAME_SIZE-1);i++)
  {
   if(i==0)
   {
    denominador=pow(10,NAME_SIZE-(i+2));
    if(denominador!=0)
    {
     name[i]=65+ (Aindice/denominador);
     Aindice%=denominador;
    }
    else
     name[i]=65;
   }
  else
  {
    denominador=pow(10,NAME_SIZE-(i+2));
    if(denominador!=0)
    {
     name[i]=48+ (Aindice/denominador);
     Aindice%=denominador;
    }
    else
     name[i]=48;
   }
  }
 name[i]='\0';
 *Aname='\0';
 strcat(Aname,name);
 return 1;
}

void textinfo(void)
{
  struct text_info ti;
  gettextinfo(&ti);
  cprintf("window left      %2d\r\n",ti.winleft);
  cprintf("window top       %2d\r\n",ti.wintop);
  cprintf("window right     %2d\r\n",ti.winright);
  cprintf("window bottom    %2d\r\n",ti.winbottom);
  cprintf("attribute        %2d\r\n",ti.attribute);
  cprintf("normal attribute %2d\r\n",ti.normattr);
  cprintf("current mode     %2d\r\n",ti.currmode);
  cprintf("screen height    %2d\r\n",ti.screenheight);
  cprintf("screen width     %2d\r\n",ti.screenwidth);
  cprintf("current x        %2d\r\n",ti.curx);
  cprintf("current y        %2d\r\n",ti.cury);
}
Postar um comentário