⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chk_card.ec

📁 界面库
💻 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 + -