mirror of https://git.ia64.cc/perso/cos2000v2.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.7 KiB
185 lines
5.7 KiB
#!/usr/bin/env python2.7 |
|
# -*-coding:utf-8 -* |
|
|
|
import os, os.path, re, string, json |
|
|
|
def getfunction(syscall): |
|
args="" |
|
num=1 |
|
for argument in syscall['ARGS']: |
|
if num>1: |
|
args=args+", " |
|
args=args+argument['TYPE']+" "+argument['NAME'] |
|
num=num+1 |
|
if args=="": |
|
args="void" |
|
return str(syscall['RETURN'])+" "+str(syscall['NAME'])+"("+args+")" |
|
|
|
def getfunctioninternal(syscall): |
|
args="" |
|
argsname=["ebx","esi","edi","ebp"] |
|
num=1 |
|
for argument in syscall['ARGS']: |
|
if num>1: |
|
args=args+", " |
|
args=args+"dump->"+argsname[num-1] |
|
num=num+1 |
|
if syscall.has_key('DUMP'): |
|
if num>1: |
|
args=args+", " |
|
args=args+"dump" |
|
return str(syscall['INTERNALNAME'])+"("+args+")" |
|
|
|
def get_duplicates(sorted_list): |
|
duplicates = [] |
|
last = sorted_list[0] |
|
for x in sorted_list[1:]: |
|
if x == last: |
|
duplicates.append(x) |
|
last = x |
|
return set(duplicates) |
|
|
|
path = "./" |
|
files = os.listdir(path) |
|
pattern = r'\/\* SYSCALL.*END-SYSCALL \*\/' |
|
output_file = "syscalls.txt" |
|
if os.path.exists(output_file): |
|
os.remove(output_file) |
|
fo = open(output_file, "a+") |
|
fo.write("[") |
|
print "*** Collecte des SYSCALL" |
|
for root, dirs, files in os.walk(path): |
|
for name in files: |
|
if name.endswith((".c")): |
|
if root=="./templates": |
|
continue |
|
input_file = os.path.join(root, name) |
|
with open(input_file, "r") as fi : |
|
content = fi.read() |
|
results = re.findall(pattern, content, re.MULTILINE| re.DOTALL) |
|
for result in results: |
|
print("Fichier :"+os.path.join(root, name)) |
|
new=string.replace(string.replace(result,"/* SYSCALL ",""),"END-SYSCALL */","") |
|
if fo.tell()>2: |
|
new=","+new; |
|
fo.write(new+"\r\n") |
|
fo.write("]") |
|
fo.seek(0) |
|
alljson=json.load(fo); |
|
print alljson |
|
fo.close() |
|
dup = get_duplicates([syscall['ID'] for syscall in alljson]); |
|
if len(dup)>0: |
|
print "ERREUR : deux fonctions possedent le meme numero de SYSCALL" |
|
for error in dup: |
|
for syscall in alljson: |
|
if syscall['ID']==error: |
|
print "librairie :"+syscall['LIBRARY']+" fonction: "+syscall['INTERNALNAME']+" id:"+str(syscall['ID']) |
|
exit() |
|
print "*** Mise en place de la documentation" |
|
os.popen('cp ./templates/API.md ./API.md') |
|
alllibs=set([syscall['LIBRARY'] for syscall in alljson]) |
|
text="" |
|
for lib in alllibs: |
|
text=text+""" |
|
### """+lib.upper()+""" |
|
|
|
All fonctions in the \""""+lib+"""\" library. |
|
|
|
""" |
|
for syscall in alljson: |
|
if syscall['LIBRARY']==lib: |
|
textargs="" |
|
num=1 |
|
for argument in syscall['ARGS']: |
|
textargs=textargs+"\n* * argument "+str(num)+" : **"+argument['TYPE']+" "+argument['NAME']+"** *"+argument['DESCRIPTION']+"*" |
|
num=num+1 |
|
dump="no" |
|
if syscall.has_key('DUMP'): |
|
dump="yes" |
|
text=text+"""------ |
|
|
|
`"""+getfunction(syscall)+""";` |
|
|
|
*Description:"""+str(syscall['DESCRIPTION'])+"""* |
|
|
|
* syscall id : **"""+str(syscall['ID'])+"""** |
|
* arguments : **"""+str(len(syscall['ARGS']))+"""**"""+textargs+""" |
|
* results : **"""+str(syscall['RETURN'])+"""** |
|
* dump of register cpu: **"""+dump+"""** |
|
|
|
""" |
|
fo = open("./API.md", "r+") |
|
content = fo.read() |
|
content=content.replace("/* FOR INSERTING */",text) |
|
##print content |
|
fo.seek(0) |
|
fo.write(content) |
|
fo.close() |
|
print "*** Mise en place des libraires (HEADERS)" |
|
for lib in alllibs: |
|
text="" |
|
print "Librairie :"+lib |
|
libname="./programs/include/"+lib+".h" |
|
os.popen('cp ./templates/lib.h '+libname) |
|
for syscall in alljson: |
|
if syscall['LIBRARY']==lib: |
|
text=text+getfunction(syscall)+";\n" |
|
fo = open(libname, "r+") |
|
content = fo.read() |
|
content=content.replace("/* FOR INSERTING */",text) |
|
##print content |
|
fo.seek(0) |
|
fo.write(content) |
|
fo.close() |
|
print "*** Mise en place des libraires (SOURCES)" |
|
for lib in alllibs: |
|
text="" |
|
print "Librairie :"+lib |
|
libname="./programs/lib/"+lib+".c" |
|
os.popen('cp ./templates/lib.c '+libname) |
|
for syscall in alljson: |
|
if syscall['LIBRARY']==lib: |
|
numargs=len(syscall['ARGS']) |
|
textargs="syscall"+str(numargs)+"("+str(syscall['ID']) |
|
for i in range(0,numargs): |
|
if numargs>0: |
|
textargs=textargs+"," |
|
textargs=textargs+"(u32) "+syscall['ARGS'][i]['NAME'] |
|
if syscall['RETURN']!='void': |
|
textargs="return "+textargs+");" |
|
else: |
|
textargs=textargs+");\n return;" |
|
text=text+getfunction(syscall)+""" |
|
{ |
|
"""+textargs+""" |
|
} |
|
|
|
""" |
|
fo = open(libname, "r+") |
|
content = fo.read() |
|
content=content.replace("/* FOR INSERTING */",text) |
|
##print content |
|
fo.seek(0) |
|
fo.write(content) |
|
fo.close() |
|
print "*** Mise en place du fichier noyau SYSCALL" |
|
text="" |
|
libname="./lib/syscall.c" |
|
os.popen('cp ./templates/syscall.c '+libname) |
|
for syscall in alljson: |
|
print "ID :"+str(syscall['ID']) |
|
call="" |
|
if syscall['RETURN']!='void': |
|
call="dump->eax=(u32) " |
|
call=call+getfunctioninternal(syscall) |
|
text=text+""" case """+str(syscall['ID'])+""": |
|
"""+call+"""; |
|
break; |
|
""" |
|
fo = open(libname, "r+") |
|
content = fo.read() |
|
content=content.replace("/* FOR INSERTING */",text) |
|
##print content |
|
fo.seek(0) |
|
fo.write(content)
|
|
|