Command Operating System by cdsidi(ComSys) 0.2.x版本陆续更新

  1 /*每个类依赖功能的类:
  2     comsolve_com:几乎所有
  3     err_com: syscore_com systemio_com out_com
  4     in_com:无
  5     out_com:无
  6     storage_com:懒得写了
  7     strext_com:无
  8     syscore_com:
  9         systemio_com
 10         out_com
 11         storage_com
 12         comsolve_com
 13         in_com
 14         strext_com
 15     systemio_com: 无
 16     welcome_com: out_com
 17 */
 18 /************更新日志*************************** 
 19 0.0.1:    基本的框架和命令基础 
 20 0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备
 21 0.1.0: 在底层支持了Integer类型 
 22 0.1.1: 优化了用户交互、完善了代码注释 
 23 0.1.2: 添加了广告
 24 0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 
 25 0.1.4:    1.添加了"cls"指令 用于清屏 
 26         2. storage 已经支持Integer/Floating/String全类型 
 27         3. 现在命令首尾如果有空格会自动忽略(trim函数) 
 28         4.支持通过varinfo string 来输出变量的内容 
 29 0.1.4 patch 1: 1.修复了bug;添加了 cls 指令在help内 
 30 0.1.5:    1.添加了syscore_com 类 拆分了welcome_com的一些功能
 31          2.整合了开始屏幕和关闭屏幕欢迎信息
 32         3.添加了"welcome::about()"包含系统信息和广告 
 33         4.更改了版本号系统[x.x.x.x] 最后一位是补丁号 
 34 0.2.0:    TestEdition 1:
 35         1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度 
 36         2.现在版本号已经包含在welcome_com中
 37         3.已经在comsolve_com里添加了中文命令的定义 
 38         Test Edition 2:
 39         4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
 40         5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖) 
 41         6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition] 
 42         7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
 43         8.重磅更新:comsolve_com::varsole(string s)已经可用
 44             用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它” 
 45         9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
 46         10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色 
 47         11.优化了多语言 
 48         patch 0:
 49         12.为正式版优化GUI  
 50         13.添加了runtime 命令 获取系统从开始到当前时刻的时间 
 51         14.补全了测试版的一些命令相关(中文,help)
 52         patch 1:
 53         1.完善了注释
 54         2.sysinfo 修复bug:系统启动时间显示没有冒号
 55         3.新功能:现在程序标题栏会显示ComSys
 56         4.systemio_com::重写了sleep(int),添加了sleep_until(int),
 57         5.令syscore_com::startsys改用sleep_until 加快启动时间
 58         6.对storage_com 的整理 
 59 ***********************************************/ 
 60 #include<iostream>
 61 #include<string>
 62 #include<cstdlib> 
 63 #include<vector>
 64 #include<map>
 65 #include<ctime>
 66 #include<cstdio>
 67 #include<sstream>
 68 using std::cin;
 69 using std::cout;
 70 using std::string;
 71 using std::endl;
 72 using std::vector;
 73 using std::map;
 74 class strext_com{//字符串处理扩展功能 
 75     public:
 76         static void trim(string &s){//删除字符串首尾空格 
 77             if(s.empty()) return;
 78             s.erase(0,s.find_first_not_of(' '));
 79                 s.erase(s.find_last_not_of(' ') + 1);
 80         }
 81         static bool is_empty_char(char c){
 82             return c==' '|| c=='
';
 83         }
 84 };
 85 class out_com{//字符串输出 
 86     public:
 87         static void print(string s);//输出 
 88         static void print(string s,int from);//从第from开始输出,一直到最后 
 89         static void println(string s);//输出并换行 
 90         static void println(string s,int from);//从from开始输出,并换行     
 91 };
 92 class err_com{//错误处理 
 93     public:
 94     static void throwln(string s);//输出错误信息 
 95     static void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 
 96 };
 97 class fileio_com{//文件输入输出(还没写)
 98 };
 99 class in_com{//字符串输入 
100     public:
101         static void read(string &s);//输入(空白作结尾符号) 
102         static void readln(string &s); //输入(换行作结尾符号) 
103 };
104 class systemio_com{ //依赖于Windows io的功能 
105     public:                 
106     static void windowscmd(string s){//直接在cmd里面执行指令 
107         system(s.c_str());
108     }
109     static progexit(int code){//退出程序并且错误码为code 
110         exit(code);
111     }
112     static void cleanscr();//清屏 
113     static sleep_until(int k){ //暂停到k毫秒 
114         while(gettime()<=k);
115     }
116     static sleep(int k){//暂停k毫秒
117         sleep_until(gettime()+k);
118     }
119     static void changeclr(string s){
120         string tmp="color "+s;
121         system(tmp.c_str());
122     }
123     static int gettime(){ //获取程序运行的时间 
124         return clock();
125     }
126 };
127 class welcome_com{//系统欢迎与用户界面(并不是系统核心) 
128     public:
129         static const int vernum1=0,vernum2=2,vernum3=0,verpatch=1;
130         static int sysstarttime;//系统启动的时间 
131         static void sysinfo();//系统信息 
132         static void help();//输出帮助信息
133         static void advertisements();//输出广告 
134         static void about();//输出关于信息 
135 };
136 int welcome_com::sysstarttime=-1; 
137 class storage_com{//存储管理 
138     public:
139         static const int code_void=0,//空类型 
140                         code_integer=1,//整数 
141                         code_floating=2,//浮点数 
142                         code_string=3;//字符串
143         struct varinfo{//保存变量信息的数据结构 
144             string name;
145             int type;
146             int address;
147             varinfo(int a=0,int b=0):type(a),address(b){}
148             varinfo(string a,int b,int c):name(a),type(b),address(c){}
149         };
150         typedef int type_t;//存储类型的类型 
151         typedef long long Integer;//Integer:long long
152         typedef double Floating;//Floating: double
153         typedef string String;//String: string
154         static vector<Integer> Ints;//保存Integer 的数组 
155         static vector<Floating> Floats;//保存Floating的数组 
156         static vector<String> Strings;//保存String的数组 
157         static map<string,varinfo> varmap;//string->varinfo的映射 
158         static map<string,type_t> typemap;//string->type的映射 
159         static const string
160             code_str_void,
161             code_str_integer,
162             code_str_floating,
163             code_str_string;
164         static const string
165             code_err_wrongtype;
166     public:
167         storage(){}
168         static void init();
169         static int gettype(string name);//获得变量名name的类型 
170         static void putvalue(string name,long long val);//将变量名name的值设为val
171         static void putvalue(string name,int val); 
172         static void putvalue(string name,string val);
173         static void putvalue(string name,double val);
174         static int getInteger(string name);//获得name的int值 
175         static String getString(string name);
176         static double getFloating(string name);
177         static string getvarstr(varinfo var);
178         static string getvarstr(string name);
179         static void printvarstr(string name);
180         static void printvarstrln(string name);
181         static void solve0(string command);
182 
183 };
184 const string storage_com::code_str_void="VOID",
185             storage_com::code_str_integer="INTEGER",
186             storage_com::code_str_floating="FLOATING",
187             storage_com::code_str_string="STRING",
188             storage_com::code_err_wrongtype="Wrong Type";
189 vector<storage_com::Integer> storage_com::Ints;//保存Integer 的数组 
190 vector<storage_com::Floating> storage_com::Floats;//保存Floating的数组 
191 vector<storage_com::String> storage_com::Strings;//保存String的数组 
192 map<string,storage_com::varinfo> storage_com::varmap;//string->varinfo的映射 
193 map<string,storage_com::type_t> storage_com::typemap;
194 class syscore_com{//系统核心
195     public:
196         static const int cnt_stars=80,cnt_emptyl=8,waitms=3000;
197         static const string version;//版本号提示
198         static void closesys();//关闭系统 
199         static void startsys();//启动和初始化 
200         static void initsys();//延迟初始化 
201         static void closetimeout(int m_secs);//延迟关闭(毫秒) 
202         static void welcomescr(string message);//开始和关闭画面 
203         static void sysmain();//系统运行的重要内容 
204 };
205 class comsolve_com{//指令处理 
206     public:
207         static const int Max_basic_command=100;//最大命令数目(现在只有8个) 
208         static const int
209             codecom_base_en=Max_basic_command*0,
210             codecom_base_cn=Max_basic_command*1;        
211         static const int 
212             code_unknown=0,//错误指令 
213             code_print=1,
214             code_windowscmd=2,
215             code_exit=3,
216             code_sysinfo=4,
217             code_help=5,
218             code_var=6,
219             code_cls=7,
220             code_color=8,
221             code_runtime=9;
222         static const char 
223             code_varflag0='%';//变量出现的标志 
224         static string basic_command_cn[Max_basic_command];
225         static string basic_command[Max_basic_command];//指令代号->指令名的映射 
226         static map<string,int> commap;//指令名->指令代号的映射 
227     private:
228         //static void push_command(string s,int code,int codebase);
229     public:
230         static void init();//初始化 
231         static void solve0(string s);//第一步处理
232         static void solve1(string s,int left,int code_raw);//第二步命令处理 
233         static string varsolve(string s);//把字符串中的变量替换成所代表的的值
234 };
235 string comsolve_com::basic_command[Max_basic_command];//指令代号->指令名的映射
236 string comsolve_com::basic_command_cn[Max_basic_command]; 
237 map<string,int> comsolve_com::commap;//指令名->指令代号的映射 
238 class System_com{//基本功能(几乎无需初始化) 
239     public:
240         out_com out;
241         err_com err;
242         in_com in;
243         systemio_com sysio;
244         fileio_com fileio;
245         welcome_com wel;
246         syscore_com syscore;
247     System_com(){}
248 };
249 class Systemext_com{//基本拓展功能(可能需要初始化) 
250     public:
251         storage_com var;
252         comsolve_com comsolve;
253     Systemext_com(){}
254 }; 
255 void out_com::print(string s){
256     print(s,0);
257 }
258 void out_com::println(string s){
259     println(s,0);
260 }
261 void out_com::print(string s,int from){
262     int len=s.length();
263     string s1=s.substr(from,len-from);
264     cout<<s1;
265 }
266 void out_com::println(string s,int from){
267     print(s,from);cout<<endl;
268 }
269 void in_com::read(string &s){
270     cin>>s;
271 }
272 void in_com::readln(string &s){
273     getline(cin,s);
274 }
275 void err_com::throwln(string s){
276     systemio_com::windowscmd("color 1f"); //color 1 3 9是蓝色 
277     out_com::println("System Error:There is a problem:");
278     out_com::println(s);
279 }
280 void err_com::throwshut(string s,int timeout){
281     throwln(s);
282     syscore_com::closetimeout(timeout);
283 } 
284 void welcome_com::sysinfo(){
285     std::stringstream versionstream,timestream;
286     versionstream<<"[Version:"<<vernum1<<"."<<vernum2<<"."<<vernum3<<"."<<verpatch<<"]";
287     timestream<<sysstarttime<<"(ms)]";
288     if(verpatch<0) versionstream<<"[TestEdition]";
289     string versionstring,timestring;
290     versionstream>>versionstring;
291     timestream>>timestring;
292     timestring="[System start time:"+timestring;
293     out_com::println("[Command Operatoring System]");
294     out_com::println("[This system is designed by CDsidi.]");
295     out_com::println(versionstring);
296     if(sysstarttime!=-1){
297         out_com::println(timestring);
298     }
299 }
300 void welcome_com::advertisements(){
301     if(verpatch<=-1){
302         out_com::println("********Test Edition: No Advertisement*********");
303         return;
304     }
305     out_com::println("****************以下是广告*************");
306     out_com::println("_______广告 1_________ ");    
307     out_com::println("如果喜欢ComSys,请捐助我 ");    
308     out_com::println("如果想投放广告,请联系我 ");
309     out_com::println("https://www.cnblogs.com/cdsidi");
310     out_com::println("_______广告 2_________ ");    
311     out_com::println("现在加入 51C SB 派对!");
312     out_com::println("****************广告已结束*************");
313 }
314 void welcome_com::about(){
315     sysinfo();
316     advertisements();
317 };
318 //这里有bug 先不用了 
319 string comsolve_com::varsolve(string s){//将%varname%替换为var的值 
320     string ret=s;
321     int len=s.length(),
322         lastplace=-1;//上一个没有配对的varflag位置 
323     for(int i=0;i<len;++i){
324         if(s.at(i)==code_varflag0){
325             if(lastplace==-1){
326                 lastplace=i;
327             }else{
328                 string varname=s.substr(lastplace+1,i-(lastplace+1));//恰好截取varflag中间的部分 
329                 if(!varname.empty()){
330                     string varstr=storage_com::getvarstr(varname);
331                     if(varstr==storage_com::code_str_void) continue; 
332                     ret.erase(lastplace,i-lastplace+1);//删除ret从lastplace开始,一直到i的部分[lastplace,i]
333                     ret.replace(lastplace,0,varstr);
334                     lastplace=-1;
335                     int tmp=varstr.length()-(varname.length()+2);//当前指针i的变化量
336                     i+=tmp;
337                     len+=tmp;
338                 }else{
339                     //lastplace=i; 
340                 }
341             }
342         }
343     }
344     for(int i=1;i<len;++i){//将两个连续的'%'编程一个'%' 
345         if(ret.at(i)==code_varflag0 && ret.at(i-1)==code_varflag0){
346             ret.erase(i,1);
347             i-=1;
348             len-=1;
349         }
350     }
351     return ret;
352 }
353 void comsolve_com::solve1(string s,int left,int code_raw){
354     int base=code_raw/Max_basic_command,//语言基值 
355         code=code_raw%Max_basic_command;//命令名 
356     int len=s.length();
357     string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 
358     switch(code){
359         case code_unknown:
360             out_com::println("Bad command.
Please type 'help' for help of commands.");break;
361         case code_print:
362             out_com::println(tmp);break;
363         case code_windowscmd:
364             systemio_com::windowscmd(tmp);break;
365         case code_exit:
366             syscore_com::closesys();break;
367         case code_sysinfo:
368             welcome_com::sysinfo();break;
369         case code_help:
370             welcome_com::help();break;
371         case code_var:
372             storage_com::solve0(tmp);break;
373         case code_cls:
374             systemio_com::cleanscr();break;
375         case code_color:
376             systemio_com::changeclr(tmp);break;
377         case code_runtime:
378             cout<<systemio_com::gettime()<<"(ms)"<<endl;break;
379         default:
380             err_com::throwln("Bad Command!");
381     }
382 }
383 void comsolve_com::solve0(string s){
384     int len=s.length();
385     for(int i=0;i<len;++i){//枚举第一级命令的结尾
386         if(strext_com::is_empty_char(s[i])){//如果[i]是空格 
387             string tmp=s.substr(0,i);//不算空格[0,i-1]是否找到一个指令 
388             if(commap[tmp]!=0){
389                 solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空格 
390                 return;
391             }
392         }
393     }
394     //s没有遇到任何空格,传递整个字符串作为第一级命令,第二级命令是空串 
395     solve1(s,len,commap[s]);
396 }
397 void comsolve_com::init(){
398     basic_command[code_print]="print";
399     basic_command[code_windowscmd]="windows";
400     basic_command[code_exit]="exit";
401     basic_command[code_sysinfo]="sysinfo";
402     basic_command[code_help]="help";
403     basic_command[code_var]="var";
404     basic_command[code_cls]="cls";
405     basic_command[code_color]="color";
406     basic_command[code_runtime]="runtime";
407     basic_command_cn[code_print]="输出";
408     basic_command_cn[code_windowscmd]="扩展";
409     basic_command_cn[code_exit]="退出";
410     basic_command_cn[code_sysinfo]="系统信息";
411     basic_command_cn[code_help]="帮助";
412     basic_command_cn[code_cls]="清屏";
413     basic_command_cn[code_color]="颜色";
414     basic_command_cn[code_runtime]="运行时间"; 
415     for(int i=0;i<Max_basic_command;++i)
416         commap[basic_command[i]]=i+codecom_base_en;
417     for(int i=0;i<Max_basic_command;++i)
418         commap[basic_command_cn[i]]=i+codecom_base_cn;
419 }
420 void systemio_com::cleanscr(){
421     system("cls");
422 }
423 void syscore_com::welcomescr(string message){//启动和关闭屏幕 (通过message传递) 
424     systemio_com::cleanscr();
425     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
426     for(int i=1;i<=cnt_emptyl/2;++i)out_com::print("
");
427     welcome_com::about();
428     out_com::println(message);
429     for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("
");
430     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
431 }
432 void welcome_com::help(){
433     out_com::println("************Start of help*****************");
434     out_com::println("1.    command 'print': ");
435     out_com::println("print {string} System will say {string}.");
436     out_com::println("eg. print Hello!");
437     out_com::println("2.    command 'exit': ");
438     out_com::println("System will close.");
439     out_com::println("eg. exit");
440     out_com::println("3.    command 'sysinfo': ");
441     out_com::println("System will show the information of the System.");
442     out_com::println("eg. sysinfo");
443     out_com::println("4.    command 'help': ");
444     out_com::println("System will show the commands of the System.");
445     out_com::println("eg. help");
446     out_com::println("5.    command 'windows': ");
447     out_com::println("windows {string} system will do it in Windows cmd.exe");
448     out_com::println("eg. windows echo hello");    
449     out_com::println("6.    command 'cls': ");
450     out_com::println("System will clean the screen.");
451     out_com::println("eg. cls");    
452     out_com::println("7.     command 'color':");
453     out_com::println("System will change the color to {string}");
454     out_com::println("eg. color 0a");
455     out_com::println("8.    command 'runtime': ");
456     out_com::println("System will show the runtime(ms)");
457     out_com::println("eg. runtime");
458     out_com::println("************End of help*****************");
459 }
460 void syscore_com::startsys(){
461     systemio_com::changeclr("0f");
462     systemio_com::windowscmd("title ComSys");
463     welcomescr("Starting...");
464     initsys();
465     systemio_com::sleep_until(waitms);
466     systemio_com::cleanscr();
467     out_com::println("System has got ready.");
468     sysmain();
469 } 
470 void syscore_com::initsys(){
471     storage_com::init();
472     comsolve_com::init();
473 }
474 void syscore_com::closesys(){
475     systemio_com::cleanscr();
476     welcomescr("System is shutting down...");
477     systemio_com::sleep(waitms);
478     out_com::println("Press any key to exit.");
479     systemio_com::windowscmd("pause >nul");
480     systemio_com::progexit(0);
481 }
482 void syscore_com::closetimeout(int m_secs){
483     printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000);
484     systemio_com::sleep(m_secs);
485     closesys();
486 }
487 void syscore_com::sysmain(){
488     welcome_com::sysstarttime=systemio_com::gettime();
489     string s;
490     while(1){
491         out_com::print(">");
492         in_com::readln(s);
493         strext_com::trim(s);//去掉首尾空格 
494         if(!s.empty())
495             comsolve_com::solve0(s);
496     }
497 }
498 int storage_com::getInteger(string name){
499     varinfo var=varmap[name];
500     if(var.type==code_integer){
501         return Ints[var.address];
502     }else{
503         err_com::throwln(code_err_wrongtype);
504         return 0;
505     }
506 }
507 double storage_com::getFloating(string name){
508     varinfo var=varmap[name];
509     if(var.type==code_floating){
510         return Floats[var.address];
511     }else{
512         err_com::throwln(code_err_wrongtype);
513         return 0;
514     }
515 }
516 string storage_com::getString(string name){
517     varinfo var=varmap[name];
518     if(var.type==code_string){
519         return Strings[var.address];
520     }else{
521         err_com::throwln(code_err_wrongtype);
522         return "";
523     }
524 }
525 void storage_com::putvalue(string name,long long val){
526     varinfo var=varmap[name];
527     if(var.type==code_void){
528         Ints.push_back(val);
529         var=varinfo(name,code_integer,Ints.size()-1);
530         varmap[name]=var;
531     }else if(var.type==code_integer){//此变量存在 
532         Ints[var.address]=val;
533     }else{//注意,以下会出现在内存池中变量的内存泄露 
534         Ints.push_back(val);
535         var=varinfo(name,code_integer,Ints.size()-1);
536         varmap[name]=var;
537         //将之前的存储信息覆盖(之前的内存将永远无法用到) 
538     }    
539 }
540 void storage_com::putvalue(string name,int val){
541     putvalue(name,val);
542 }
543 void storage_com::putvalue(string name,string val){
544     varinfo var=varmap[name];
545     if(var.type==code_void){
546         Strings.push_back(val);
547         var=varinfo(name,code_string,Strings.size()-1);
548         varmap[name]=var;
549     }else if(var.type==code_string){
550         Strings[var.address]=val;
551     }else{ 
552         Strings.push_back(val);
553         var=varinfo(name,code_string,Strings.size()-1);
554         varmap[name]=var;
555     }
556 }
557 void storage_com::putvalue(string name,double val){
558     varinfo var=varmap[name];
559     const int type=var.type;
560     if(type==code_void){
561         Floats.push_back(val);
562         var=varinfo(name,code_floating,Floats.size()-1);
563         varmap[name]=var;
564     }else if(type==code_floating){
565         Floats[var.address]=val;
566     }else{ 
567         Floats.push_back(val);
568         var=varinfo(name,code_floating,Floats.size()-1);
569         varmap[name]=var;
570     }
571 }
572 int storage_com::gettype(string name){
573     varinfo ret=varmap[name];
574     return ret.type;    
575 }
576 string storage_com::getvarstr(varinfo var){
577     const int type=var.type,address=var.address;
578     string ret;
579     std::stringstream stream;
580     if(type==code_integer){
581         stream<<Ints.at(address);
582     }else if (type==code_string){
583         stream<<Strings.at(address);
584     }else if (type==code_floating){
585         stream<<Floats.at(address);
586     }else{
587         return code_str_void;
588     }
589     stream>>ret;
590     return ret;
591 }
592 string storage_com::getvarstr(string name){
593     varinfo var=varmap[name];
594     return getvarstr(var);
595 }
596 void storage_com::printvarstr(string name){
597     out_com::print(getvarstr(name));
598 }
599 void storage_com::printvarstrln(string name){
600     out_com::println(getvarstr(name));
601 }
602 /*下面的未完结 */
603 void storage_com::solve0(string s){//s是storage命令处理 
604     int len=s.length();
605     strext_com::trim(s);
606     for(int i=0;i<len;++i){//枚举i,一直到结尾 
607         if(strext_com::is_empty_char(s[i])){//分格的空格s[i]
608             string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名
609             varinfo tmpinfo=varmap[tmp]; 
610             //不管这个变量存不存在 ,都转交下层处理 [i+1,end]跳过刚才的空白 
611             //solve1(s,i+1,tmpinfo);
612             return;//分隔符之后的不再处理 
613         }
614     }
615     err_com::throwln("Var Command Error.");
616 }
617 /*未完结 
618 void storage_com::solve1(string str,int left,varinfo var){
619     int len=str.length();
620     string s=str.substr(left,len-left);
621     for(int i=0;i<len;++i){
622         if(strext_com::is_empty_char(s[i]))
623     }
624     string type_tmp=s.strstr(0,)
625 }*/
626 void storage_com::init(){
627     vector<Integer>().swap(Ints);
628     vector<Floating>().swap(Floats);
629     vector<String>().swap(Strings);
630     map<string,varinfo>().swap(varmap);
631     map<string,type_t>().swap(typemap);
632     typemap[code_str_void]=code_void;
633     typemap[code_str_integer]=code_integer;
634     typemap[code_str_floating]=code_floating;
635     typemap[code_str_string]=code_string;
636 }
637 int main(){
638     syscore_com::startsys();
639     return 0;
640 }
0.2.0.1
  1 /*每个类依赖功能的类:
  2     comsolve_com:几乎所有
  3     err_com: syscore_com systemio_com out_com
  4     in_com:无
  5     out_com:无
  6     storage_com:懒得写了
  7     strext_com:无
  8     syscore_com:
  9         systemio_com
 10         out_com
 11         storage_com
 12         comsolve_com
 13         in_com
 14         strext_com
 15     systemio_com: 无
 16     welcome_com: out_com
 17 */
 18 /************更新日志*************************** 
 19 0.0.1:    基本的框架和命令基础 
 20 0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备
 21 0.1.0: 在底层支持了Integer类型 
 22 0.1.1: 优化了用户交互、完善了代码注释 
 23 0.1.2: 添加了广告
 24 0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 
 25 0.1.4:    1.添加了"cls"指令 用于清屏 
 26         2. storage 已经支持Integer/Floating/String全类型 
 27         3. 现在命令首尾如果有空格会自动忽略(trim函数) 
 28         4.支持通过varinfo string 来输出变量的内容 
 29 0.1.4 patch 1: 1.修复了bug;添加了 cls 指令在help内 
 30 0.1.5:    1.添加了syscore_com 类 拆分了welcome_com的一些功能
 31          2.整合了开始屏幕和关闭屏幕欢迎信息
 32         3.添加了"welcome::about()"包含系统信息和广告 
 33         4.更改了版本号系统[x.x.x.x] 最后一位是补丁号 
 34 0.2.0:    TestEdition 1:
 35         1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度 
 36         2.现在版本号已经包含在welcome_com中
 37         3.已经在comsolve_com里添加了中文命令的定义 
 38         Test Edition 2:
 39         4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
 40         5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖) 
 41         6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition] 
 42         7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
 43         8.重磅更新:comsolve_com::varsole(string s)已经可用
 44             用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它” 
 45         9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
 46         10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色 
 47         11.优化了多语言 
 48         patch 0:
 49         12.为正式版优化GUI  
 50         13.添加了runtime 命令 获取系统从开始到当前时刻的时间 
 51         14.补全了测试版的一些命令相关(中文,help)
 52         patch 1:
 53         1.完善了注释
 54         2.sysinfo 修复bug:系统启动时间显示没有冒号
 55         3.新功能:现在程序标题栏会显示ComSys
 56         4.systemio_com::重写了sleep(int),添加了sleep_until(int),
 57         5.令syscore_com::startsys改用sleep_until 加快启动时间
 58         6.对storage_com 的整理 
 59 ***********************************************/ 
 60 #include<iostream>
 61 #include<string>
 62 #include<cstdlib> 
 63 #include<vector>
 64 #include<map>
 65 #include<ctime>
 66 #include<cstdio>
 67 #include<sstream>
 68 using std::cin;
 69 using std::cout;
 70 using std::string;
 71 using std::endl;
 72 using std::vector;
 73 using std::map;
 74 class strext_com{//字符串处理扩展功能 
 75     public:
 76         static void trim(string &s){//删除字符串首尾空格 
 77             if(s.empty()) return;
 78             s.erase(0,s.find_first_not_of(' '));
 79                 s.erase(s.find_last_not_of(' ') + 1);
 80         }
 81         static bool is_empty_char(char c){
 82             return c==' '|| c=='
';
 83         }
 84 };
 85 class out_com{//字符串输出 
 86     public:
 87         static void print(string s);//输出 
 88         static void print(string s,int from);//从第from开始输出,一直到最后 
 89         static void println(string s);//输出并换行 
 90         static void println(string s,int from);//从from开始输出,并换行     
 91 };
 92 class err_com{//错误处理 
 93     public:
 94     static void throwln(string s);//输出错误信息 
 95     static void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 
 96 };
 97 class fileio_com{//文件输入输出(还没写)
 98 };
 99 class in_com{//字符串输入 
100     public:
101         static void read(string &s);//输入(空白作结尾符号) 
102         static void readln(string &s); //输入(换行作结尾符号) 
103 };
104 class systemio_com{ //依赖于Windows io的功能 
105     public:                 
106     static void windowscmd(string s){//直接在cmd里面执行指令 
107         system(s.c_str());
108     }
109     static progexit(int code){//退出程序并且错误码为code 
110         exit(code);
111     }
112     static void cleanscr();//清屏 
113     static sleep_until(int k){ //暂停到k毫秒 
114         while(gettime()<=k);
115     }
116     static sleep(int k){//暂停k毫秒
117         sleep_until(gettime()+k);
118     }
119     static void changeclr(string s){//改变程序颜色 
120         string tmp="color "+s;
121         system(tmp.c_str());
122     }
123     static int gettime(){ //获取程序运行的时间 
124         return clock();
125     }
126 };
127 class welcome_com{//系统欢迎与用户界面(并不是系统核心) 
128     public:
129         static const int vernum1=0,vernum2=2,vernum3=0,verpatch=1;
130         static int sysstarttime;//系统启动的时间 
131         static void sysinfo();//系统信息 
132         static void help();//输出帮助信息
133         static void advertisements();//输出广告 
134         static void about();//输出关于信息 
135 };
136 int welcome_com::sysstarttime=-1;//开机之前,sysstarttime初始值-1毫秒 
137 class storage_com{//存储管理 
138     public:
139         static const int code_void=0,//空类型 
140                         code_integer=1,//整数 
141                         code_floating=2,//浮点数 
142                         code_string=3;//字符串
143         struct varinfo{//保存变量信息的数据结构 
144             string name;
145             int type;
146             int address;
147             varinfo(int a=0,int b=0):type(a),address(b){}
148             varinfo(string a,int b,int c):name(a),type(b),address(c){}
149         };
150         typedef int type_t;//存储类型的类型 
151         typedef long long Integer;//Integer:long long
152         typedef double Floating;//Floating: double
153         typedef string String;//String: string
154         static vector<Integer> Ints;//保存Integer 的数组 
155         static vector<Floating> Floats;//保存Floating的数组 
156         static vector<String> Strings;//保存String的数组 
157         static map<string,varinfo> varmap;//string->varinfo的映射 
158         static map<string,type_t> typemap;//string->type的映射 
159         static const string
160             code_str_void,
161             code_str_integer,
162             code_str_floating,
163             code_str_string;
164         static const string
165             code_err_wrongtype;
166     public:
167         storage(){}
168         static void init();
169         static int gettype(string name);//获得变量名name的类型 
170         static void putvalue(string name,long long val);//将变量名name的值设为val
171         static void putvalue(string name,int val); 
172         static void putvalue(string name,string val);
173         static void putvalue(string name,double val);
174         static int getInteger(string name);//获得name的int值 
175         static String getString(string name);
176         static double getFloating(string name);
177         static string getvarstr(varinfo var);
178         static string getvarstr(string name);
179         static void printvarstr(string name);
180         static void printvarstrln(string name);
181         static void solve0(string command);
182 
183 };
184 const string storage_com::code_str_void="VOID",
185             storage_com::code_str_integer="INTEGER",
186             storage_com::code_str_floating="FLOATING",
187             storage_com::code_str_string="STRING",
188             storage_com::code_err_wrongtype="Wrong Type";
189 vector<storage_com::Integer> storage_com::Ints;//保存Integer 的数组 
190 vector<storage_com::Floating> storage_com::Floats;//保存Floating的数组 
191 vector<storage_com::String> storage_com::Strings;//保存String的数组 
192 map<string,storage_com::varinfo> storage_com::varmap;//string->varinfo的映射 
193 map<string,storage_com::type_t> storage_com::typemap;
194 class syscore_com{//系统核心
195     public:
196         static const int cnt_stars=80,cnt_emptyl=8,waitms=3000;
197         static const string version;//版本号提示
198         static void closesys();//关闭系统 
199         static void startsys();//启动和初始化 
200         static void initsys();//延迟初始化 
201         static void closetimeout(int m_secs);//延迟关闭(毫秒) 
202         static void welcomescr(string message);//开始和关闭画面 
203         static void sysmain();//系统运行的重要内容 
204 };
205 class comsolve_com{//指令处理 
206     public:
207         static const int Max_basic_command=100;//最大命令数目(现在只有8个) 
208         static const int
209             codecom_base_en=Max_basic_command*0,
210             codecom_base_cn=Max_basic_command*1;        
211         static const int 
212             code_unknown=0,//错误指令 
213             code_print=1,
214             code_windowscmd=2,
215             code_exit=3,
216             code_sysinfo=4,
217             code_help=5,
218             code_var=6,
219             code_cls=7,
220             code_color=8,
221             code_runtime=9;
222         static const char 
223             code_varflag0='%';//变量出现的标志 
224         static string basic_command_cn[Max_basic_command];
225         static string basic_command[Max_basic_command];//指令代号->指令名的映射 
226         static map<string,int> commap;//指令名->指令代号的映射 
227     private:
228         //static void push_command(string s,int code,int codebase);
229     public:
230         static void init();//初始化 
231         static void solve0(string s);//第一步处理
232         static void solve1(string s,int left,int code_raw);//第二步命令处理 
233         static string varsolve(string s);//把字符串中的变量替换成所代表的的值
234 };
235 string comsolve_com::basic_command[Max_basic_command];//指令代号->指令名的映射
236 string comsolve_com::basic_command_cn[Max_basic_command]; 
237 map<string,int> comsolve_com::commap;//指令名->指令代号的映射 
238 class System_com{//基本功能(几乎无需初始化) 
239     public:
240         out_com out;
241         err_com err;
242         in_com in;
243         systemio_com sysio;
244         fileio_com fileio;
245         welcome_com wel;
246         syscore_com syscore;
247     System_com(){}
248 };
249 class Systemext_com{//基本拓展功能(可能需要初始化) 
250     public:
251         storage_com var;
252         comsolve_com comsolve;
253     Systemext_com(){}
254 }; 
255 void out_com::print(string s){
256     print(s,0);
257 }
258 void out_com::println(string s){
259     println(s,0);
260 }
261 void out_com::print(string s,int from){
262     int len=s.length();
263     string s1=s.substr(from,len-from);
264     cout<<s1;
265 }
266 void out_com::println(string s,int from){
267     print(s,from);cout<<endl;
268 }
269 void in_com::read(string &s){
270     cin>>s;
271 }
272 void in_com::readln(string &s){
273     getline(cin,s);
274 }
275 void err_com::throwln(string s){
276     systemio_com::windowscmd("color 1f"); //color 1 3 9是蓝色 
277     out_com::println("System Error:There is a problem:");
278     out_com::println(s);
279 }
280 void err_com::throwshut(string s,int timeout){
281     throwln(s);
282     syscore_com::closetimeout(timeout);
283 } 
284 void welcome_com::sysinfo(){
285     std::stringstream versionstream,timestream;
286     versionstream<<"[Version:"<<vernum1<<"."<<vernum2<<"."<<vernum3<<"."<<verpatch<<"]";
287     timestream<<sysstarttime<<"(ms)]";
288     if(verpatch<0) versionstream<<"[TestEdition]";
289     string versionstring,timestring;
290     versionstream>>versionstring;
291     timestream>>timestring;
292     timestring="[System start time:"+timestring;
293     out_com::println("[Command Operatoring System]");
294     out_com::println("[This system is designed by CDsidi.]");
295     out_com::println(versionstring);
296     if(sysstarttime!=-1){
297         out_com::println(timestring);
298     }
299 }
300 void welcome_com::advertisements(){
301     if(verpatch<=-1){
302         out_com::println("********Test Edition: No Advertisement*********");
303         return;
304     }
305     out_com::println("****************以下是广告*************");
306     out_com::println("_______广告 1_________ ");    
307     out_com::println("如果喜欢ComSys,请捐助我 ");    
308     out_com::println("如果想投放广告,请联系我 ");
309     out_com::println("https://www.cnblogs.com/cdsidi");
310     out_com::println("_______广告 2_________ ");    
311     out_com::println("现在加入 51C SB 派对!");
312     out_com::println("****************广告已结束*************");
313 }
314 void welcome_com::about(){
315     sysinfo();
316     advertisements();
317 };
318 //这里有bug 先不用了 
319 string comsolve_com::varsolve(string s){//将%varname%替换为var的值 
320     string ret=s;
321     int len=s.length(),
322         lastplace=-1;//上一个没有配对的varflag位置 
323     for(int i=0;i<len;++i){
324         if(s.at(i)==code_varflag0){
325             if(lastplace==-1){
326                 lastplace=i;
327             }else{
328                 string varname=s.substr(lastplace+1,i-(lastplace+1));//恰好截取varflag中间的部分 
329                 if(!varname.empty()){
330                     string varstr=storage_com::getvarstr(varname);
331                     if(varstr==storage_com::code_str_void) continue; 
332                     ret.erase(lastplace,i-lastplace+1);//删除ret从lastplace开始,一直到i的部分[lastplace,i]
333                     ret.replace(lastplace,0,varstr);
334                     lastplace=-1;
335                     int tmp=varstr.length()-(varname.length()+2);//当前指针i的变化量
336                     i+=tmp;
337                     len+=tmp;
338                 }else{
339                     //lastplace=i; 
340                 }
341             }
342         }
343     }
344     for(int i=1;i<len;++i){//将两个连续的'%'编程一个'%' 
345         if(ret.at(i)==code_varflag0 && ret.at(i-1)==code_varflag0){
346             ret.erase(i,1);
347             i-=1;
348             len-=1;
349         }
350     }
351     return ret;
352 }
353 void comsolve_com::solve1(string s,int left,int code_raw){
354     int base=code_raw/Max_basic_command,//语言基值 
355         code=code_raw%Max_basic_command;//命令名 
356     int len=s.length();
357     string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 
358     switch(code){
359         case code_unknown:
360             out_com::println("Bad command.
Please type 'help' for help of commands.");break;
361         case code_print:
362             out_com::println(tmp);break;
363         case code_windowscmd:
364             systemio_com::windowscmd(tmp);break;
365         case code_exit:
366             syscore_com::closesys();break;
367         case code_sysinfo:
368             welcome_com::sysinfo();break;
369         case code_help:
370             welcome_com::help();break;
371         case code_var:
372             storage_com::solve0(tmp);break;
373         case code_cls:
374             systemio_com::cleanscr();break;
375         case code_color:
376             systemio_com::changeclr(tmp);break;
377         case code_runtime:
378             cout<<systemio_com::gettime()<<"(ms)"<<endl;break;
379         default:
380             err_com::throwln("Bad Command!");
381     }
382 }
383 void comsolve_com::solve0(string s){
384     int len=s.length();
385     for(int i=0;i<len;++i){//枚举第一级命令的结尾
386         if(strext_com::is_empty_char(s[i])){//如果[i]是空格 
387             string tmp=s.substr(0,i);//不算空格[0,i-1]是否找到一个指令 
388             if(commap[tmp]!=0){
389                 solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空格 
390                 return;
391             }
392         }
393     }
394     //s没有遇到任何空格,传递整个字符串作为第一级命令,第二级命令是空串 
395     solve1(s,len,commap[s]);
396 }
397 void comsolve_com::init(){
398     basic_command[code_print]="print";
399     basic_command[code_windowscmd]="windows";
400     basic_command[code_exit]="exit";
401     basic_command[code_sysinfo]="sysinfo";
402     basic_command[code_help]="help";
403     basic_command[code_var]="var";
404     basic_command[code_cls]="cls";
405     basic_command[code_color]="color";
406     basic_command[code_runtime]="runtime";
407     basic_command_cn[code_print]="输出";
408     basic_command_cn[code_windowscmd]="扩展";
409     basic_command_cn[code_exit]="退出";
410     basic_command_cn[code_sysinfo]="系统信息";
411     basic_command_cn[code_help]="帮助";
412     basic_command_cn[code_cls]="清屏";
413     basic_command_cn[code_color]="颜色";
414     basic_command_cn[code_runtime]="运行时间"; 
415     for(int i=0;i<Max_basic_command;++i)
416         commap[basic_command[i]]=i+codecom_base_en;
417     for(int i=0;i<Max_basic_command;++i)
418         commap[basic_command_cn[i]]=i+codecom_base_cn;
419 }
420 void systemio_com::cleanscr(){
421     system("cls");
422 }
423 void syscore_com::welcomescr(string message){//启动和关闭屏幕 (通过message传递) 
424     systemio_com::cleanscr();
425     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
426     for(int i=1;i<=cnt_emptyl/2;++i)out_com::print("
");
427     welcome_com::about();
428     out_com::println(message);
429     for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("
");
430     for(int i=1;i<=cnt_stars;++i)out_com::print("*");
431 }
432 void welcome_com::help(){
433     out_com::println("************Start of help*****************");
434     out_com::println("1.    command 'print': ");
435     out_com::println("print {string} System will say {string}.");
436     out_com::println("eg. print Hello!");
437     out_com::println("2.    command 'exit': ");
438     out_com::println("System will close.");
439     out_com::println("eg. exit");
440     out_com::println("3.    command 'sysinfo': ");
441     out_com::println("System will show the information of the System.");
442     out_com::println("eg. sysinfo");
443     out_com::println("4.    command 'help': ");
444     out_com::println("System will show the commands of the System.");
445     out_com::println("eg. help");
446     out_com::println("5.    command 'windows': ");
447     out_com::println("windows {string} system will do it in Windows cmd.exe");
448     out_com::println("eg. windows echo hello");    
449     out_com::println("6.    command 'cls': ");
450     out_com::println("System will clean the screen.");
451     out_com::println("eg. cls");    
452     out_com::println("7.     command 'color':");
453     out_com::println("System will change the color to {string}");
454     out_com::println("eg. color 0a");
455     out_com::println("8.    command 'runtime': ");
456     out_com::println("System will show the runtime(ms)");
457     out_com::println("eg. runtime");
458     out_com::println("************End of help*****************");
459 }
460 void syscore_com::startsys(){
461     systemio_com::changeclr("0f");
462     systemio_com::windowscmd("title ComSys");
463     welcomescr("Starting...");
464     initsys();
465     systemio_com::sleep_until(waitms);
466     systemio_com::cleanscr();
467     out_com::println("System has got ready.");
468     sysmain();
469 } 
470 void syscore_com::initsys(){
471     storage_com::init();
472     comsolve_com::init();
473 }
474 void syscore_com::closesys(){
475     systemio_com::cleanscr();
476     welcomescr("System is shutting down...");
477     systemio_com::sleep(waitms);
478     out_com::println("Press any key to exit.");
479     systemio_com::windowscmd("pause >nul");
480     systemio_com::progexit(0);
481 }
482 void syscore_com::closetimeout(int m_secs){
483     printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000);
484     systemio_com::sleep(m_secs);
485     closesys();
486 }
487 void syscore_com::sysmain(){
488     welcome_com::sysstarttime=systemio_com::gettime();
489     string s;
490     while(1){
491         out_com::print(">");
492         in_com::readln(s);
493         strext_com::trim(s);//去掉首尾空格 
494         if(!s.empty())
495             comsolve_com::solve0(s);
496     }
497 }
498 int storage_com::getInteger(string name){
499     varinfo var=varmap[name];
500     if(var.type==code_integer){
501         return Ints[var.address];
502     }else{
503         err_com::throwln(code_err_wrongtype);
504         return 0;
505     }
506 }
507 double storage_com::getFloating(string name){
508     varinfo var=varmap[name];
509     if(var.type==code_floating){
510         return Floats[var.address];
511     }else{
512         err_com::throwln(code_err_wrongtype);
513         return 0;
514     }
515 }
516 string storage_com::getString(string name){
517     varinfo var=varmap[name];
518     if(var.type==code_string){
519         return Strings[var.address];
520     }else{
521         err_com::throwln(code_err_wrongtype);
522         return "";
523     }
524 }
525 void storage_com::putvalue(string name,long long val){
526     varinfo var=varmap[name];
527     if(var.type==code_void){
528         Ints.push_back(val);
529         var=varinfo(name,code_integer,Ints.size()-1);
530         varmap[name]=var;
531     }else if(var.type==code_integer){//此变量存在 
532         Ints[var.address]=val;
533     }else{//注意,以下会出现在内存池中变量的内存泄露 
534         Ints.push_back(val);
535         var=varinfo(name,code_integer,Ints.size()-1);
536         varmap[name]=var;
537         //将之前的存储信息覆盖(之前的内存将永远无法用到) 
538     }    
539 }
540 void storage_com::putvalue(string name,int val){
541     putvalue(name,val);
542 }
543 void storage_com::putvalue(string name,string val){
544     varinfo var=varmap[name];
545     if(var.type==code_void){
546         Strings.push_back(val);
547         var=varinfo(name,code_string,Strings.size()-1);
548         varmap[name]=var;
549     }else if(var.type==code_string){
550         Strings[var.address]=val;
551     }else{ 
552         Strings.push_back(val);
553         var=varinfo(name,code_string,Strings.size()-1);
554         varmap[name]=var;
555     }
556 }
557 void storage_com::putvalue(string name,double val){
558     varinfo var=varmap[name];
559     const int type=var.type;
560     if(type==code_void){
561         Floats.push_back(val);
562         var=varinfo(name,code_floating,Floats.size()-1);
563         varmap[name]=var;
564     }else if(type==code_floating){
565         Floats[var.address]=val;
566     }else{ 
567         Floats.push_back(val);
568         var=varinfo(name,code_floating,Floats.size()-1);
569         varmap[name]=var;
570     }
571 }
572 int storage_com::gettype(string name){
573     varinfo ret=varmap[name];
574     return ret.type;    
575 }
576 string storage_com::getvarstr(varinfo var){
577     const int type=var.type,address=var.address;
578     string ret;
579     std::stringstream stream;
580     if(type==code_integer){
581         stream<<Ints.at(address);
582     }else if (type==code_string){
583         stream<<Strings.at(address);
584     }else if (type==code_floating){
585         stream<<Floats.at(address);
586     }else{
587         return code_str_void;
588     }
589     stream>>ret;
590     return ret;
591 }
592 string storage_com::getvarstr(string name){
593     varinfo var=varmap[name];
594     return getvarstr(var);
595 }
596 void storage_com::printvarstr(string name){
597     out_com::print(getvarstr(name));
598 }
599 void storage_com::printvarstrln(string name){
600     out_com::println(getvarstr(name));
601 }
602 /*下面的未完结 */
603 void storage_com::solve0(string s){//s是storage命令处理 
604     int len=s.length();
605     strext_com::trim(s);
606     for(int i=0;i<len;++i){//枚举i,一直到结尾 
607         if(strext_com::is_empty_char(s[i])){//分格的空格s[i]
608             string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名
609             varinfo tmpinfo=varmap[tmp]; 
610             //不管这个变量存不存在 ,都转交下层处理 [i+1,end]跳过刚才的空白 
611             //solve1(s,i+1,tmpinfo);
612             return;//分隔符之后的不再处理 
613         }
614     }
615     err_com::throwln("Var Command Error.");
616 }
617 /*未完结 
618 void storage_com::solve1(string str,int left,varinfo var){
619     int len=str.length();
620     string s=str.substr(left,len-left);
621     for(int i=0;i<len;++i){
622         if(strext_com::is_empty_char(s[i]))
623     }
624     string type_tmp=s.strstr(0,)
625 }*/
626 void storage_com::init(){
627     vector<Integer>().swap(Ints);
628     vector<Floating>().swap(Floats);
629     vector<String>().swap(Strings);
630     map<string,varinfo>().swap(varmap);
631     map<string,type_t>().swap(typemap);
632     typemap[code_str_void]=code_void;
633     typemap[code_str_integer]=code_integer;
634     typemap[code_str_floating]=code_floating;
635     typemap[code_str_string]=code_string;
636 }
637 int main(){
638     syscore_com::startsys();
639     return 0;
640 }
ComSys
/*每个类依赖功能的类:
    comsolve_com:几乎所有
    err_com: syscore_com systemio_com out_com
    in_com:无
    out_com:无
    storage_com:懒得写了
    strext_com:无
    syscore_com:
        systemio_com
        out_com
        storage_com
        comsolve_com
        in_com
        strext_com
    systemio_com: 无
    welcome_com: out_com
*/
/************更新日志*************************** 
0.0.1:    基本的框架和命令基础 
0.0.2: 优化了GUI,添加了启动和关闭画面,为fileio做下早期准备
0.1.0: 在底层支持了Integer类型 
0.1.1: 优化了用户交互、完善了代码注释 
0.1.2: 添加了广告
0.1.3:重构代码,将System里面的类 拆分开来,为多文件编程打下基础 
0.1.4:    1.添加了"cls"指令 用于清屏 
        2. storage 已经支持Integer/Floating/String全类型 
        3. 现在命令首尾如果有空格会自动忽略(trim函数) 
        4.支持通过varinfo string 来输出变量的内容 
0.1.4 patch 1: 1.修复了bug;添加了 cls 指令在help内 
0.1.5:    1.添加了syscore_com 类 拆分了welcome_com的一些功能
         2.整合了开始屏幕和关闭屏幕欢迎信息
        3.添加了"welcome::about()"包含系统信息和广告 
        4.更改了版本号系统[x.x.x.x] 最后一位是补丁号 
0.2.0:    TestEdition 1:
        1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度 
        2.现在版本号已经包含在welcome_com中
        3.已经在comsolve_com里添加了中文命令的定义 
        Test Edition 2:
        4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
        5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖) 
        6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition] 
        7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
        8.重磅更新:comsolve_com::varsole(string s)已经可用
            用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它” 
        9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
        10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色 
        11.优化了多语言 
        patch 0:
        12.为正式版优化GUI  
        13.添加了runtime 命令 获取系统从开始到当前时刻的时间 
        14.补全了测试版的一些命令相关(中文,help)
        patch 1:
        1.完善了注释
        2.sysinfo 修复bug:系统启动时间显示没有冒号
        3.新功能:现在程序标题栏会显示ComSys
        4.systemio_com::重写了sleep(int),添加了sleep_until(int),
        5.令syscore_com::startsys改用sleep_until 加快启动时间
        6.对storage_com 的整理 
***********************************************/ 
#include<iostream>
#include<string>
#include<cstdlib> 
#include<vector>
#include<map>
#include<ctime>
#include<cstdio>
#include<sstream>
using std::cin;
using std::cout;
using std::string;
using std::endl;
using std::vector;
using std::map;
class strext_com{//字符串处理扩展功能 
    public:
        static void trim(string &s){//删除字符串首尾空格 
            if(s.empty()) return;
            s.erase(0,s.find_first_not_of(' '));
                s.erase(s.find_last_not_of(' ') + 1);
        }
        static bool is_empty_char(char c){
            return c==' '|| c=='
';
        }
};
class out_com{//字符串输出 
    public:
        static void print(string s);//输出 
        static void print(string s,int from);//从第from开始输出,一直到最后 
        static void println(string s);//输出并换行 
        static void println(string s,int from);//从from开始输出,并换行     
};
class err_com{//错误处理 
    public:
    static void throwln(string s);//输出错误信息 
    static void throwshut(string s,int timeout);//输出错误信息并且在timeout毫秒后关闭程序 
};
class fileio_com{//文件输入输出(还没写)
};
class in_com{//字符串输入 
    public:
        static void read(string &s);//输入(空白作结尾符号) 
        static void readln(string &s); //输入(换行作结尾符号) 
};
class systemio_com{ //依赖于Windows io的功能 
    public:                 
    static void windowscmd(string s){//直接在cmd里面执行指令 
        system(s.c_str());
    }
    static progexit(int code){//退出程序并且错误码为code 
        exit(code);
    }
    static void cleanscr();//清屏 
    static sleep_until(int k){ //暂停到k毫秒 
        while(gettime()<=k);
    }
    static sleep(int k){//暂停k毫秒
        sleep_until(gettime()+k);
    }
    static void changeclr(string s){//改变程序颜色 
        string tmp="color "+s;
        system(tmp.c_str());
    }
    static int gettime(){ //获取程序运行的时间 
        return clock();
    }
};
class welcome_com{//系统欢迎与用户界面(并不是系统核心) 
    public:
        static const int vernum1=0,vernum2=2,vernum3=0,verpatch=1;
        static int sysstarttime;//系统启动的时间 
        static void sysinfo();//系统信息 
        static void help();//输出帮助信息
        static void advertisements();//输出广告 
        static void about();//输出关于信息 
};
int welcome_com::sysstarttime=-1;//开机之前,sysstarttime初始值-1毫秒 
class storage_com{//存储管理 
    public:
        static const int code_void=0,//空类型 
                        code_integer=1,//整数 
                        code_floating=2,//浮点数 
                        code_string=3;//字符串
        struct varinfo{//保存变量信息的数据结构 
            string name;
            int type;
            int address;
            varinfo(int a=0,int b=0):type(a),address(b){}
            varinfo(string a,int b,int c):name(a),type(b),address(c){}
        };
        typedef int type_t;//存储类型的类型 
        typedef long long Integer;//Integer:long long
        typedef double Floating;//Floating: double
        typedef string String;//String: string
        static vector<Integer> Ints;//保存Integer 的数组 
        static vector<Floating> Floats;//保存Floating的数组 
        static vector<String> Strings;//保存String的数组 
        static map<string,varinfo> varmap;//string->varinfo的映射 
        static map<string,type_t> typemap;//string->type的映射 
        static const string
            code_str_void,
            code_str_integer,
            code_str_floating,
            code_str_string;
        static const string
            code_err_wrongtype;
    public:
        storage(){}
        static void init();
        static int gettype(string name);//获得变量名name的类型 
        static void putvalue(string name,long long val);//将变量名name的值设为val
        static void putvalue(string name,int val); 
        static void putvalue(string name,string val);
        static void putvalue(string name,double val);
        static int getInteger(string name);//获得name的int值 
        static String getString(string name);
        static double getFloating(string name);
        static string getvarstr(varinfo var);
        static string getvarstr(string name);
        static void printvarstr(string name);
        static void printvarstrln(string name);
        static void solve0(string command);

};
const string storage_com::code_str_void="VOID",
            storage_com::code_str_integer="INTEGER",
            storage_com::code_str_floating="FLOATING",
            storage_com::code_str_string="STRING",
            storage_com::code_err_wrongtype="Wrong Type";
vector<storage_com::Integer> storage_com::Ints;//保存Integer 的数组 
vector<storage_com::Floating> storage_com::Floats;//保存Floating的数组 
vector<storage_com::String> storage_com::Strings;//保存String的数组 
map<string,storage_com::varinfo> storage_com::varmap;//string->varinfo的映射 
map<string,storage_com::type_t> storage_com::typemap;
class syscore_com{//系统核心
    public:
        static const int cnt_stars=80,cnt_emptyl=8,waitms=3000;
        static const string version;//版本号提示
        static void closesys();//关闭系统 
        static void startsys();//启动和初始化 
        static void initsys();//延迟初始化 
        static void closetimeout(int m_secs);//延迟关闭(毫秒) 
        static void welcomescr(string message);//开始和关闭画面 
        static void sysmain();//系统运行的重要内容 
};
class comsolve_com{//指令处理 
    public:
        static const int Max_basic_command=100;//最大命令数目(现在只有8个) 
        static const int
            codecom_base_en=Max_basic_command*0,
            codecom_base_cn=Max_basic_command*1;        
        static const int 
            code_unknown=0,//错误指令 
            code_print=1,
            code_windowscmd=2,
            code_exit=3,
            code_sysinfo=4,
            code_help=5,
            code_var=6,
            code_cls=7,
            code_color=8,
            code_runtime=9;
        static const char 
            code_varflag0='%';//变量出现的标志 
        static string basic_command_cn[Max_basic_command];
        static string basic_command[Max_basic_command];//指令代号->指令名的映射 
        static map<string,int> commap;//指令名->指令代号的映射 
    private:
        //static void push_command(string s,int code,int codebase);
    public:
        static void init();//初始化 
        static void solve0(string s);//第一步处理
        static void solve1(string s,int left,int code_raw);//第二步命令处理 
        static string varsolve(string s);//把字符串中的变量替换成所代表的的值
};
string comsolve_com::basic_command[Max_basic_command];//指令代号->指令名的映射
string comsolve_com::basic_command_cn[Max_basic_command]; 
map<string,int> comsolve_com::commap;//指令名->指令代号的映射 
class System_com{//基本功能(几乎无需初始化) 
    public:
        out_com out;
        err_com err;
        in_com in;
        systemio_com sysio;
        fileio_com fileio;
        welcome_com wel;
        syscore_com syscore;
    System_com(){}
};
class Systemext_com{//基本拓展功能(可能需要初始化) 
    public:
        storage_com var;
        comsolve_com comsolve;
    Systemext_com(){}
}; 
void out_com::print(string s){
    print(s,0);
}
void out_com::println(string s){
    println(s,0);
}
void out_com::print(string s,int from){
    int len=s.length();
    string s1=s.substr(from,len-from);
    cout<<s1;
}
void out_com::println(string s,int from){
    print(s,from);cout<<endl;
}
void in_com::read(string &s){
    cin>>s;
}
void in_com::readln(string &s){
    getline(cin,s);
}
void err_com::throwln(string s){
    systemio_com::windowscmd("color 1f"); //color 1 3 9是蓝色 
    out_com::println("System Error:There is a problem:");
    out_com::println(s);
}
void err_com::throwshut(string s,int timeout){
    throwln(s);
    syscore_com::closetimeout(timeout);
} 
void welcome_com::sysinfo(){
    std::stringstream versionstream,timestream;
    versionstream<<"[Version:"<<vernum1<<"."<<vernum2<<"."<<vernum3<<"."<<verpatch<<"]";
    timestream<<sysstarttime<<"(ms)]";
    if(verpatch<0) versionstream<<"[TestEdition]";
    string versionstring,timestring;
    versionstream>>versionstring;
    timestream>>timestring;
    timestring="[System start time:"+timestring;
    out_com::println("[Command Operatoring System]");
    out_com::println("[This system is designed by CDsidi.]");
    out_com::println(versionstring);
    if(sysstarttime!=-1){
        out_com::println(timestring);
    }
}
void welcome_com::advertisements(){
    if(verpatch<=-1){
        out_com::println("********Test Edition: No Advertisement*********");
        return;
    }
    out_com::println("****************以下是广告*************");
    out_com::println("_______广告 1_________ ");    
    out_com::println("如果喜欢ComSys,请捐助我 ");    
    out_com::println("如果想投放广告,请联系我 ");
    out_com::println("https://www.cnblogs.com/cdsidi");
    out_com::println("_______广告 2_________ ");    
    out_com::println("现在加入 51C SB 派对!");
    out_com::println("****************广告已结束*************");
}
void welcome_com::about(){
    sysinfo();
    advertisements();
};
//这里有bug 先不用了 
string comsolve_com::varsolve(string s){//将%varname%替换为var的值 
    string ret=s;
    int len=s.length(),
        lastplace=-1;//上一个没有配对的varflag位置 
    for(int i=0;i<len;++i){
        if(s.at(i)==code_varflag0){
            if(lastplace==-1){
                lastplace=i;
            }else{
                string varname=s.substr(lastplace+1,i-(lastplace+1));//恰好截取varflag中间的部分 
                if(!varname.empty()){
                    string varstr=storage_com::getvarstr(varname);
                    if(varstr==storage_com::code_str_void) continue; 
                    ret.erase(lastplace,i-lastplace+1);//删除ret从lastplace开始,一直到i的部分[lastplace,i]
                    ret.replace(lastplace,0,varstr);
                    lastplace=-1;
                    int tmp=varstr.length()-(varname.length()+2);//当前指针i的变化量
                    i+=tmp;
                    len+=tmp;
                }else{
                    //lastplace=i; 
                }
            }
        }
    }
    for(int i=1;i<len;++i){//将两个连续的'%'编程一个'%' 
        if(ret.at(i)==code_varflag0 && ret.at(i-1)==code_varflag0){
            ret.erase(i,1);
            i-=1;
            len-=1;
        }
    }
    return ret;
}
void comsolve_com::solve1(string s,int left,int code_raw){
    int base=code_raw/Max_basic_command,//语言基值 
        code=code_raw%Max_basic_command;//命令名 
    int len=s.length();
    string tmp=s.substr(left,len-left);//从left一直截取到len(下一步处理的tmp) 
    switch(code){
        case code_unknown:
            out_com::println("Bad command.
Please type 'help' for help of commands.");break;
        case code_print:
            out_com::println(tmp);break;
        case code_windowscmd:
            systemio_com::windowscmd(tmp);break;
        case code_exit:
            syscore_com::closesys();break;
        case code_sysinfo:
            welcome_com::sysinfo();break;
        case code_help:
            welcome_com::help();break;
        case code_var:
            storage_com::solve0(tmp);break;
        case code_cls:
            systemio_com::cleanscr();break;
        case code_color:
            systemio_com::changeclr(tmp);break;
        case code_runtime:
            cout<<systemio_com::gettime()<<"(ms)"<<endl;break;
        default:
            err_com::throwln("Bad Command!");
    }
}
void comsolve_com::solve0(string s){
    int len=s.length();
    for(int i=0;i<len;++i){//枚举第一级命令的结尾
        if(strext_com::is_empty_char(s[i])){//如果[i]是空格 
            string tmp=s.substr(0,i);//不算空格[0,i-1]是否找到一个指令 
            if(commap[tmp]!=0){
                solve1(s,i+1,commap[tmp]);//转交下层处理,[i+1,end]跳过空格 
                return;
            }
        }
    }
    //s没有遇到任何空格,传递整个字符串作为第一级命令,第二级命令是空串 
    solve1(s,len,commap[s]);
}
void comsolve_com::init(){
    basic_command[code_print]="print";
    basic_command[code_windowscmd]="windows";
    basic_command[code_exit]="exit";
    basic_command[code_sysinfo]="sysinfo";
    basic_command[code_help]="help";
    basic_command[code_var]="var";
    basic_command[code_cls]="cls";
    basic_command[code_color]="color";
    basic_command[code_runtime]="runtime";
    basic_command_cn[code_print]="输出";
    basic_command_cn[code_windowscmd]="扩展";
    basic_command_cn[code_exit]="退出";
    basic_command_cn[code_sysinfo]="系统信息";
    basic_command_cn[code_help]="帮助";
    basic_command_cn[code_cls]="清屏";
    basic_command_cn[code_color]="颜色";
    basic_command_cn[code_runtime]="运行时间"; 
    for(int i=0;i<Max_basic_command;++i)
        commap[basic_command[i]]=i+codecom_base_en;
    for(int i=0;i<Max_basic_command;++i)
        commap[basic_command_cn[i]]=i+codecom_base_cn;
}
void systemio_com::cleanscr(){
    system("cls");
}
void syscore_com::welcomescr(string message){//启动和关闭屏幕 (通过message传递) 
    systemio_com::cleanscr();
    for(int i=1;i<=cnt_stars;++i)out_com::print("*");
    for(int i=1;i<=cnt_emptyl/2;++i)out_com::print("
");
    welcome_com::about();
    out_com::println(message);
    for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("
");
    for(int i=1;i<=cnt_stars;++i)out_com::print("*");
}
void welcome_com::help(){
    out_com::println("************Start of help*****************");
    out_com::println("1.    command 'print': ");
    out_com::println("print {string} System will say {string}.");
    out_com::println("eg. print Hello!");
    out_com::println("2.    command 'exit': ");
    out_com::println("System will close.");
    out_com::println("eg. exit");
    out_com::println("3.    command 'sysinfo': ");
    out_com::println("System will show the information of the System.");
    out_com::println("eg. sysinfo");
    out_com::println("4.    command 'help': ");
    out_com::println("System will show the commands of the System.");
    out_com::println("eg. help");
    out_com::println("5.    command 'windows': ");
    out_com::println("windows {string} system will do it in Windows cmd.exe");
    out_com::println("eg. windows echo hello");    
    out_com::println("6.    command 'cls': ");
    out_com::println("System will clean the screen.");
    out_com::println("eg. cls");    
    out_com::println("7.     command 'color':");
    out_com::println("System will change the color to {string}");
    out_com::println("eg. color 0a");
    out_com::println("8.    command 'runtime': ");
    out_com::println("System will show the runtime(ms)");
    out_com::println("eg. runtime");
    out_com::println("************End of help*****************");
}
void syscore_com::startsys(){
    systemio_com::changeclr("0f");
    systemio_com::windowscmd("title ComSys");
    welcomescr("Starting...");
    initsys();
    systemio_com::sleep_until(waitms);
    systemio_com::cleanscr();
    out_com::println("System has got ready.");
    sysmain();
} 
void syscore_com::initsys(){
    storage_com::init();
    comsolve_com::init();
}
void syscore_com::closesys(){
    systemio_com::cleanscr();
    welcomescr("System is shutting down...");
    systemio_com::sleep(waitms);
    out_com::println("Press any key to exit.");
    systemio_com::windowscmd("pause >nul");
    systemio_com::progexit(0);
}
void syscore_com::closetimeout(int m_secs){
    printf("System will shutdown in %d seconds. Please get ready.",m_secs/1000);
    systemio_com::sleep(m_secs);
    closesys();
}
void syscore_com::sysmain(){
    welcome_com::sysstarttime=systemio_com::gettime();
    string s;
    while(1){
        out_com::print(">");
        in_com::readln(s);
        strext_com::trim(s);//去掉首尾空格 
        if(!s.empty())
            comsolve_com::solve0(s);
    }
}
int storage_com::getInteger(string name){
    varinfo var=varmap[name];
    if(var.type==code_integer){
        return Ints[var.address];
    }else{
        err_com::throwln(code_err_wrongtype);
        return 0;
    }
}
double storage_com::getFloating(string name){
    varinfo var=varmap[name];
    if(var.type==code_floating){
        return Floats[var.address];
    }else{
        err_com::throwln(code_err_wrongtype);
        return 0;
    }
}
string storage_com::getString(string name){
    varinfo var=varmap[name];
    if(var.type==code_string){
        return Strings[var.address];
    }else{
        err_com::throwln(code_err_wrongtype);
        return "";
    }
}
void storage_com::putvalue(string name,long long val){
    varinfo var=varmap[name];
    if(var.type==code_void){
        Ints.push_back(val);
        var=varinfo(name,code_integer,Ints.size()-1);
        varmap[name]=var;
    }else if(var.type==code_integer){//此变量存在 
        Ints[var.address]=val;
    }else{//注意,以下会出现在内存池中变量的内存泄露 
        Ints.push_back(val);
        var=varinfo(name,code_integer,Ints.size()-1);
        varmap[name]=var;
        //将之前的存储信息覆盖(之前的内存将永远无法用到) 
    }    
}
void storage_com::putvalue(string name,int val){
    putvalue(name,val);
}
void storage_com::putvalue(string name,string val){
    varinfo var=varmap[name];
    if(var.type==code_void){
        Strings.push_back(val);
        var=varinfo(name,code_string,Strings.size()-1);
        varmap[name]=var;
    }else if(var.type==code_string){
        Strings[var.address]=val;
    }else{ 
        Strings.push_back(val);
        var=varinfo(name,code_string,Strings.size()-1);
        varmap[name]=var;
    }
}
void storage_com::putvalue(string name,double val){
    varinfo var=varmap[name];
    const int type=var.type;
    if(type==code_void){
        Floats.push_back(val);
        var=varinfo(name,code_floating,Floats.size()-1);
        varmap[name]=var;
    }else if(type==code_floating){
        Floats[var.address]=val;
    }else{ 
        Floats.push_back(val);
        var=varinfo(name,code_floating,Floats.size()-1);
        varmap[name]=var;
    }
}
int storage_com::gettype(string name){
    varinfo ret=varmap[name];
    return ret.type;    
}
string storage_com::getvarstr(varinfo var){
    const int type=var.type,address=var.address;
    string ret;
    std::stringstream stream;
    if(type==code_integer){
        stream<<Ints.at(address);
    }else if (type==code_string){
        stream<<Strings.at(address);
    }else if (type==code_floating){
        stream<<Floats.at(address);
    }else{
        return code_str_void;
    }
    stream>>ret;
    return ret;
}
string storage_com::getvarstr(string name){
    varinfo var=varmap[name];
    return getvarstr(var);
}
void storage_com::printvarstr(string name){
    out_com::print(getvarstr(name));
}
void storage_com::printvarstrln(string name){
    out_com::println(getvarstr(name));
}
/*下面的未完结 */
void storage_com::solve0(string s){//s是storage命令处理 
    int len=s.length();
    strext_com::trim(s);
    for(int i=0;i<len;++i){//枚举i,一直到结尾 
        if(strext_com::is_empty_char(s[i])){//分格的空格s[i]
            string tmp=s.substr(0,i);//不算空白[0,i-1]是否找到变量名
            varinfo tmpinfo=varmap[tmp]; 
            //不管这个变量存不存在 ,都转交下层处理 [i+1,end]跳过刚才的空白 
            //solve1(s,i+1,tmpinfo);
            return;//分隔符之后的不再处理 
        }
    }
    err_com::throwln("Var Command Error.");
}
/*未完结 
void storage_com::solve1(string str,int left,varinfo var){
    int len=str.length();
    string s=str.substr(left,len-left);
    for(int i=0;i<len;++i){
        if(strext_com::is_empty_char(s[i]))
    }
    string type_tmp=s.strstr(0,)
}*/
void storage_com::init(){
    vector<Integer>().swap(Ints);
    vector<Floating>().swap(Floats);
    vector<String>().swap(Strings);
    map<string,varinfo>().swap(varmap);
    map<string,type_t>().swap(typemap);
    typemap[code_str_void]=code_void;
    typemap[code_str_integer]=code_integer;
    typemap[code_str_floating]=code_floating;
    typemap[code_str_string]=code_string;
}
int main(){
    syscore_com::startsys();
    return 0;
}
View Code

0.2.0更新:

0.2.0: TestEdition 1:
1.尽可能的将类的成员函数编程静态成员函数,以便类拆分,降低耦合度
2.现在版本号已经包含在welcome_com中
3.已经在comsolve_com里添加了中文命令的定义
Test Edition 2:
4.现在所有函数(除了main)已经包含在类中,添加了strext_com 用来做字符和字符串处理
5.添加/改动了一些注释(现在每个类的依赖已经被写明,确保类和类之间没有互相依赖)
6.测试版现在没有广告,且verpatch=-1 并且会显示[TestEdition]
7.增加了启动时间记录,welcome_com::sysstarttime,启动结束之前是-1,启动后可以通过sysinfo查看
8.重磅更新:comsolve_com::varsole(string s)已经可用
用法:"其它 %变量名% 其它”会替换成“其它 变量的内容 其它”
9.调整了sysinfo_com::welcomescr显示参数 sleep已经使用了systemio_com
10.添加了color命令 调用cmd的颜色,用来改变控制台窗口的颜色
11.优化了多语言
patch 0:
12.为正式版优化GUI
13.添加了runtime 命令 获取系统从开始到当前时刻的时间
14.补全了测试版的一些命令相关(中文,help)
patch 1:
1.完善了注释
2.sysinfo 修复bug:系统启动时间显示没有冒号
3.新功能:现在程序标题栏会显示ComSys
4.systemio_com::重写了sleep(int),添加了sleep_until(int),
5.令syscore_com::startsys改用sleep_until 加快启动时间
6.对storage_com 的整理

原文地址:https://www.cnblogs.com/cdsidi/p/12671399.html