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

📄 mem.c

📁 Dos6.0
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 *
 * init_data() resets various totals in <mem_table>, to prepare for later
 * counts.  It also zeroes the two arrays of data.
 *
 */

void
init_data ()
{
   int   i;

   mem_table.conv_ttl = mem_table.conv_free  = (unsigned long)0;
   mem_table.umb_ttl  = mem_table.umb_free   = (unsigned long)0;
   mem_table.xms_ttl  = mem_table.xms_free   = (unsigned long)0;
   mem_table.ems_ttl  = mem_table.ems_free   = (unsigned long)0;
   mem_table.int_15h  = mem_table.conv_large = (unsigned long)0;

   mem_table.hma        = (unsigned int)0;
   mem_table.noof_progs = mem_table.noof_umbs = 0;

   mem_table.xmsMvers = mem_table.xmsmvers = 0;
   mem_table.xmsMdrvr = mem_table.xmsmdrvr = 0;
   mem_table.emsMvers = mem_table.emsmvers = 0;

   for (i = 0; i < MAX_DDRIVER_REP; i++)
      {
      ddrivername[i][0] = 0;
      }
   ddriveridx = 0;

   for (i = 0; i < MAX_CLDATA_INDEX; i++)
      {
      mem_table.files[i].psp_addr = -1;  /* A 0 would mean free space */
      mem_table.files[i].conv_ttl = mem_table.files[i].umb_ttl = 0L;

      mem_table.umbs[i].umb_free = mem_table.umbs[i].umb_ttl   = 0L;
      mem_table.umbs[i].umb_addr = mem_table.umbs[i].umb_large = 0L;
      }
}

/******************************************************************************
 *
 * parse_cmd() interepetes the following options from the command-line:
 *
 *      /C        or /CLASSIFY      - DataLevel = 1
 *      /D        or /DEBUG         - DataLevel = 2
 *      /F        or /FREE          - DataLevel = 3
 *      /M module or /MODULE module - DataLevel = 4
 *      none of /C,/D,/F,/M         - DataLevel = 0
 *
 *      /P        or /PAGE          - PageBreak = 1
 *
 *      /H or /?  or /HELP          - Helptext displayed; immediate exit
 *
 * It accepts arguments as "MEM/C/P" or "MEM/P/M:module" or
 * "MEM /Mmodule" or "MEM/M = module /P" or "MEM/Mmodule/P" or
 * "MEM /debug/page" or... well, just about anything.
 *
 * If it returns 0, everything's fine... otherwise, it returns the error
 * message that should be printed before exiting.
 *
 */

#define SWITCHCHAR '/'

