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

📄 edt_rate.c

📁 BC3.1编译,小交换机计费系统.使用Dos做出如此好的界面,少有.
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************
 *                                                                   *
 *    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 + -