import random
import os
from solc import compile_files,compile_source,link_code
msg = [
"""
for (i = 0; i < size -1; i++)
{
for (uint j = size - 1; j > i ; j--)
{
if (a[j-1] > a[j])
{
uint temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
""",
"""
bool bSwaped = true;
for (i= 0; i< size -1; i++)
{
bSwaped = false;
for (uint n = size - 1; n > i ; n--)
{
if (a[n-1] > a[n])
{
uint tem = a[n-1];
a[n-1] = a[n];
a[n] = tem;
bSwaped = true;
}
}
if (!bSwaped)
break;
}
""",
"""
uint lastSwapPos = 0;
uint lastSwapPosTemp = 0;
for (i = 0; i < size - 1; i++)
{
lastSwapPos = lastSwapPosTemp;
for (uint p = size - 1; p >lastSwapPos; p--)
{
if (a[p - 1] > a[p])
{
uint te = a[p - 1];
a[p - 1] = a[p];
a[p] = te;
lastSwapPosTemp = p;
}
}
if (lastSwapPos == lastSwapPosTemp)
break;
}
"""]
# function 起始位置
newlist=[]
# contract 起始位置
Newlistbegin=[]
# contract 终止位置
Newlistend=[]
# txt内容暂存
Lines=[]
def insertcontent():
if newlist!=[]:
# 在function后插入变量
lines.insert(newlist[0] + 1, """
uint[] memory a = new uint[](8);
uint size=a.length;
for(uint i=0;i<size;i++){
a[i]=7-i;
}""" + "\n")
# 追加冒泡内容
# 随机生成插入内容的个数
num1 = random.randint(1, 2)
if num1 == 1:
num2 = random.randint(0, 2)
lines.insert(newlist[0] + 2, msg[num2])
if num1 == 2:
# 生成第一个随机函数数
num2 = random.randint(0, 2)
lines.insert(newlist[0] + 2, msg[num2])
# 生成第二个随机函数数
num3 = random.randint(0, 2)
# 如果第二次生成的随机数和第一次不同,就再插入,否则当插入一个函数处理
if num3 != num2:
lines.insert(newlist[0] + 2, msg[num3])
# 获取文件内容
for i in os.listdir("D:/py代码/未完成"):
# 打开文件读取文件
dire = "D:/py代码/未完成/"+i
file1 = open(dire, "r", encoding="utf-8")
# 记录代码内容的列表
lines = [dire for dire in file1]
Lines.clear()
# lines复制给Lines
for p in range(len(lines)):
Lines.append(lines[p])
# 获取列表长度
length = len(lines)
# 关闭文件
file1.close()
# 栈长度初始化为0
a = 0
# 插入内容前对代码遍历,生成contract位置的数组Newlistbegin, Newlistend
for j in range(length-1):
# 去除内容左空格
lines[j].lstrip()
# 记录合约起始位置
if lines[j][:8]=="contract" and lines[j].find("{", 0, len(lines[j]))!=-1:
Newlistbegin.append(j)
# 通过括号来判断contract的结束位置并记录
for pi in range(j,len(lines)):
if lines[pi].find("{", 0, len(lines[pi]))!=-1:
a = a + 1
if lines[pi].find("}", 0, len(lines[pi]))!=-1:
a = a - 1
# contract 结束位置
if a == 0:
Newlistend.append(pi)
break
# 多个合约遍历
for l in range(len(Newlistend)):
# 根据contract的位置,生成function{ 的位置
if (Newlistend[l] - Newlistbegin[l]) >= 2:
# 一个合约的循环
for q in range(Newlistbegin[l]+1,Newlistend[l]-1):
# 有可插入函数
if q< len(lines) and len(lines)!=0:
if lines[q].find('function') != -1 and lines[q].find(';') == -1:
# 直到找到"{"
while lines[q].find("{") == -1 and q < len(lines)-1:
q = q + 1
if q < len(lines):
newlist.append(q)
# 无可插入函数
else:
# 遍历完该合约
if q == len(Newlistbegin) - 1:
break
# 遍历完全部合约
if l==len(Newlistbegin)-1:
break
# 清空合约内容
Newlistbegin.clear()
Newlistend.clear()
# 插入内容
insertcontent()
# 打开文件,将lines内容写入,关闭文件
file1 = open(dire, "w", encoding="utf-8")
file1.write("".join(lines))
file1.close()
# 打开文件获取文件内容,关闭文件
file1 = open(dire, "r", encoding="utf-8")
lines = [dire for dire in file1]
file1.close()
# 对文件内容进行编译,编译失败的文件被命名为error
context = "".join(lines)
try:
test = compile_source(context)
# 编译成功的话,清空存放contract和function的数据
newlist.clear()
Newlistbegin.clear()
Newlistend.clear()
except Exception as e:
# 清空存放内容的数组
lines.clear()
# 代码复原
for p in range(len(Lines)):
lines.append(Lines[p])
# 将不可以插入的function 位置删除
if len(newlist)!=0:
del newlist[0]
insertcontent()
else:
# 全部插入失败后输出错误
print("error==>", e)
# 更改失败代码的文件名字
new = "D:/py代码/未完成/" + 'error' + i
os.rename(dire, new)
continue
print("Finish!")