📄 common.cpp
字号:
// 计算数组某元素的具体位置
// 位置
int Return = 0;
for (int i = 0; i < pThis->TotDim; i++)
{
if (Dim[i] > pThis->Dim[i])
{
// 下标溢出
ShowError(ErrorRangeOverflow, RunLineNo);
return 0;
}
// 累加位置
Return += (Dim[i] - 1) * pThis->Coefficient[i];
}
// 返回位置
return Return;
}
int LengthOf(const int LineNo)
{
// 返回文本行的长度,不包括末尾的空格
// 长度值先在末尾
int Len = strlen(Text[LineNo]->Line) - 1;
while (Len >= 0 && Text[LineNo]->Line[Len] == ' ')
{
// 若为空格则向前退
Len--;
}
// 返回长度
return Len + 1;
}
int HeadOf(const int LineNo)
{
// 返回文本行的开始位置,不包括首空格
// 首位置
int i = 0;
// 文本行的长度
int Len = LengthOf(LineNo);
while (i < Len && Text[LineNo]->Line[i] == ' ')
{
// 若为空格则向后推
i++;
}
// 返回位置
return i;
}
void NewLine()
{
// 申请新的文本行
// 修改最大可用文本行序号
TotRoomLine++;
if (TotRoomLine >= MaxX)
{
// 程序太长
ShowError(ErrorTooLong);
return;
}
// 申请新的文本行
Text[TotRoomLine] = new LineType;
if (Text[TotRoomLine] == NULL)
{
// 无剩余内存
// 显示错误并返回
ShowError(ErrorNoFreeMemoryInEdit);
return;
}
// 对新的文本行进行初始化
Text[TotRoomLine]->Mark = false;
Text[TotRoomLine]->Break = false;
Text[TotRoomLine]->Line[0] = '\0';
Text[TotRoomLine]->Sign[0] = '\0';
for (int i = 0; i < MaxY - 1; i++)
{
strcat(Text[TotRoomLine]->Line, " ");
strcat(Text[TotRoomLine]->Sign, " ");
}
}
void DelLine()
{
// 删除最后一行文本
delete Text[TotRoomLine];
TotRoomLine--;
}
void PrePaint
(
const int LineNo, // 待处理的文本行序号
char *ReturnSign // 返回的着色特征串
)
{
// 返回着色特征字符串
// 存储待处理的文本行内容
char Source[MaxY] = "";
// 存储单词
char Word[MaxY] = "";
// 返回特征串清空
ReturnSign[0] = '\0';
// 得到待处理的字符串
strcpy(Source, Text[LineNo]->Line);
// 清除尾部空格
ClearTailBlank(Source);
if (Source[0] == '\0')
{
// 当前行为空行
while(strlen(ReturnSign) < MaxY - 1)
{
// 全部为空格
strcat(ReturnSign, SignSpace);
}
return;
}
// 先加入缩进
int i = 0;
while(Source[i] == ' ')
{
strcat(ReturnSign, SignSpace);
i++;
}
// 取文本行的长度
int Len = strlen(Source);
// 锁标志,在字符串处理中使用
bool Lock = false;
// 存储关键字的全大写形式
char WordUpcase[MaxY];
for (; i <= Len; i++)
{
if (Source[i] == '"')
{
// 锁标志反转
Lock = true + false - Lock;
}
if (Lock)
{
// 当前是字符串的开始引号位置
if (Word[0] != '\0')
{
// 有单词需要处理
strcpy(WordUpcase, Word);
strupr(WordUpcase);
DealWordSign(Word, WordUpcase, ReturnSign);
}
// 加入字符串特征符
strcat(ReturnSign, SignString);
continue;
}
else if (Source[i] == '"')
{
// 当前是字符串的结束引号位置
strcat(ReturnSign, SignString);
continue;
}
if (i == Len)
{
// 字符串已扫描完毕
if (Word[0] != '\0')
{
// 处理单词
strcpy(WordUpcase, Word);
strupr(WordUpcase);
DealWordSign(Word, WordUpcase, ReturnSign);
}
}
else if (!Lock && IsSymbol(Source[i]))
{
// 非字符串内,且为符号
if (Word[0] != '\0')
{
// 处理单词
strcpy(WordUpcase, Word);
strupr(WordUpcase);
DealWordSign(Word, WordUpcase, ReturnSign);
}
// 添加符号特征符
strcat(ReturnSign, SignSymbol);
}
else if (Source[i] == ' ')
{
// 当前字符是空格
if (Word[0] != '\0')
{
// 处理单词
strcpy(WordUpcase, Word);
strupr(WordUpcase);
if (strcmp(WordUpcase, "REM") == 0)
{
// 前一个单词是REM
// 加入关键字的3个特征符
strcat(ReturnSign, SignKeyWord);
strcat(ReturnSign, SignKeyWord);
strcat(ReturnSign, SignKeyWord);
// 加入空格的特征符
strcat(ReturnSign, SignSpace);
// 后面的全部添加注释特征符
for (int j = i; j < Len; j++)
{
strcat(ReturnSign, SignREM);
}
break;
}
// 否则处理单词
DealWordSign(Word, WordUpcase, ReturnSign);
}
// 添加空格特征符
strcat(ReturnSign, SignSpace);
}
else
{
// 否则将当前位添加入单词
strcat(Word, " ");
Word[strlen(Word) - 1] = Source[i];
}
}
// 在末尾填充空格
while(strlen(ReturnSign) < MaxY - 1)
{
strcat(ReturnSign, SignSpace);
}
}
void DealWordSign
(
char *strWord, // 原单词
char *strUpcase, // 全大写形式
char *ReturnSign // 返回特征符字符串
)
{
// 处理单词
// 记录保留字序号
int WordValue = -1;
if (isalpha(strWord[0]))
{
// 第一个是字母才有可能是关键字
for (int k = 0; k < TotKeyWord; k++)
{
if (strcmp(KeyWord[k], strUpcase) == 0)
{
// 找到关键字匹配
WordValue = k;
break;
}
}
}
// 暂存最后加入的特征符
char strSign[2];
double Temp;
if (WordValue >= 0)
{
// 是关键字
strcpy(strSign, SignKeyWord);
}
else if (IsNumber(strWord, Temp))
{
// 是数字
strcpy(strSign, SignNumber);
}
else
{
// 是标识符
strcpy(strSign, SignVar);
}
// 加入特征符
for (int j = 0; j < strlen(strWord); j++)
{
strcat(ReturnSign, strSign);
}
// 单词清空
strWord[0] = '\0';
}
int NextLine(const int LineNo)
{
// 返回当前行(含)以后的应该执行的行号
// 即越过空行和注释行
// 行号循环变量
int i = LineNo;
// 语句行的第一个关键字
char Cmd[MaxY];
// 得到语句行的第一个关键字
GetPart(Text[i]->Line, 1, ' ', Cmd);
while (i <= EndLine && (LengthOf(i) == 0 || strcmp(Cmd, "REM") == 0))
{
// 当前行是空行或是注释行,应当越过
// 继续下一行
i++;
GetPart(Text[i]->Line, 1, ' ', Cmd);
}
if (i > EndLine)
{
// 已经没有下一行
// 设置完成标志
Finished = true;
return -1;
}
// 返回行号
return i;
}
bool IsNumber
(
const char strExp[MaxY], // 源字符串
double &Value // 若是数字,返回它的值
)
{
// 判断字符串是否为数字
char *endptr;
Value = strtod(strExp, &endptr);
return *endptr == NULL;
}
bool IsSymbol(const char Chr)
{
// 判断字符是否为符号
return (bool)strchr(Symbol, Chr);
}
bool IsSeparator(const char Chr)
{
// 判断是否为分隔符
return IsSymbol(Chr) || Chr == ' ' || Chr == '"';
}
bool IsIndent(const int LineNo)
{
// 判断第LineNo行文本的下一行是否需要自动向里缩进一个Tab
// 存储关键字
char Word[MaxY];
// 取LineNo行文本的第一部分
GetPart(Text[LineNo]->Line, 1, ' ', Word);
// 变为大写
strupr(Word);
// 关键字为下列情况则需要自动缩进:
// FOR、IF、ELSE、SUB
return
(
strcmp(Word, "FOR") == 0 ||
strcmp(Word, "IF") == 0 ||
strcmp(Word, "ELSE") == 0 ||
strcmp(Word, "SUB") == 0
);
}
bool IsFileName(const char Name[MaxLenOfFileName])
{
// 判断文件名是否合法
for (int i = 0; i < strlen(Name); i++)
{
if (!isalpha(Name[i]) && !isdigit(Name[i]) && !strchr("-_~", Name[i]))
{
return false;
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -