📄 edt_rate.c
字号:
/*********************************************************************
* *
* FILE NAME: EDITRATE.C *
* FUNCTION: Edit the rate table on the screen. *
* 1. Input data on the whole screen. *
* 2. Locate according to users' input(area No. *
* or page No.) *
* 3. Increase, delete and modify area numbers, *
* rates and names. *
* 4. If save, must do: *
* (1) Record the length of area No.. *
* (2) Resort the rate table. *
* (3) Set trunk marks in the table. *
* DATE: 1993.9.15 *
*********************************************************************/
#include <string.h>
#include <stdlib.h>
#include <mem.h>
#include <alloc.h>
#include <math.h>
#include <graphics.h>
#include <bio.inc>
#include <menu.inc>
#include <key.inc>
#include "feedef.h"
#define BK_CLR 7
#define CHR_CLR 0
#define HEAD_CLR 0
#define ITBL_CLR 5
#define NOFRESH 0
#define REFRESH 1
#define ITEMS 8
/*---------------------------------------------------------
----------------------- rate_set() -----------------------
Function: Set rate table.
Calls: load_tbl, unload_tbl,disp_tbl,
disp_head,input_dat,out_prompt,
tbl_len
Called by: main()
Input: mode -- 1: international rate table
2: national rate table
3: local rate table
Output: None
Return: None
----------------------------------------------------------*/
void set_rate(UC mode)
{
UI pg;
TABLE_STRUCT rate_tbl = {10,99,20,18,16,ITEMS,{37,73,80,59,45,59,45,59}, ITBL_CLR};
RATE_STRUCT huge *tbl;
clr_DialWin(2);
set_finger_color(Dsp_clr.fng_clr);
draw_table(&rate_tbl); /* draw the table frame */
disp_head(mode); /* display table head */
out_prompt(mode); /* display the help information */
message_disp(8,"根据右上方弹出提示窗口提示操作");
load_tbl(mode);
Oldend = tbl_len(); /* calculate table length */
Tbllen = Oldend;
Count = 1;
Flag = mode;
tbl = Tbltop;
disp_tbl(tbl,Count); /* display 1th page of the rate table */
if(!(Tbllen%16) && Tbllen) /* calculate the pages and display */
pg = Tbllen/16;
else
pg = (UI)(Tbllen/16)+1;
if(mode == DDD)
outf(546,397,11,14,"%3u",pg);
else
outf(542,397,11,14,"%2u",pg);
locate_finger(0,1);
input_data(mode);
unload_tbl();
message_end();
return;
}
/*---------------------------------------------------------
--------------------- disp_head() ---------------------
Function: Display the head of rate table
Calls: None
Called by: rate_set()
Input: None
Output: None
Return: None
-------------------------------------------------------*/
void disp_head(UC mode)
{
outf(380, 80, BK_CLR, HEAD_CLR, "单位:元"); /* ARAE NUMBER */
outf(13, 103, BK_CLR, HEAD_CLR, "序号"); /* No. */
if(mode == LDD)
{
outf(180, 80, BK_CLR, HEAD_CLR, "费率设定(市话)"); /* ARAE NUMBER */
outf(70, 103, BK_CLR, HEAD_CLR, "局 号"); /* ARAE NUMBER */
outf(140, 103, BK_CLR, HEAD_CLR, " 局 名 "); /* AREA NAME */
}
else if(mode == DDD)
{
outf(164, 80, BK_CLR, HEAD_CLR, "费率设定(国内长途)"); /* ARAE NUMBER */
outf(70, 103, BK_CLR, HEAD_CLR, "区 号"); /* ARAE NUMBER */
outf(140, 103, BK_CLR, HEAD_CLR, " 区 名 "); /* AREA NAME */
}
else if(mode == IDD)
{
outf(164, 80, BK_CLR, HEAD_CLR, "费率设定(国际长途)"); /* ARAE NUMBER */
outf(70, 103, BK_CLR, HEAD_CLR, "区 号"); /* ARAE NUMBER */
outf(140, 103, BK_CLR, HEAD_CLR, " 区 名 "); /* AREA NAME */
}
outf(217, 103, BK_CLR, HEAD_CLR, "起价"); /* FIRST RATE */
outf(278, 103, BK_CLR, HEAD_CLR, "秒"); /* FIRST TIME */
outf(320, 103, BK_CLR, HEAD_CLR, "正常价"); /* FORMAL RATE */
outf(385, 103, BK_CLR, HEAD_CLR, "秒"); /* FORMAL TIME */
outf(421, 103, BK_CLR, HEAD_CLR, "附加费"); /* ADD FEE */
}
/*------------------------------------------------------------
---------------------- out_prompt() ----------------------
Function: Display the prompt on the screen.
Calls: None
Called by: rate_set
Input: None
Output: None
Return: None
----------------------------------------------------------*/
void out_prompt(UC mode)
{
/*** PROMPT: ***/
draw_back1(480, 102, 625, 357, 11);
outf(490, 122, 11, 0, "F2 存盘");
outf(490, 142, 11, 0, "F5 删除");
outf(490, 162, 11, 0, "F6 区号定位");
outf(490, 182, 11, 0, "F7 页定位");
outf(490, 222, 11, 0, "F9 费率复制");
outf(490, 242, 11, 0, "←↓→↑ 移动");
outf(490, 262, 11, 0, "PgUp 向前翻页");
outf(490, 282, 11, 0, "PgDn 向后翻页");
outf(490, 302, 11, 0, "Enter 输入");
outf(490, 322, 11, 0, "Esc 退出");
/*** PAGE No. AND TOTAL PAGE ***/
draw_back1(498, 365, 607, 427, 11);
outf(518, 377, 11, 14, "第");
outf(575, 377, 11, 14, "页");
outf(518, 397, 11, 14, "共");
outf(575, 397, 11, 14, "页");
}
/*----------------------------------------------------------
-------------------- load_tbl() ------------------------
Function: Load rate table from "intern.rat" or
"nation.rat" or "local.rat".
Calls: tbl_len
Called by: rate_set()
Input: mode -- 1: international rate table
2: national rate table
3: local rate table
Output: None
Return: None
--------------------------------------------------------*/
void load_tbl(UC mode)
{
FILE *fptr;
RATE_STRUCT huge *tbl;
UL ss;
int i, num = 0;
if(mode == IDD)
{
fptr = fopen(IDDRateFileName, "rb");
if(!fptr)
{
fptr = fopen("gfsdata\\idd.std", "rb");
}
Max_len = MAX_INTERN;
}
else if(mode == DDD)
{
fptr = fopen(DDDRateFileName, "rb");
if(!fptr)
{
fptr = fopen("gfsdata\\ddd.std", "rb");
}
Max_len = MAX_NATION;
}
else if(mode == LDD)
{
fptr = fopen(LDDRateFileName, "rb");
if(!fptr)
{
fptr = fopen("gfsdata\\ldd.std", "rb");
}
Max_len = MAX_LOCAL;
}
Tbltop = (RATE_STRUCT huge *)farcalloc(Max_len, sizeof(RATE_STRUCT));
if(!Tbltop)
{
ss = (UL)(Max_len*sizeof(RATE_STRUCT));
exit_scr(1,"Out of memery ERROR: %ld bytes.\n\nGFS system shutdown abnormally.\n\n\n\n",ss);
}
tbl = Tbltop;
if(fptr != NULL)
{
while(fread(tbl,sizeof(RATE_STRUCT),1,fptr) == 1)
{
tbl++;
num++;
}
fclose(fptr);
}
for(i=num; i<Max_len; i++)
{
(Tbltop+i)->area_no[0] = '\0';
(Tbltop+i)->length = 0;
(Tbltop+i)->first_rate = 0;
(Tbltop+i)->first_time = 60;
(Tbltop+i)->formal_rate = 0;
(Tbltop+i)->formal_time = 60;
(Tbltop+i)->add_fee = 0;
}
Tbltop->trunk_mark = 1;
return;
}
/*-----------------------------------------------------
-------------------- unload_tbl() ------------------
Function: Free the space used by rate
table.
Calls: None
Called by: rate_set()
Input: None
Output: None
Return: None
----------------------------------------------------*/
void unload_tbl(void)
{
farfree(Tbltop);
return;
}
/*-------------------------------------------------------
--------------------- tbl_len() ---------------------
Function: Calculate the length of rate
table.
Calls: Nnoe
Called by: rate_set,load_tbl,
modi_tbl
Input: None
Output: None
Return: The length of rate table
-----------------------------------------------------*/
UI tbl_len()
{
RATE_STRUCT huge *tbl;
UI tbllen = 0;
tbl = Tbltop;
while(tbl->length && tbllen<Max_len)
{
tbllen++;
tbl++;
}
return(tbllen);
}
/*----------------------------------------------------------
------------------------ maxnum() ----------------------
Function: Compare with two numbers.
Calls: None
Called by: modi_tbl,sort_tbl
Input: num1,num2 -- two numbers
Output: None
Return: The bigger between the two numbers
----------------------------------------------------------*/
UI maxnum(UI num1, UI num2)
{
if(num1 >= num2)
return(num1);
else
return(num2);
}
/*------------------------------------------------------
------------------- disp_tbl() ---------------------
Function: Display a page of rate table.
Calls: None
Called by: rate_set,pgup_tbl,pgdn_tbl,
loc_tbl,loc_page
Input: tbl -- a pointer pointing the page
num -- the No. of the first item of
the page
Output: None
Return: None
------------------------------------------------------*/
void disp_tbl(RATE_STRUCT huge *tbl, int num)
{
UI i, j;
UI x, y;
UI pg;
UNIT_STRUCT cer_unit;
for(i=0; i<16; i++) /* DISPLAY No. IN THE TABLE */
{
if(num+i > Max_len)
break;
if(Flag == DDD)
outf(12, i*19+123, BK_CLR, HEAD_CLR, "%4u", num+i);
else
outf(12, i*19+123, BK_CLR, HEAD_CLR, "%3u", num+i);
}
pg = (UI)(num/16)+1; /* DISPLAY THIS PAGE No. */
setfillstyle(1,11);
bar(534, 393, 575, 377);
if(Flag == DDD)
outf(546, 377, 11, 14, "%3u", pg);
else
outf(542, 377, 11, 14, "%2u", pg);
if(num == Tbllen+1) /* the table has been added, so redisplay pg */
{
bar(534, 413, 575, 397);
if(Flag == DDD)
outf(546, 397, 11, 14, "%3u", pg);
else
outf(542, 397, 11, 14, "%2u", pg);
}
/***** Display a page of the rate table. *****/
for(i = 0; i < 16; i++)
{
if(!tbl->length || (num+i > Max_len))
break;
for(j = 1; j < ITEMS; j++)
{
cer_unit.unit_x = i;
cer_unit.unit_y = j;
get_certain(&cer_unit);
x = cer_unit.dot_sx;
y = cer_unit.dot_sy+1;
switch(j)
{
case 1: /* AREA No. */
if(!strcmp(tbl->area_no,""))
break;
outf(x+3,y,BK_CLR,CHR_CLR,"%-8s",tbl->area_no);
break;
case 2: /* AREA NAME */
outf(x+2, y, BK_CLR, CHR_CLR, "%s", tbl->area_name);
break;
case 3: /* first_RATE */
outf(x+2, y, BK_CLR, CHR_CLR, "%6.2f", ((double)tbl->first_rate)/100);
break;
case 4: /* first time */
outf(x+12,y,BK_CLR, CHR_CLR, "%-3u", tbl->first_time);
break;
case 5: /* formal_RATE */
outf(x+2, y, BK_CLR, CHR_CLR, "%6.2f", ((double)tbl->formal_rate)/100);
break;
case 6: /* formal time */
outf(x+12,y,BK_CLR, CHR_CLR, "%-3u", tbl->formal_time);
break;
case 7: /* addtional fee */
outf(x+12, y, BK_CLR, CHR_CLR, "%4.2f", ((double)tbl->add_fee)/100);
break;
}/* END SWITCH */
}/* END FOR2 */
tbl++;
}/* END FOR1 */
return;
}
/*-------------------------------------------------------
------------------- input_data() --------------------
Function: Run commands user input.
Calls: save_tbl,sort_tbl,loc_tbl,
loc_page,pgup_tbl,pgdn_tbl,
modi_tbl,del_tbl,set_trunk
Called by: rate_set()
Input: None
Output: None
Return: None
-------------------------------------------------------*/
void input_data(UC mode)
{
UI input;
UC *title = "注意:";
UC *warn = "最多只能有这么多区号!";
UC result;
UC mode1;
// TABLE_STRUCT rate_tbl = {10,99,20,18,16,ITEMS,{37,73,80,59,45,59,45,59}, ITBL_CLR};
UNIT_STRUCT cur_unit;
while(1)
{
input=get_key1();
get_current(&cur_unit);
switch(input)
{
case ESC: /* QUIT */
result=select_1in3();
switch(result)
{
case 1: /* DON'T QUIT */
break;
case 2: /* SAVE AND QUIT */
save_tbl(Flag,NOFRESH);
recover_screen(2);
return;
case 3: /* QUIT AND DON'T SAVE */
recover_screen(2);
return;
}
break;
case UP: /* GO TO THE LAST ROW */
move_finger(0,1);
break;
case DOWN: /* GO TO THE NEXT ROW */
if(Count+cur_unit.unit_x == Max_len)
{
warn_mesg(title, warn);
break;
}
if((Count+cur_unit.unit_x) <= Tbllen)
{
move_finger(1,1);
if((Count+cur_unit.unit_x) == Tbllen)
move_finger(2,cur_unit.unit_y-1);
}
else
sound_bell();
break;
case LEFT:
if(cur_unit.unit_y != 1)
move_finger(2,1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -