📄 chk_card.ec
字号:
/*******************************************************
* 卡号检查
* 根据PUBLIC获取刷卡卡号
*
* 最后修改: 周国祥 2001/08/25
*******************************************************/
#include <stdio.h>
#include <math.h>
#include "mytools.h"
#include "macro_def.h"
#include "public.h"
EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
$include "db_struct.h";
S_card_type *G_card_tab;
$int G_card_cnt = 0;
int card_id_cmp();
int card_no_id_cmp();
/*
* 卡类表排序方式: 手输卡时, 以卡号标识长度降序
* : 刷卡时, 以卡类标识长度降序
*/
/* 卡号标识长度比较 */
int card_no_id_cmp(id1, id2)
S_card_type *id1, *id2;
{
if (strlen(id1->card_no_id) < strlen(id2->card_no_id))
return(1);
if (strlen(id1->card_no_id) > strlen(id2->card_no_id))
return(-1);
return(0);
}
/* 卡类标识长度比较 */
int card_id_cmp(id1, id2)
S_card_type *id1, *id2;
{
if (strlen(id1->card_id) < strlen(id2->card_id))
return(1);
if (strlen(id1->card_id) > strlen(id2->card_id))
return(-1);
return(0);
}
/*
* 从卡类表获取资料至内存
* 根据卡输入方式不同分别以卡类标识或卡号标识进行排序
*/
int get_cardtype_table(input_mode)
int input_mode; /* 0:刷卡 1:手输 */
{
$S_card_type card_t;
int i;
$select count(*) into $G_card_cnt from card_type;
if (SQLCODE) {
errcall(ERROR, "select count from card_type error(%d)", SQLCODE);
return(-1);
}
if (G_card_cnt == 0) {
errcall(ERROR, "Table card_type is null!");
return(-1);
}
G_card_tab = (S_card_type *)malloc(G_card_cnt * sizeof(S_card_type));
if ( G_card_tab == NULL ) {
errcall ( ERROR , "Unable malloc memory !" );
return -1;
}
memset ( G_card_tab, 0, sizeof(S_card_type) * G_card_cnt );
$declare card_id_cur cursor for
select * from card_type;
$open card_id_cur;
if (SQLCODE) {
errcall(ERROR, "open card_id_cur error(%d)", SQLCODE);
free(G_card_tab);
return(-1);
}
for (i = 0 ; i < G_card_cnt; i++) {
$fetch card_id_cur INTO :card_t;
if (sqlca.sqlcode == 100)
break;
if (sqlca.sqlcode) {
$close card_id_cur;
free(G_card_tab);
return(-1);
}
del_st_space("card_type", &card_t);
memcpy(&(G_card_tab[i]), &card_t, sizeof(S_card_type));
}
$close card_id_cur;
if (input_mode == 0) /* 刷卡 */
qsort(G_card_tab, G_card_cnt, sizeof(S_card_type), card_id_cmp);
else /* 手输 */
qsort(G_card_tab, G_card_cnt, sizeof(S_card_type), card_no_id_cmp);
}
/*
* 手输卡号检查, 并取出bank_type,card_type
* 当卡号校验为不正确时, 返回正确的校验值
*/
int chk_card(card_no, bank_type, card_type)
char *card_no, *bank_type, *card_type;
{
int i, len, value, sum = 0;
bank_type[0] = 0;
card_type[0] = 0;
DelSpace(card_no);
if (get_cardtype_table(1/*手输方式*/) < 0)
return(-1);
for (i = 0; i < G_card_cnt; i++) {
len = strlen(G_card_tab[i].card_no_id);
if (!strncmp(card_no, G_card_tab[i].card_no_id, len) &&
(strlen(card_no) == G_card_tab[i].card_len ||
(strlen(card_no) == 13 && len == 1 && card_no[0] == '4')))
break;
}
if (i >= G_card_cnt) {
free(G_card_tab);
return(-1);
}
strcpy(bank_type, G_card_tab[i].bank_type);
strcpy(card_type, G_card_tab[i].card_type);
free(G_card_tab);
len = strlen(card_no);
for (i = len - 2; i >= 0; i--) {
value = (card_no[i] - '0') * (((len - i) % 2) ? 1 : 2);
sum += (value % 10) + (value / 10);
}
value = (10 - (sum % 10)) % 10;
if (value != (card_no[len - 1] - '0'))
return(value + 1);
return(0);
}
/*
* 根据PUBLIC中的磁道信息, 获取卡号,卡类型,银行类型等
*/
int fetch_card_no(pub)
PUBLIC *pub;
{
int i, len, value, sum = 0;
char t_card_id[20];
int id_off, id_track;
int no_off, no_track, no_len, exp_off;
if (strncmp(pub->Input_mode, "02", 2) != 0 && strncmp(pub->Input_mode, "05", 2) != 0) {
/* 非刷卡方式 */
return(-1);
}
if (get_cardtype_table(0/*刷卡*/) < 0)
return(-1);
for (i = 0; i < G_card_cnt; i++) {
len = strlen(G_card_tab[i].card_id);
id_off = G_card_tab[i].card_id_off;
id_track = G_card_tab[i].card_id_track;
if (id_track == 2) {
strncpy(t_card_id, &(pub->Card_track2[id_off-1]), 19);
} else {
strncpy(t_card_id, &(pub->Card_track3[id_off-1]), 19);
}
t_card_id[19] = '\0';
if (!strncmp(t_card_id, G_card_tab[i].card_id, len)) {
no_off = G_card_tab[i].card_no_off;
no_track = G_card_tab[i].card_no_track;
no_len = G_card_tab[i].card_len;
if (no_len > 19)
no_len = 19;
exp_off = G_card_tab[i].exp_date_off;
if (no_track == 2) {
strncpy(pub->Card_no, &(pub->Card_track2[no_off-1]), no_len);
pub->Card_no[no_len] = '\0';
strncpy(pub->Exp_date, &(pub->Card_track2[exp_off-1]), 4);
pub->Exp_date[4] = '\0';
} else {
strncpy(pub->Card_no, &(pub->Card_track3[no_off-1]), no_len);
pub->Card_no[no_len] = '\0';
strncpy(pub->Exp_date, &(pub->Card_track3[exp_off-1]), 4);
pub->Exp_date[4] = '\0';
}
strcpy(pub->Bank_type, G_card_tab[i].bank_type);
strcpy(pub->Card_type, G_card_tab[i].card_type);
strcpy(pub->Bank_code, G_card_tab[i].bank_code);
if (!strcmp(pub->Bank_type, BOC_BANK))
strcpy(pub->Card_mode, G_card_tab[i].card_mode);
break;
}
}
if (i >= G_card_cnt) {
free(G_card_tab);
return(-1);
}
free(G_card_tab);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -