#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
namespace basic{
struct user{
string name;
char per;
int uid;
string passwd;
};
struct gpio{
short vol;
};
struct arg{
string code;
string input;
};
vector<string>split(string k){
vector<string>ans;
string tmp;
for(int i=0;i<int(k.size());i++){
if(k[i]==' '){
if(tmp!="")ans.push_back(tmp);
}else tmp+=k[i];
}
return ans;
}
}
namespace sys{
string name;
int pnum,usernum;
vector<basic::gpio>pins;
vector<basic::user>userlist;
basic::user* nwuser=nullptr;
string nwdir="/";
int errcode;
void init(){
ifstream read("config.conf");
if(!read){
ofstream w("config.conf");
w<<"machine\n0\n1\nadmin R 12345678";
name="machine";
pnum=0;
usernum=1;
userlist.push_back({"admin",'R',1,"12345678"});
}else{
read>>name>>pnum;
for(int i=1;i<=pnum;i++){
basic::gpio tmp;
read>>tmp.vol;
pins.push_back(tmp);
}
read>>usernum;
for(int i=1;i<=usernum;i++){
basic::user tmp;
read>>tmp.name>>tmp.per>>tmp.passwd;
tmp.uid=i;
userlist.push_back(tmp);
}
}
}
}
namespace func{
void readErr(int errcode=sys::errcode){
if(errcode==1){
cerr<<"ERR 1:无法阅读到DIR属性文件,可能需要重置文件夹\n使用rmdir来删除文件夹"<<endl;
}
}
bool func_ls(vector<basic::arg>args){
bool arglist[1]={};
for(auto i:args){
if(i.code=="#all"){
arglist[0]=1;
}
}
ifstream read("dirinfo.inf");
if(!read){
sys::errcode=1;
return 0;
}
string name;
string per;
while(read>>name>>per){
cout<<name;
if(arglist[0])cout<<" "<<per;
cout<<endl;
}
return 1;
}
void login(vector<basic::arg>args){
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
basic::user tmp;
cout<<"Username:";
cin>>tmp.name;
cout<<"\nPassword:";
cin>>tmp.passwd;
for(int i=1;i<=sys::usernum;i++){
if(sys::userlist[i].name==tmp.name){
if(sys::userlist[i].passwd==tmp.passwd){
sys::nwuser=&sys::userlist[i];
return;
}else{
cout<<"Password wrong!\n\n";
return;
}
}
}
cout<<"Not found user "<<tmp.name<<"!\n\n";
return;
}
}
int main(){
sys::init();
while(1){
while(sys::nwuser==nullptr)func::login({});
cout<<sys::name<<" "<<sys::nwuser->name<<" "<<sys::nwuser->per<<" | "<<sys::nwdir<<" >";
string command;
getline(cin,command);
vector<basic::arg>args;
vector<string>spi=basic::split(command);
for(int i=1;i<int(spi.size());i+=2){
args.push_back({spi[i],spi[i+1]});
}
{
if(spi[0]=="ls"){
func::func_ls(args);
}
}
}
}