Command Operating System by cdsidi(ComSys) 0.2.x版本陆续更新
/*每个类依赖功能的类:
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=='\n';
}
};
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.\nPlease 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("\n");
welcome_com::about();
out_com::println(message);
for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("\n");
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;
}
/*每个类依赖功能的类:
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=='\n';
}
};
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 void sleep_until(int k){ //暂停到k毫秒
while(gettime()<=k);
}
static void 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_com(){}
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();//系统运行的重要内容
static void restartsys();
};
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,
code_restart=10;
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;
}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.\nPlease 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;
case code_restart:
syscore_com::restartsys();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[code_restart] = "restart";
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]="运行时间";
basic_command_cn[code_restart] = "重新启动";
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("\n");
welcome_com::about();
out_com::println(message);
for(int i=1;i<=cnt_emptyl-cnt_emptyl/2;++i)out_com::print("\n");
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("9. command 'restart':");
out_com::println("System will restart");
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::restartsys(){
systemio_com::cleanscr();
welcomescr("System is restarting...");
systemio_com::sleep(waitms);
startsys();
startsys();
}
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, int val){
putvalue(name, (long long)val);
}
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,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;
}
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 的整理


浙公网安备 33010602011771号