no message

This commit is contained in:
2024-10-09 22:01:19 +03:00
parent 63b7f7dfd2
commit 90b5abb70f
451 changed files with 1127 additions and 886 deletions

View File

@@ -0,0 +1,234 @@
package _VisualDVM.Validators;
import Common.Utils.CommonUtils;
import GlobalData.Compiler.Compiler;
import GlobalData.CompilerEnvironment.CompilerEnvironment;
import GlobalData.CompilerOption.CompilerOption;
import java.util.Arrays;
public class DVMHelpParser {
public static HelpParserState state;
public static String t_line;
public static String line;
//-
public static OptionState optionState;
public static CompilerOption option;
//-
public static int spacesCounter;
public static CompilerEnvironment environment;
public static EnvironmentState environmentState;
//-
public static String descriptionLine = "";
//-
public static Compiler compiler = null;
public static String[] banned_options = new String[]{
"-o",
"-c",
"-f90",
"-FI"
};
public static void ResetOption() {
optionState = OptionState.SearchName;
option = null;
descriptionLine = "";
}
public static void TryConfirmOptionDescriptionLine() {
if (option != null && !descriptionLine.isEmpty()) {
option.description.add(descriptionLine.trim());
descriptionLine = "";
}
}
public static void TryConfirmOption() {
if ((option != null) && (!compiler.options.containsKey(option.name))) {
if (!descriptionLine.isEmpty())
option.description.add(descriptionLine.trim());
option.CheckParameterVariants();
if (!Arrays.asList(banned_options).contains(option.name)) {
compiler.options.put(option.name, option);
}
ResetOption();
}
}
public static void ResetEnvironment() {
environmentState = EnvironmentState.SearchName;
spacesCounter = 0;
environment = null;
descriptionLine = "";
}
public static void TryConfirmEnvironmentDescriptionLine() {
if (environment != null && !descriptionLine.isEmpty()) {
environment.description.add(descriptionLine.trim());
descriptionLine = "";
}
}
public static void TryConfirmEnvironment() {
if ((environment != null) && (!compiler.environments.containsKey(environment.name))) {
if (!descriptionLine.isEmpty())
environment.description.add(descriptionLine.trim());
environment.CheckDefaults();
compiler.environments.put(environment.name, environment);
ResetEnvironment();
}
}
public static void ReadOptions(Compiler compiler_in) {
compiler = compiler_in;
String[] lines = compiler.helpText.split("\n");
state = HelpParserState.Search;
for (String line_ : lines) {
line = line_; //нужна для окружения. там пробелы нужно считать сразу.
t_line = CommonUtils.removeCharacters(line_.trim(), "\r");
switch (state) {
case Search:
switch (t_line) {
case "Output and debugging options:":
case "Convertation options:":
case "Optimization options:":
state = HelpParserState.OptionsChapter;
ResetOption();
break;
case "Environment variables":
state = HelpParserState.EnvironmentsChapterHeader;
break;
}
break;
case EnvironmentsChapterHeader:
state = HelpParserState.EnvironmentsChapter;
ResetEnvironment();
break;
case OptionsChapter:
if (t_line.isEmpty()) {
TryConfirmOption();
state = HelpParserState.Search;
} else {
char[] symbols = t_line.toCharArray();
//- Новая строка.
optionState = OptionState.SearchName;
//-
for (char c : symbols) {
switch (optionState) {
case SearchName:
switch (c) {
case '-':
TryConfirmOption();
//-
option = new CompilerOption();
option.name += c;
optionState = OptionState.Name;
break;
default:
descriptionLine += c;
optionState = OptionState.Description;
break;
}
break;
case Name:
switch (c) {
case '<':
optionState = OptionState.Parameter;
break;
case ' ':
case '=':
case '\t':
option.parameterSeparator += c;
optionState = OptionState.SearchParameter;
break;
default:
option.name += c;
break;
}
break;
case SearchParameter:
if (c == '<') {
optionState = OptionState.Parameter;
} else {
option.parameterSeparator = "";
optionState = OptionState.Description;
descriptionLine += c;
}
break;
case Parameter:
if (c == '>') {
optionState = OptionState.SearchDescription;
} else {
option.parameterName += c;
}
break;
case SearchDescription:
if (c != ' ') {
descriptionLine += c;
optionState = OptionState.Description;
}
break;
case Description:
descriptionLine += c;
break;
}
}
//-
TryConfirmOptionDescriptionLine();
}
break;
case EnvironmentsChapter:
if (t_line.isEmpty()) {
TryConfirmEnvironment();
state = HelpParserState.Search;
} else {
char[] symbols = line.toCharArray();
//- Новая строка.
environmentState = EnvironmentState.SearchName;
spacesCounter = 0;
//-
for (char c : symbols) {
switch (environmentState) {
case SearchName:
if (c == ' ') {
if (spacesCounter++ > 4) {
//имя нам уже не встретится. это строка описания.
environmentState = EnvironmentState.Description;
}
} else if (Character.isLetter(c)) {
if (spacesCounter == 4) {
TryConfirmEnvironment();
environment = new CompilerEnvironment();
environment.name += c;
environmentState = EnvironmentState.Name;
}
} else {
descriptionLine += c;
environmentState = EnvironmentState.Description;
}
break;
case Name:
//в имени окружения пробелов быть не может. ждем описания.
if (c == ' ') {
environmentState = EnvironmentState.SearchDescription;
} else if (Character.isLetterOrDigit(c) || c == '_') {
//буквы цифры и подчеркивания - имя продолжается.
environment.name += c;
} else {
descriptionLine += c;
environmentState = EnvironmentState.Description;
}
break;
case SearchDescription:
if (c == ' ') {
//игнорируем.
} else {
descriptionLine += c;
environmentState = EnvironmentState.Description;
}
break;
case Description:
descriptionLine += c;
break;
}
TryConfirmOptionDescriptionLine();
}
//-
TryConfirmEnvironmentDescriptionLine();
}
break;
}
}
}
//------------------------------------------------------------------------------------>>
}

