Skip to content

Commit

Permalink
增加cli异常处理
Browse files Browse the repository at this point in the history
  • Loading branch information
王永瑶 committed Mar 14, 2023
1 parent c43ab0e commit ec448dd
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 68 deletions.
Binary file modified bin/WordList.exe
Binary file not shown.
Binary file modified bin/core.dll
Binary file not shown.
6 changes: 3 additions & 3 deletions src/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
// Created by Kazeya on 2023/3/10.
//

#ifndef BUAA_ASE_WORDLIST_MAIN_H
#define BUAA_ASE_WORDLIST_MAIN_H
#ifndef BUAA_ASE_WORDLIST_CORE_H
#define BUAA_ASE_WORDLIST_CORE_H

#pragma once
extern "C" __declspec(dllexport) int gen_chain_word(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
extern "C" __declspec(dllexport) int gen_chain_char(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
extern "C" __declspec(dllexport) int gen_chains_all(char* words[], int len, char* result[]);

#endif //BUAA_ASE_WORDLIST_MAIN_H
#endif
180 changes: 123 additions & 57 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,30 @@
#include<vector>
#include<algorithm>
#include<fstream>
#include<set>
#include<string>
#include <string>
#include "main.h"
using namespace std;
ifstream readFile;
ofstream fout("output.txt");
// diao yong dll
#pragma comment(lib, "../bin/WordChain.lib")
// shengming hanshu
ofstream fout("solution.txt");

//typedef int(*Func1)(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
//typedef int(*Func2)(char* words[], int len, char* result[]);
//HMODULE dll = LoadLibrary("core.dll");
//
//Func1 gen_chain_word = (Func1) GetProcAddress(dll, "gen_chain_word");
//Func1 gen_chain_char = (Func1) GetProcAddress(dll, "gen_chain_char");
//Func2 gen_chains_all = (Func2) GetProcAddress(dll, "gen_chains_all");

#pragma comment(lib,"core.lib")
extern "C" __declspec(dllexport) int gen_chain_word(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
extern "C" __declspec(dllexport) int gen_chain_char(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
extern "C" __declspec(dllexport) int gen_chains_all(char* words[], int len, char* result[]);

int isletter(char c)
{
return (c>='a'&&c<='z')||(c>='A'&&c<='Z');
}
int issmall(char c)
{
return (c>='a'&&c<='z');
}

vector<string> input()
{
vector<string> res;
Expand All @@ -33,34 +38,36 @@ vector<string> input()
{
if(!isletter(s[i]))
{
if(now.size()>0) res.push_back(now);
if(now.size()>0)
res.push_back(now);
now="";
}
else now+=(s[i]<'a')?(s[i]+'a'-'A'):s[i];
else
now+=(s[i]<'a')?(s[i]+'a'-'A'):s[i];
}
if(now.size()>0) res.push_back(now);
if(now.size()>0)
res.push_back(now);
}
return res;
}
int check_file(int argc,char* argv[])
{
if(argc<2)
{
cout<<"too few para!";
return -9;
cerr <<"please select a file" << endl;
return FILE_NOT_GIVEN;
}
string fn=argv[argc-1];
if(fn.size()<=4||fn.substr(fn.size()-4)!=".txt")
{
cout<<"not .txt file!";
return -6;
cerr <<"not .txt file!" << endl;
return FILE_TYPE_WRONG;
}
// cout << argv[argc-1] << endl;
readFile.open(argv[argc-1], ios::in);
if(!readFile.is_open())
{
cout<<"open file failed!";
return -7;
cerr <<"open file failed!" << endl;
return FILE_NOT_EXIST;
}
return 0;
}
Expand All @@ -70,107 +77,146 @@ int checkp(int x)
if(x==1)
{
for(int i=1;i<=7;i++)
if(arg[i]==1) return -1;
if(arg[i]==1)
return PARAM_CONFLICT;
return 0;
}
if(x==2||x==3)
{
if(arg[1]==1||arg[2]==1||arg[3]==1) return -1;
if(arg[1]==1||arg[2]==1||arg[3]==1)
return PARAM_CONFLICT;
return 0;
}
if(arg[1]==1||arg[x]==1) return -1;
if(arg[1]==1||arg[x]==1)
return PARAM_CONFLICT;
return 0;
}
int checkz(char* c)
{
int len=strlen(c);
if(len!=1) return -4;
if(!issmall(c[0])) return -4;
if(len!=1)
return PARAM_FORMAT;
if(!isletter(c[0]))
return PARAM_FORMAT;
return 0;
}
char start='\0',ed='\0',banned='\0';
int op=-1,loop=0,qall=0;
bool flagH = false,flagT = false,flagJ = false;
int read_para(int argc,char *argv[])
{
for(int i=1;i<argc-1;i++)
{
string ag=argv[i];
if(ag=="-w")
{
if(checkp(1)<0) return -1;
arg[1]=1;
if(checkp(2)<0)
return PARAM_CONFLICT;
arg[2]=1;
op=0;
}
else if(ag=="-c")
{
if(checkp(2)<0) return -1;
arg[2]=1;
if(checkp(3)<0)
return PARAM_CONFLICT;
arg[3]=1;
op=1;
}
else if(ag=="-h")
{
if(checkp(3)<0) return -1;
arg[3]=1;
if (flagH) {
return PARAM_DUPLICATE;
}
if(checkp(4)<0)
return PARAM_CONFLICT;
arg[4]=1;
i++;
int res=checkz(argv[i]);
if(res<0) return res;
if(res<0)
return res;
start=argv[i][0];
flagH = true;
}
else if(ag=="-t")
{
if(checkp(4)<0) return -1;
arg[4]=1;
if (flagT) {
return PARAM_DUPLICATE;
}
if(checkp(5)<0)
return PARAM_CONFLICT;
arg[5]=1;
i++;
int res=checkz(argv[i]);
if(res<0) return res;
if(res<0)
return res;
ed=argv[i][0];
flagT = true;
}
else if(ag=="-j")
{
if(checkp(5)<0) return -1;
arg[5]=1;
if (flagJ) {
return PARAM_DUPLICATE;
}
if(checkp(6)<0)
return PARAM_CONFLICT;
arg[6]=1;
i++;
int res=checkz(argv[i]);
if(res<0) return res;
if(res<0)
return res;
banned=argv[i][0];
flagJ = true;
}
else if(ag=="-r")
{
if(checkp(6)<0) return -1;
arg[6]=1;
if(checkp(7)<0)
return PARAM_CONFLICT;
arg[7]=1;
loop=1;
}
else if(ag=="-n")
{
cout << "模式-n";
if(checkp(7)<0) return -1;
arg[7]=1;
if(checkp(1)<0)
return PARAM_CONFLICT;
arg[1]=1;
qall=1;
}
else
{
cout<<"wrong para!";
return -5;
return PARAM_UNDEFINED;
}
}
if(op==-1) return -2;
if(qall==0&&op==-1)
return PARAM_LACK;
return 0;
}
void print_ans(int len,char* result[],int op)
{
int i;
if(op==1) fout<<len<<"\n";
for(int i=0;i<len;i++) cout<<result[i]<<"\n";
if(op==1)
fout<<len<<"\n";
for(int i=0;i<len;i++)
fout<<result[i]<<"\n";
}
char* words[10010];
char* result[10010];
char* words[20010];
char* result[20010];

int main(int argc,char* argv[])
{
// cout << "start";
int res=check_file(argc,argv);
if(res<0) return res;
if(res<0)
return res;
res=read_para(argc,argv);
if(res<0) return res;
if(res<0) {
if (res == PARAM_CONFLICT) {
cerr << "selected parameter conflicts" << endl;
}
else if (res == PARAM_DUPLICATE) {
cerr << "duplicate head/tail/reject letter" << endl;
}
return res;
}

vector<string> all_str=input();
int len,reslen;
Expand All @@ -186,23 +232,43 @@ int main(int argc,char* argv[])
if(qall==1)
{
reslen=gen_chains_all(words,len,result);
if(reslen<0) return reslen;
if(reslen<0) {
cerr << "exist word circle" << endl;
return reslen;
}
if (reslen > 20000) {
cerr << "result too long" << endl;
return RESULT_TOO_LONG;
}
print_ans(reslen,result,1);
return 0;
}
if(op==0)
{
reslen=gen_chain_word(words,len, result, start, ed, banned,loop);
if(reslen<0) return reslen;
if(reslen<0) {
cerr << "exist word circle" << endl;
return reslen;
}
if (reslen > 20000) {
cerr << "result too long" << endl;
return RESULT_TOO_LONG;
}
print_ans(reslen,result,0);
return 0;
}
else
{
reslen=gen_chain_char(words,len, result, start, ed, banned,loop);
if(reslen<0) return reslen;
if(reslen<0) {
cerr << "exist word circle" << endl;
return reslen;
}
if (reslen > 20000) {
cerr << "result too long" << endl;
return RESULT_TOO_LONG;
}
print_ans(reslen,result,0);
return 0;
}

}
}
21 changes: 13 additions & 8 deletions src/main.h
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
//
// Created by Kazeya on 2023/3/9.
//

#ifndef BUAA_ASE_WORDLIST_MAIN_H
#define BUAA_ASE_WORDLIST_MAIN_H
const int PARAM_CONFLICT = -1; // 参数不兼容
const int PARAM_LACK = -2; // 单独出现-h -t -j -r
const int WORD_CIRCLE = -3; // 存在单词环
const int PARAM_FORMAT = -4; // 指定-h -t -j时,没有给定字母(缺失或给的是数字、符号)
const int PARAM_UNDEFINED = -5; // 参数未定义
const int FILE_TYPE_WRONG = -6; // 文件非.txt
const int FILE_NOT_EXIST = -7; // 文件不存在
const int FILE_DUPLICATE = -8; // 重复选择文件
const int FILE_NOT_GIVEN = -9; // 未选择文件
const int PARAM_DUPLICATE = -10; // 重复指定-h -t -j
const int RESULT_TOO_LONG = -11;

#pragma once
extern "C" __declspec(dllexport) int gen_chain_word(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
extern "C" __declspec(dllexport) int gen_chain_char(char* words[], int len, char* result[], char head, char tail, char banned, bool enable_loop);
extern "C" __declspec(dllexport) int gen_chains_all(char* words[], int len, char* result[]);
extern "C" __declspec(dllexport) void testDll();
extern "C" __declspec(dllexport) void testStr(char* result[]);
int test_main(int argc,char*argv[]);

#endif //BUAA_ASE_WORDLIST_MAIN_H
#endif //BUAA_ASE_WORDLIST_ERRORS_H

0 comments on commit ec448dd

Please sign in to comment.