亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cmdl.cpp

?? c++編寫的命令行解釋器
?? CPP
字號:
/***************************************************************
File: CMDL.CPP                Copyright 1992 by Dlugosz Software
part of the CMDL package for command-line parsing
This version may be used freely, with attribution.
***************************************************************/

#include "usual.h"
#include "cmdl.h"
#include "scanner.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

cmdl* cmdl::head= 0;
cmdl* cmdl::last= 0;
#ifdef VERSION21
 cmdl::errval cmdl::error= OK;
#else
 errval cmdl::error= OK;
#endif
int cmdl::count= 0;
char* cmdl::signon_string= 0;

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */
/*     parseing and processing              */
/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl* cmdl::find_switch (char c)
{  //find switch matching char name
for (cmdl* p= head;  p;  p=p->next) {
   if (p->iskeyword()) continue;
   if (!p->ischar()) continue;
   // filtered out the ones I don't care about,
   // now match the name
   if (c == p->cname) return p;  //found it!
   }
return 0;  //found nothing.
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl* cmdl::find_keyword (char c)
{  //find keyword matching char name (no leading switchchar)
for (cmdl* p= head;  p;  p=p->next) {
   if (!p->iskeyword()) continue;
   if (!p->ischar()) continue;
   // filtered out the ones I don't care about,
   // now match the name
   if (c == p->cname) return p;  //found it!
   }
return 0;  //found nothing.
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl* cmdl::find_switch (char* s)
{  //find switch matching string name
for (cmdl* p= head;  p;  p=p->next) {
   if (p->iskeyword()) continue;
   if (p->ischar()) continue;
   // filtered out the ones I don't care about,
   // now match the name
   if (!strcmp (s,p->sname)) return p;  //found it!
   }
return 0;  //found nothing.
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl* cmdl::find_keyword (char* s)
{  //find keyword matching string name (no leading switchchar)
for (cmdl* p= head;  p;  p=p->next) {
   if (!p->iskeyword()) continue;
   if (p->ischar()) continue;
   // filtered out the ones I don't care about,
   // now match the name
   if (!strcmp (s,p->sname)) return p;  //found it!
   }
return 0;  //found nothing.
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

bool cmdl::parse_switches (cmdlscan& s, unsigned /*flags*/)
{
/* this matches the next thing in the input stream `s' against
   all the switch entries.  It handles cascaded single-character
   switches in one gulp.
   Flags not used yet... I'll think of something.
*/
int passcount= 0;  //how many switches were processed
++s;  //skip over the switch character
for (;;) {  //handle cascaded single character switches
   char c= s.thischar();
   cmdl* sw= find_switch (c);
   if (sw) {
      passcount++;
      count++;  //how many total
      ++s;  //advance beyond the name
      if (!sw->scan (s)) {
         sw->report_error();
         return FALSE;
         }
      }
   else break;  //did not find another switch
   }
if (passcount == 0) {  //try a word switch
   const wordsize= 50;  //longest identifier possible
   char word[wordsize];
   s.extract_word (word,wordsize);
   cmdl* sw= find_switch (word);
   if (sw) {  //found one
      count++;
      sw->scan (s);
      }
   else {
      // switch not found
      output ("error: switch -");
      output (word);
      output ("\ninvalid switch.\n");
      return FALSE;
      }
   }
return TRUE;
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

bool cmdl::parse_keywords (cmdlscan& s, unsigned fl)
{
/* this matches the next thing input stream `s' against
   non-switch items.  It handles positional parameters, which are
   syntactically anonomous keyword parameters
*/
int oldpos= s.mark();
const wordsize= 50;  //longest identifier possible
char word[wordsize];
s.extract_word (word,wordsize);
cmdl* sw= find_keyword (word);
if (sw) {  //found it!
   count++;
   sw->scan (s);
   return TRUE;
   }
// else check for positional parameters
s.restore (oldpos);  //rewind the input
sw= find_positional (fl);
if (sw) {
   count++;
   sw->scan (s);
   return TRUE;
   }
// if it gets to here, is an error.
output ("bad parameter: ");
output (word);
output ("\n");
return FALSE;
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl* cmdl::find_positional (unsigned /*fl*/)
{   // look for cmdl objects with no name
for (cmdl* p= head;  p;  p=p->next) {
   if (!(p->flags & noname)) continue;
   if (p->flags & used) continue;  //used that one already
   // got here, p is the one I want.
   return p;
   }
return 0;  //did not find one
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

bool cmdl::parseit (cmdlscan& s, unsigned fl)
{
/* this scans the input described by `s', and processes all
   parameters it parses out.  It may terminate the program with
   an error.
*/
static int recursion_level= 0;
const recursion_limit= 10;
if (++recursion_level >= recursion_limit) {
   /* it is possible for a parameter to create more input.  I.e.
     an @ will read the contents of a file, and a % will read an
     environment variable.  None of this is implemented, but it is
     planned and provided for.  */
   output ("error: nesting level too deep.\n");
   recursion_level--;
   return FALSE;
   }
for (;;) {
   s.skipws();
   switch (s.thischar()) {
      case '\0': 
         recursion_level--;
         return TRUE;     //got through the whole string
      case '-':
      case '/':
         if (!parse_switches (s,fl)) {
            recursion_level--;
            return FALSE;
            }
         break;
      /* other things, such as the above-mentioned @ and % will
         go here as additional cases. */
      default:
         if (!parse_keywords (s,fl)) {
            recursion_level--;
            return FALSE;
            }
         break;
      }
   }
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

bool cmdl::parseit (char* s, unsigned fl)
{
/* this parses an explicit string.  It creates the scanner object
   around the input string, and adds processing after the scan
   is complete.
*/
cmdlscan scan (s);
if (!parseit (scan, fl)) {
   // return FALSE;  //depending on fl
   exit (1);
   }
// otherwise look for more errors
if (count == 0) {
   show_usage();
   exit (1);
   }
for (cmdl* p= head;  p;  p=p->next)
   p->post_process (fl);
for (p= head;  p;  p=p->next)
   p->validate (fl);
return TRUE;
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

bool cmdl::parseit (unsigned /*fl*/)
{
/* this is the form you'll normally see.  It looks up the command-line
   tail from DOS, and passes it to the previous form.
*/
static char string[257];
// locate the command line tail in the PSP
extern unsigned _psp;
char _seg * psp= (char _seg*) _psp;
const offset= 0x80;
char far* commandline= psp+offset;
int len= *commandline++;
for (int loop= 0;  loop < len;  loop++)
   string[loop]= commandline[loop];
   // _fmemcpy() not available in TC++1.01 (a.k.a. "second edition").  Bummer
string[len]= '\0';
return parseit (string);
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */
/*     constructors and helpers             */
/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

void cmdl::linkin()
{
/* this is how the parser knows about all command line objects.
   They are maintained in a linked list.  Note that they are never
   _removed_ from the list, so it is a real bad idea to let any
   command line object go out of scope before calling parseit().
   After parsing, the list is abandoned, never to be traversed again.
*/
next= 0;
if (!head) head= last= this;  //make a list of one.
else {
   // chain to end of list
   last->next= this;
   last= this;
   }
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl::cmdl (const char* name, const char* helpstring, unsigned fl)
: helpstring(helpstring), flags(fl)
{     //STRING form
if (!name) flags |= noname;    //note positional parameters
else {
   int len= strlen (name);
   if (len == 0) {
      //note name as a char
      flags |= charname;
      cname= name[0];
      }
   else sname= name;   //note name as a string.
   }
linkin();
}

/* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ */

cmdl::cmdl (char name, const char* helpstring, unsigned fl)
: helpstring(helpstring), flags(fl)
{     //CHAR form
// note name as a character
flags |= charname;
cname= name;
linkin();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久国产精品人| 欧美精品少妇一区二区三区| 另类小说色综合网站| 一区二区三区在线观看网站| 中文字幕av在线一区二区三区| 26uuu成人网一区二区三区| 欧美r级在线观看| 日韩精品一区二区三区在线观看| 91在线观看视频| 91亚洲男人天堂| 在线免费观看日韩欧美| 色综合亚洲欧洲| 欧美视频精品在线| 日韩三级在线免费观看| 精品国产乱码久久久久久牛牛| 91精品国产欧美一区二区18 | 日本一区二区三区四区| 国产日韩成人精品| 国产精品三级av| 亚洲欧美日韩成人高清在线一区| 亚洲精品日韩综合观看成人91| 一级精品视频在线观看宜春院| 亚洲午夜视频在线观看| 青青草视频一区| 国产a精品视频| 在线视频综合导航| 日韩欧美一二三| 国产精品盗摄一区二区三区| 一区二区三区日韩在线观看| 美女国产一区二区三区| 成人一二三区视频| 欧美三级在线视频| 2017欧美狠狠色| 亚洲狠狠丁香婷婷综合久久久| 香蕉成人伊视频在线观看| 久久成人久久爱| 色偷偷88欧美精品久久久 | 五月综合激情网| 国产精品一区二区免费不卡 | 97se亚洲国产综合自在线 | 欧美美女bb生活片| 国产三区在线成人av| 亚洲国产日韩在线一区模特| 精品一区二区日韩| 欧美日韩国产a| 亚洲欧洲日本在线| 国产乱子伦一区二区三区国色天香| 99国产精品99久久久久久| 91精品国产福利在线观看| 国产精品久久久久久亚洲伦| 七七婷婷婷婷精品国产| 91麻豆精品秘密| 国产午夜精品美女毛片视频| 亚洲自拍偷拍欧美| 成人短视频下载| www成人在线观看| 奇米影视在线99精品| 色婷婷国产精品久久包臀 | 国产不卡高清在线观看视频| 欧美日韩一区三区四区| 一区在线观看视频| 成人小视频在线| 国产欧美日韩精品在线| 久久机这里只有精品| 欧美剧在线免费观看网站| 亚洲天堂a在线| 96av麻豆蜜桃一区二区| 久久久久国产成人精品亚洲午夜 | 奇米亚洲午夜久久精品| 欧美色图在线观看| 一区二区三区四区精品在线视频| 高清在线成人网| 国产日韩欧美一区二区三区综合| 青青草97国产精品免费观看 | 国产美女一区二区三区| 91精品国产色综合久久久蜜香臀| 亚洲va韩国va欧美va精品| 91精彩视频在线观看| 亚洲美女屁股眼交3| 91色porny| 亚洲综合清纯丝袜自拍| 欧美日韩另类一区| 日韩不卡手机在线v区| 91精品国产综合久久蜜臀| 免费观看在线综合| 欧美精品一区二区三区四区| 久久精品国产99久久6| 日韩美女主播在线视频一区二区三区| 日本免费在线视频不卡一不卡二| 欧美亚洲一区三区| 午夜成人在线视频| 日韩欧美的一区二区| 激情av综合网| 亚洲国产精品av| 色噜噜狠狠色综合中国| 天堂av在线一区| 久久影院视频免费| 94色蜜桃网一区二区三区| 亚洲午夜羞羞片| 26uuu亚洲综合色| 99re66热这里只有精品3直播 | 欧美系列一区二区| 蜜桃久久精品一区二区| 国产欧美日韩不卡| 在线观看日产精品| 精品亚洲成a人| 亚洲人亚洲人成电影网站色| 欧美亚洲精品一区| 激情综合五月天| 亚洲精品中文在线观看| 欧美一级欧美三级在线观看| 国产成都精品91一区二区三| 亚洲亚洲人成综合网络| 日韩欧美色综合网站| 91小视频免费观看| 九色porny丨国产精品| 亚洲日本丝袜连裤袜办公室| 欧美电影一区二区三区| 99久久免费精品高清特色大片| 日本欧美加勒比视频| 亚洲视频一区在线| 欧美精品一区二区三区在线播放| 色综合久久久网| 国产夫妻精品视频| 日韩电影免费在线| 一区二区三区中文字幕精品精品| 精品久久久久久最新网址| 欧美午夜电影网| 99久久国产免费看| 黄页视频在线91| 日本一道高清亚洲日美韩| 自拍偷拍亚洲综合| 日本一二三不卡| 久久综合给合久久狠狠狠97色69| 在线视频国产一区| 99国产麻豆精品| 成人性生交大合| 国产激情偷乱视频一区二区三区| 爽爽淫人综合网网站| 亚洲一区二区三区美女| 国产精品久久久爽爽爽麻豆色哟哟| 91精品国产福利在线观看 | 亚洲成人午夜电影| 亚洲欧美综合在线精品| 亚洲欧美日韩国产综合| 国产欧美日韩卡一| 久久久久一区二区三区四区| 欧美一级二级三级蜜桃| 5858s免费视频成人| 欧美日韩一级大片网址| 欧美午夜电影网| 在线视频国产一区| 欧美日韩一区二区欧美激情| 91高清视频在线| 欧美午夜精品久久久久久超碰| 91色综合久久久久婷婷| 91在线观看下载| 色综合久久六月婷婷中文字幕| zzijzzij亚洲日本少妇熟睡| 99国产精品99久久久久久| 色综合色综合色综合色综合色综合 | 7777精品伊人久久久大香线蕉超级流畅| 91丝袜国产在线播放| 色综合久久久久| 色婷婷国产精品| 欧美日本免费一区二区三区| 在线视频欧美区| 欧美人狂配大交3d怪物一区| 欧美日韩国产在线观看| 欧美日韩成人激情| 日韩精品一区二区三区视频| 精品精品国产高清一毛片一天堂| 欧美sm美女调教| 国产精品午夜在线| 亚洲女人****多毛耸耸8| 午夜精品免费在线观看| 日本aⅴ精品一区二区三区| 国产毛片精品国产一区二区三区| 国产老肥熟一区二区三区| av在线不卡观看免费观看| 欧美日本在线看| 久久久久99精品一区| 亚洲老妇xxxxxx| 久久爱www久久做| 成人免费看黄yyy456| 欧美午夜不卡在线观看免费| 日韩欧美电影在线| 亚洲视频小说图片| 免费高清在线一区| 99久久精品国产毛片| 91精品欧美综合在线观看最新| 久久精品欧美日韩| 亚洲大片一区二区三区| 精品一区二区三区视频| 色婷婷综合久久久久中文一区二区| 91精品国产高清一区二区三区蜜臀 | 国产三级精品在线| 亚洲国产综合人成综合网站| 国产美女av一区二区三区| 欧美精品99久久久**|