View File

@@ -0,0 +1,8 @@
package _VisualDVM.Validators;
public enum EnvironmentState {
SearchName,
Name,
//-
SearchDescription,
Description
}

View File

@@ -0,0 +1,10 @@
package _VisualDVM.Validators;
public enum HelpParserState {
Search,
OptionsChapter,
//------------------
//------------------
EnvironmentsChapterHeader,
EnvironmentsChapter,
End
}

View File

@@ -0,0 +1,11 @@
package _VisualDVM.Validators;
public enum OptionState {
SearchName,
Name,
//-
SearchParameter,
Parameter,
//-
SearchDescription,
Description
}

View File

@@ -0,0 +1,68 @@
package _VisualDVM.Validators;
import Common.Utils.CommonUtils;
import Common.Utils.TextLog;
import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
public class PathValidator extends Validator {
PathValidatorState state;
StringBuilder name;
int spaces_count;
public PathValidator(String string, String string_name_in, TextLog log_in) {
super(string, string_name_in, log_in);
}
@Override
protected void reset() {
state = PathValidatorState.Start;
name = new StringBuilder();
spaces_count = 0;
}
@Override
protected boolean continueCondition() {
return (state == PathValidatorState.Name) || state == PathValidatorState.Start;
}
@Override
protected void Body() {
switch (state) {
case Start:
if (RSyntaxUtilities.isLetter(c) || RSyntaxUtilities.isDigit(c) || c == '_') {
name.append(c);
state = PathValidatorState.Name;
} else state = PathValidatorState.WrongNameFormat;
break;
case Name:
switch (c) {
case '/':
reset();
break;
case ' ':
spaces_count++;
name.append(c);
break;
default:
if (CommonUtils.isForbiddenCharacter(c))
state = PathValidatorState.Forbidden;
else name.append(c);
break;
}
break;
}
}
@Override
protected void PerformFinish() {
switch (state) {
case WrongNameFormat:
Log.Writeln(string_name + ": имя файла или каталога в пути имеет неверный формат");
break;
case Forbidden:
Log.Writeln(string_name + ": Составляющие путь имена содержат запрещённые символы \n" + CommonUtils.printAllForbiddenCharacters());
break;
case Name:
if (spaces_count > 0)
Log.Writeln(string_name + ": Пробелы в окончании пути к файлу запрещены.");
break;
}
}
@Override
protected int getStartIndex() {
return 1;
}
}

View File