int
parse_cmd (agc, agv)
int        agc;
char          **agv;
{
   char  cmdline[256], *ptr;
   int   i;
   char far *fptr;

/*
 * First we reconstruct the command-line... argv[][] is a little too
 * clumsy for what we're gonna do in a sec.
 *
 */

   cmdline[0] = 0;
   for (i = 1; i < agc; i++)
      {
      strcat (cmdline, agv[i]);
      strcat (cmdline, " ");
      }
   strupr (cmdline);               /* Make it case-insensitive */

/*
 * That done, let's go...
 *
 */

   ArgPos = cmdline;
   for ( ; *ArgPos; )
      {
      while (*ArgPos && strchr (" \t", *ArgPos))  /* Skip whitespace */
         ArgPos++;

      if (! *ArgPos)  break;   /* In the event that it ended in whitespace */

      if (*ArgPos != SWITCHCHAR)
         {
	 for (i = ArgPos - cmdline; i >= 0; i--)
	    if (cmdline[i] == SWITCHCHAR)  break;
	 i = max (i, 0);
	 for ( ; *ArgPos; ArgPos++)
	    if (strchr (" /\t", *ArgPos))  break;
	 *ArgPos = 0;          /* Null-terminate after this option...      */
	 ArgPos = &cmdline[i]; /* ...and point to the start of the option. */
	 return p_not_in_key;  /* They've given "MEM garbage" or something */
	 }
      switch (*(ArgPos+1))
         {
	 case 'C':  if (DataLevel != 0)
	               {
		       *(ArgPos+2) = 0;
		       return p_too_many;
	               }
		    DataLevel = 1;
		    ArgPos += (! strncmp (ArgPos+1, "CLASSIFY", 8)) ? 9 : 2;
		   break;
	 case 'D':  if (DataLevel != 0)
	               {
		       *(ArgPos+2) = 0;
		       return p_too_many;
	               }
		    DataLevel = 2;
		    ArgPos += (! strncmp (ArgPos+1, "DEBUG", 5)) ? 6 : 2;
		   break;
	 case 'F':  if (DataLevel != 0)
	               {
		       *(ArgPos+2) = 0;
		       return p_too_many;
	               }
		    DataLevel = 3;
		    ArgPos += (! strncmp (ArgPos+1, "FREE", 4)) ? 5 : 2;
		   break;

	 case 'P':  if (PageBreak != 0)
	               {
		       *(ArgPos+2) = 0;
		       return p_too_many;
	               }
		    PageBreak = 3;
		    ArgPos += (! strncmp (ArgPos+1, "PAGE", 4)) ? 5 : 2;
		   break;

	 case 'M':  if (DataLevel != 0)
	               {
		       *(ArgPos+2) = 0;
		       return p_too_many;
	               }
		    ptr = ArgPos;   /* Remember where we are, in case of err */
		    DataLevel = 4;
		    ArgPos += (! strncmp (ArgPos+1, "MODULE", 6)) ? 7 : 2;

		    while (*ArgPos && strchr (" :\t", *ArgPos))
		       ArgPos++;                       /* Skip delimiters  */

		    i = 0;
		    while (*ArgPos && !strchr (" /\t", *ArgPos))
		       {
		       ModName[i] = *ArgPos;
		       ArgPos++;  i++;
		       }
		    ModName[i] = 0;         /* Terminate the name */
		    if (i == 0)  /* They didn't give a module name */
		       {
		       InRegs.x.ax = ModuleName;
		       InRegs.h.dh = Utility_Msg_Class;
		       sysgetmsg(&InRegs,&SegRegs,&OutRegs);
		       FP_OFF(fptr) = OutRegs.x.si;
		       FP_SEG(fptr) = SegRegs.ds;

		       for (ptr = cmdline; *fptr; ptr++, fptr++)
		          *ptr = *fptr;
		       *ptr = 0;

		       ArgPos = cmdline;    /* So complain, and list the */
		                            /* paramter as missing from  */
		       return p_op_missing; /* the option "/MODULE".     */
		       }
		   break;

	 case 'H':
	 case '?':  if (DataLevel != 0 || PageBreak != 0)
	               {
		       *(ArgPos+2) = 0;
		       return p_too_many;
	               }
		     for (i = MSG_OPTIONS_FIRST; i <= MSG_OPTIONS_LAST; i++)
			mprintf (i, "");
		     exit (0);
		   break;

	 default:   *(ArgPos+2) = 0;
	            return p_not_in_sw;
         }
      }

   return 0;
}

/************************************************************************/
/* Parse_Message                - This routine will print only those    */
/*                                messages that require 1 replaceable   */
/*                                parm.                                 */
/*                                                                      */
/*      Inputs  : Msg_Num       - number of applicable message          */
/*                Handle        - display type                          */
/*                Message_Type  - type of message to display            */
/*                Replace_Parm  - pointer to parm to replace            */
/*                                                                      */
/*      Outputs : message                                               */
/*                                                                      */
/************************************************************************/

void
Parse_Message (Msg_Num, parse_ptr)
int            Msg_Num;  
char               far *parse_ptr;
{                          
   if (! parse_ptr)
      InRegs.x.cx = 0;    
   else
      {
      sublist[1].value     = (unsigned far *)parse_ptr;
      sublist[1].size      = Sublist_Length; 
      sublist[1].reserved  = Reserved;      
      sublist[1].id        = 0;            
      sublist[1].flags     = Char_Field_ASCIIZ+Left_Align;
      sublist[1].max_width = 40;
      sublist[1].min_width = 01;
      sublist[1].pad_char  = Blank; 

      InRegs.x.cx = 1;
      }

   InRegs.x.ax = Msg_Num;      
   InRegs.x.bx = STDERR;      
   InRegs.h.dl = No_Input;  
   InRegs.h.dh = Parse_Err_Class; 
   InRegs.x.si = (unsigned int)&sublist[1]; 
   sysdispmsg(&InRegs,&OutRegs); 
}                                  

/* M003 END */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -