Neste site voce vai encontrar tutoriais de software livre e tambem alguns para Windows, sistema de controles de frequência e usuários desenvolvidos em PHP e MySQL, diversão, muita coisa sobre pescarias com albuns de fotos e também as viagens que pude registrar até agora.
/*
Membro .......................... FUNCOES.C
Autor ........................... LERCIO TEOTONIO GONTIJO
Data ............................ 29 de Novembro de 1993
Linguagem ....................... C (PARA UNIX)
Local ........................... PRODABEL - GAT
Funcao .......................... Calculo de DV
Observacoes:
Recebe 3 parametros TIPO e VALOR devolvendo o DV
ou codigo de retorno negativo.
O TIPO podera ser:
CPF - Para C.P.F.
CGC - Para C.G.C.
EST - Para Inscricao Estadual
TIT - Para Tiltulo de Eleitor
*/
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "funcoes.h"
#include "natuser.h"
#define BRANCO 32
int CalculaCPF(char *, char *);
int CalculaCGC(char *, char *);
int CalculaInscricaoEstadual(char *, char *);
int CalculaTituloEleitor(char *, char *);
/*----------------------------------------------------------------------*
* *
* Modulo .................. PB19030A *
* Autor ................... Lercio Teotonio Gontijo *
* Data .................... Julho de 1994 *
* Local ................... PRODABEL - BELO HORIZONTE *
* Funcao .................. DV CPF,TITULO,INSC. EST. E CGC *
* *
*----------------------------------------------------------------------*/
Interface com o NATURAL (ADABAS)
long PB19030A (WORD nparm, BYTE **parmptr, FINFO *parmdec)
{
int i; /* loop counter */
char tipo[4]; /* Tipo do valor para calculo do DV: (CPF,CGC,EST,TIT) */
/* Sao 3 bytes mais o caracter de terminacao do string */
char valor[14]; /* Valor para calculo do DV - maximo de 13 bytes */
char DV[3]; /* DigiTo verificador alfanumerico */
int dv1, dv2, rc; /* Return Code da funcao de calculo */
strcpy(DV,"**");
/* Testa o numero de parametros */
if (nparm != 3) /* TIPO VALOR DV */
{
memmove ((char *) parmptr[2], (char *) &DV, 2);
return 1;
}
/* Move os argumentos passados a subrotina para variaveis do
programa. NAO UTILIZE DIRETAMENTE AS VARIAVEIS RECEBIDAS. */
memmove ((char *) &tipo, (char *) parmptr[0], 3);
tipo[3] = '\0';
/* A subrotina recebe TIPO, VALOR, DV
O programa NATURAL devera definir estas variaveis como:
TIPO(A3) que devera conter CPF, CGC, EST ou TIT
VALOR(A10) para tipo igual a CPF (complete com zeros a esquerda)
VALOR(A12) para tipo igual a CGC (complete com zeros a esquerda)
VALOR(A11) para tipo igual a EST (complete com zeros a esquerda)
VALOR(A10) para tipo igual a TIT (complete com zeros a esquerda)
DV(A2) com qualquer valor onde sera devolvido o digigito verificador */
if (strlen(tipo) != 3)
return 2;
if (!strcmp(tipo,"CPF"))
{
memmove ((char *) &valor, (char *) parmptr[1], 10);
valor[10] = '\0';
rc = CalculaCPF(valor,(char *)&DV);
}
else
if (!strcmp(tipo,"CGC"))
{
memmove ((char *) &valor, (char *) parmptr[1], 12);
valor[12] = '\0';
rc = CalculaCGC(valor,(char *)&DV);
}
else
if (!strcmp(tipo,"EST"))
{
memmove ((char *) &valor, (char *) parmptr[1], 11);
valor[11] = '\0';
rc = CalculaInscricaoEstadual(valor,(char *)&DV);
}
else
if (!strcmp(tipo,"TIT"))
{
memmove ((char *) &valor, (char *) parmptr[1], 10);
valor[10] = '\0';
rc = CalculaTituloEleitor(valor,(char *)&DV);
}
else
{
memmove ((char *) parmptr[2], (char *) &DV, 2);
return 1;
}
/* Move o resultado do CALCULO DO DIGITO VERIFICADOR PARA o campo de
DV passado na subrotina. */
memmove ((char *) parmptr[2], (char *) &DV, 2);
return(rc);
}
/*
************* fim do módulo principal *************
*/
Função para calcular dígito verificador de CPF
CalculaCPF(char *valor, char *dv)
{
char string[14];
int i, j, produto = 0;
strcpy(string,valor);
if(strlen(valor) != 10) return 1;
for(i=9,j=2;i>0;i--,j++)
{
if (!isdigit(string[i])) return 1;
produto = produto + (string[i] - 48) * j;
}
if (produto % 11 < 2)
dv[0] = '0';
else dv[0] = 11 - produto % 11 + 48;
string[10] = dv[0];
produto = 0;
for(i=10,j=2;i>0;i--,j++)
{
if (!isdigit(string[i])) return 1;
produto = produto + (string[i] - 48) * j;
}
if (produto % 11 < 2)
dv[1] = '0';
else dv[1] = (11 - (produto % 11)) + 48;
return 0;
}
Função para calcular dígito verificador de CGC
CalculaCGC(char *valor, char *dv)
{
char string[14];
int i, j, produto = 0;
strcpy(string,valor);
if (strlen(valor) != 12) return 1;
/*-------------------------------------------------------------------*/
/* Validacao do oitavo digigito */
/*-------------------------------------------------------------------*/
/* Multiplicar o primeiro, terceiro, quinto e setimo digitos */
/* 2 subtraindo 9 de cada produto que for maior que 9. */
/* Somar os produtos com o segundo, quarto e sexto digitos. */
/* Dividir o resultado por 10, se o resto for igual a zero o DV */
/* sera zero (0), caso contrario, diminuir de 10 o resto que */
/* sera o DV. */
/* O DV calculado tem que ser igual ao oitavo digito. */
for(i=0;i<7;i+=2)
{
if (!isdigit(string[i])) return 1;
if ((string[i] - 48) * 2 > 9)
produto = produto + (string[i] - 48) * 2 - 9;
else
produto = produto + (string[i] - 48) * 2;
}
for(i=1;i<6;i+=2)
{
if (!isdigit(string[i])) return 1;
produto = produto + string[i] - 48;
}
if (produto % 10 < 1)
j = 0;
else
j = 10 - produto % 10;
/* if (j+48 != string[7]) return 2; * oitavo digito nao confere */
/*-------------------------------------------------------------------*/
/* Calculo do primeiro DV */
/*-------------------------------------------------------------------*/
/* Multiplicar os digitos da direita para a esquerda por 2 ate 9 */
/* voltando no 2 ate 5. */
/* Somar os produtos e dividir o resultado por 11, se o resto for */
/* menor que 2 o primeiro DV sera zero, caso contrario, diminuir */
/* de 11 o resto que sera o primeiro DV. */
for(i=strlen(string),j=2,produto=0;i>0;i--,j++)
{
if (!isdigit(string[i-1])) return 1; /* testa se numerico */
produto = produto + (string[i-1] - 48) * j;
if (j > 8) j = 1;
}
if (produto % 11 < 2)
dv[0] = '0';
else
dv[0] = 11 - produto % 11 + 48;
/* calcula segundo DV */
string[12] = dv[0]; /* DV 1 passa a ser a 13a posicao de string */
string[13] = '\0';
for(i=strlen(string),j=2,produto=0;i>0;i--,j++)
{
produto = produto + (string[i-1] - 48) * j;
if (j > 8) j = 1;
}
if (produto % 11 < 2)
dv[1] = '0';
else
dv[1] = 11 - produto % 11 + 48;
return 0;
}
Função para calcular dígito verificador de Inscrição Estadual
CalculaInscricaoEstadual(char *valor, char *dv)
{
char string[14];
int i, j, produto = 0;
strcpy(string,valor);
if (strlen(valor) != 11) return 1;
/*-------------------------------------------------------------------*/
/* Geracao do primeiro DV */
/*-------------------------------------------------------------------*/
/* Multiplicar os digitos da esquerda para a direita pelos */
/* seguintes numeros respectivamente 1,2,1,1,2,1,2,1,2,1,2. */
/* Somar o primeiro com o segundo algarismo de cada produto do */
/* passo anterior. */
/* Somar os resultados e dividir por 10, se o resto for zero o */
/* primeiro DV sera zero (0), caso contrario, subtrair de 11 o */
/* resto (11 - resto) que sera o primeiro DV. */
for(i=0;i<strlen(string);i++)
if (!isdigit(string[i])) return 1; /* consiste numerico */
produto = string[0] + string[2] + string[3] + string[5] +
string[7] + string[9] - (48 * 6);
/* A operacao anterior necessita multiplicar 48 por 6, porque */
/* a representacao em ASCII do numero zero em decimal corresponde */
/* a 48, uma vez que numeros sao tratados em decimal e nao em ASCII */
/* Estao sendo somados os digitos 1, 3, 4, 6, 8 e 10 respectivamente */
/* O resultado seria 288 se todos os digitos fossem zeros. Multi- */
/* plicando-se 48 * 6 teremos 288 e o resultado sera entao zero. */
i = (string[1] - 48) * 2; /* Multiplica por 2 o segundo digito */
if (i > 9)
produto = produto + 1 + (string[1] - 48) * 2 - 10;
else produto = produto + i;
/* A operacao anterior separa o primeiro e o segundo digito e soma- */
/* os em produto */
for(i=4;i<10;i+=2)
if ((string[i] - 48) * 2 > 9)
produto = produto + 1 + (string[i] - 48) * 2 - 10;
else produto = produto + (string[i] - 48) * 2;
if (produto % 10 > 0)
dv[0] = 10 - produto % 10 + 48;
else dv[0] = '0';
/*-------------------------------------------------------------------*/
/* Geracao do segundo DV */
/*-------------------------------------------------------------------*/
/* O primeiro DV calculado anteriormente passa a ser o ultimo */
/* digito ficando o string com 12 posicoes (digitos). */
/* Multiplicar o digito 1 por 2 e o digito 2 por 3. */
/* Multiplicar o digito 3 ate o digito 12 por 2 ate 11: */
/* digito 3 por 2, 4 por 3, 5 por 4, 6 por 5 ... */
/* Somar os produtos das multiplicacoes anteriores e dividir o */
/* resultado por 11, se o resto for menor que 2 o segundo DV */
/* sera zero (0), caso contrario, subtrair de 11 o resto que sera */
/* o segundo DV. */
string[11] = dv[0];
string[12] = '\0'; /* forca a terminacao do string em 12 chars */
produto = (string[0] - 48) * 3 + (string[1] - 48) * 2;
for(i=strlen(string),j=2;i>2;i--,j++)
produto = produto + (string[i-1] - 48) * j;
if (produto % 11 < 2)
dv[1] = '0';
else dv[1] = 11 - produto % 11 + 48;
return 0;
}
Função para calcular dígito verificador de Título de Eleitor
CalculaTituloEleitor(char *valor, char *dv)
{
char string[14];
int i, j, produto = 0;
strcpy(string,valor);
if (strlen(valor) != 10) return 1;
/*-------------------------------------------------------------------*/
/* Geracao do primeiro DV */
/*-------------------------------------------------------------------*/
/* Multiplicar do primeiro ao oitavo digito por 9 ate 2 respec. */
/* Somar os produtos e dividir o resultado por 11. Se o resto */
/* for zero o primeiro DV sera 1, se o resto for 1 o primeiro DV */
/* sera zero, senao, subtrair de 11 o resto que sera primeiro DV. */
/*-------------------------------------------------------------------*/
for(i=0,j=9;i<8;i++,j--)
produto = produto + (string[i] - 48) * j;
if (produto % 11 > 1)
dv[0] = 11 - produto % 11 + 48;
else
dv[0] = '0';
/*-------------------------------------------------------------------*/
/* GERACAO DO SEGUNDO DV */
/*-------------------------------------------------------------------*/
/* O primeiro DV calculado passa a ser agora o ultimo digito do */
/* valor a ser calculado (11 posicoes). */
/* Multiplicar os 3 ultimos digitos por 4, 3, 2 respectivamente. */
/* Somar os produtos e dividir o resultado por 11. Se o resto for */
/* zero o segundo DV sera 1, se o resto for 1 o segundo DV sera 0, */
/* senao, subtrair de 11 o resto que sera o segundo DV. */
/*-------------------------------------------------------------------*/
string[strlen(string)] = dv[0];
string[strlen(string)+1] = '\0';
produto = (string[8] - 48) * 4 +
(string[9] - 48) * 3 +
(string[10]- 48) * 2;
if (produto % 11 > 1)
dv[1] = 11 - produto % 11 + 48;
else
if (produto % 11 == 1)
dv[1] = '0';
else
dv[1] = '1';
return 0;
}