@@ -0,0 +1,8 @@
package _VisualDVM.Validators;
public enum PathValidatorState {
Start,
Name,
WrongNameFormat,
Forbidden,
SpacesInLastName
}

View File

@@ -0,0 +1,291 @@
package _VisualDVM.Validators;
import Common.CommonConstants;
import Common.Utils.CommonUtils;
import java.io.InputStreamReader;
import java.util.Vector;
public class ShellParser {
public static ShellParserState state;
public static StringBuilder lineBuilder;
public static String userName;
public static StringBuilder invitationBuilder;
public static char c;
public static char[] buffer = new char[1];
public static Vector<String> lines = new Vector<>();
// public static boolean bracketOpened = false;
public static boolean return_active = false;
public static boolean isCommandSymbol() {
int code = c;
return code <= 31 || c == 127;
}
public static void ResetLine() {
invitationBuilder = new StringBuilder();
lineBuilder = new StringBuilder();
// bracketOpened = false;
state = ShellParserState.NewLine;
return_active = false;
}
public static boolean isNameCharacter() {
//латиница, цифры,подчеркивания. и -
return String.valueOf(c).matches("[\\w\\-]*") || c == '?';
}
public static boolean isRBracket(){
return c=='('||c==')';
}
//false наоборот означать что конец строки ЕСТЬ.
public static boolean checkEndLine() {
if (return_active) {
switch (c) {
case '\n':
//ложная тревога. возврат каретки ни на что не влияет.
lines.add(lineBuilder.toString());
ResetLine();
return false;
case '\r':
return false;
default:
//тут был возврат. надо игнорить символ, ибо он уже прочитан.
return_active = false;
return false;
}
} else {
switch (c) {
case '\r':
return_active = true;
return false;
case '\n':
lines.add(lineBuilder.toString());
ResetLine();
return false;
}
}
return true;
}
/*
public static void NewLine() {
if (c == '[') {//приглашение со скобками.
// bracketOpened = true;
invitationBuilder.append(c);
state = ShellParserState.UserName;
} else {
if (isNameCharacter()) {
invitationBuilder.append(c);
state = ShellParserState.UserName;
} else
//не буква и не скобка. значит в этой строке приглашения нет.
state = ShellParserState.Skip;
}
}
*/
public static void NewLine() {
if (c=='@'){ //собака, признак приглашения.
String test = invitationBuilder.toString();
test = test.toLowerCase();
state = test.endsWith(userName.toLowerCase()) ? ShellParserState.MachineName : ShellParserState.Skip;
invitationBuilder.append(c);
}else {
invitationBuilder.append(c);
}
/*
if (c == '[') {//приглашение со скобками.
// bracketOpened = true;
invitationBuilder.append(c);
state = ShellParserState.UserName;
} else {
if (isNameCharacter()) {
invitationBuilder.append(c);
state = ShellParserState.UserName;
} else
//не буква и не скобка. значит в этой строке приглашения нет.
state = ShellParserState.Skip;
}
*/
}
/*
public static void UserName() {
if (c == '@') { //проверить. а тот ли юзернейм.
String test = invitationBuilder.toString();
// if (bracketOpened) test = test.substring(1);
test = test.toLowerCase();
state = test.endsWith(userName.toLowerCase()) ? ShellParserState.MachineName : ShellParserState.Skip;
invitationBuilder.append(c);
} else if (isNameCharacter() || (c == '['))
invitationBuilder.append(c);
else
state = ShellParserState.Skip;
}
*/
public static void MachineName() {
switch (c) {
case ' ':
case ':':
state = ShellParserState.Path;
invitationBuilder.append(c);
break;
default:
if (isNameCharacter())
invitationBuilder.append(c);
else state = ShellParserState.Skip;
break;
}
}
public static void Path() {
switch (c) {
case '$':
case '#':
case '>':
invitationBuilder.append(c);
state = ShellParserState.Space; //приглашение завершено. осталось прочитать пробел после него
break;
/*
case ']':
if (bracketOpened) {
invitationBuilder.append(c);
bracketOpened = false;
} else {
// UI.Info("KEK");
state = ShellParserState.Skip; //непарная скобка, все, привет
}
break;
*/
default:
invitationBuilder.append(c);
break;
}
}
public static void Space() {
if (c == ' ') {
state = ShellParserState.End;
invitationBuilder.append(c);
} else {
state = ShellParserState.Skip;
}
}
public static void setUserName(String userName_in) {
userName = userName_in;
}
public static void printChar() {
if (c != CommonConstants.boop) {
int code = c;
if ((!return_active) || (c == '\n')) {
System.out.print(c == '\r' ? ("\\r") :
(c == '\n' ? "\\n\n" : c));
if (isCommandSymbol())
System.out.print(CommonUtils.RBrackets(code));
}
}
}
public static void ReadInvitation(InputStreamReader fromServer) {
lines.clear();
ResetLine();
do {
try {
if (fromServer.read(buffer) >= 0) {
c = buffer[0];
printChar();
// if (!isCommandSymbol()) {
if (checkEndLine() && (!isCommandSymbol())) {
lineBuilder.append(c);
switch (state) {
case NewLine:
NewLine();
break;
// case UserName:
// UserName();
// break;
case MachineName:
MachineName();
break;
case Path:
Path();
break;
case Space:
Space();
break;
case Skip:
break;
}
}
} else
state = ShellParserState.End;
} catch (Exception ex) {
CommonUtils.MainLog.PrintException(ex);
state = ShellParserState.End;
}
} while (!state.equals(ShellParserState.End));
}
public static String ReadLine(InputStreamReader fromServer) {
StringBuilder res = new StringBuilder();
state = ShellParserState.NewLine;
do {
try {
if (fromServer.read(buffer) >= 0) {
c = buffer[0];
printChar();
switch (c) {
case '\r':
break;
case '\n':
state = ShellParserState.End;
break;
default:
res.append(c);
break;
}
} else
state = ShellParserState.End;
} catch (Exception ex) {
CommonUtils.MainLog.PrintException(ex);
state = ShellParserState.End;
}
} while (!state.equals(ShellParserState.End));
return res.toString();
}
public static void ReadCommand(String command, InputStreamReader fromServer){
StringBuilder res = new StringBuilder();
do {
try {
if (fromServer.read(buffer) >= 0) {
c = buffer[0];
printChar();
switch (c) {
case '\r':
break;
case '\n':
break;
default:
res.append(c);
break;
}
} else
return;
} catch (Exception ex) {
CommonUtils.MainLog.PrintException(ex);
return;
}
} while (!res.toString().contains(command));
}
public static String getCommandResult(InputStreamReader fromServer) {
//если последняя строка ответа - кончается на приглашение, то ничего не делаем.
//если нет. значит ответ кончается на перевод строки. или пуст.
// нужно прочитать еще одно приглашение.
String last_line = "";
String res = "";
boolean no_extra_read = false;
if (lines.size() > 0) {
last_line = lines.lastElement();
if (no_extra_read = last_line.endsWith(invitationBuilder.toString())) {
lines.remove(lines.size() - 1);
//больше ничего не читаем. но. обрезаем ее конец.
last_line = last_line.substring(0, last_line.length() - invitationBuilder.length());
lines.add(last_line);
}
res = String.join("\n", lines);
}
if (!no_extra_read) {
ReadInvitation(fromServer);
}
return res;
}
}

View File

@@ -0,0 +1,12 @@
package _VisualDVM.Validators;
public enum ShellParserState {
//--------------------------------
NewLine, //начало строки.
UserName, //имя пользователя.
MachineName, //имя машины
Path, //путь к текущей папке - часть приглашения
Space, //завершающий приглашение пробел.
Skip, //гарантированно не приглашение.
//--------------------------------
End//выход
}

View File

@@ -0,0 +1,34 @@
package _VisualDVM.Validators;
import Common.Utils.TextLog;
public class Validator {
protected char c;
protected int i;
protected String string_name;
protected char[] chars;
protected TextLog Log;
public Validator(String string, String string_name_in, TextLog log_in) {
string_name = string_name_in;
chars = string.toCharArray();
Log = log_in;
reset();
}
protected void reset() {
}
protected int getStartIndex() {
return 0;
}
protected boolean continueCondition() {
return true;
}
protected void Body() {
}
protected void PerformFinish() {
}
public void Validate() {
for (i = getStartIndex(); i < chars.length && continueCondition(); ++i) {
c = chars[i];
Body();
}
PerformFinish();
}
}