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;
}
View Code

 

/*每个类依赖功能的类:
    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 的整理

posted @ 2020-04-10 09:43  CDsidi  阅读(246)  评论(1编辑  收藏  举报