Files
h2inc-old/h2inc_parser.py
2018-02-09 21:34:01 +01:00

197 lines
6.3 KiB
Python

# You are free to use and/or change this code for
# your own needs.
# Original code (c)2018 Jan Lerking
# Program to convert C-header (*.h) files to nasm include files (*.inc),
# for direct usage in assembly programming using nasm/yasm.
import sys
import string
#Creates a list of elements per line in file,
#then adding this list as a single element in a global tuple
def parseline(lines):
tupline = []
word = [w for w in lines.split()]
for w in word:
if w in hdr_keywords:
v=hdr_keywords[w]
tupline.append(v)
tupline.append(w)
return tupline
def parseparsed(tup):
global multilinecomment
parsedline = ''
if len(tup)>0:
if tup[0] == ELEMENT_TYPE_COMMENT_START:
if tup[-1] == ELEMENT_TYPE_COMMENT_END:
multilinecomment=False
else:
multilinecomment=True
parsedline=parsecomment(tup)
if tup[0] == ELEMENT_TYPE_COMMENT_MULTILINE and multilinecomment==True:
parsedline=parsecomment(tup)
if tup[0] == ELEMENT_TYPE_IFNDEF:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_DEFINE:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_INCLUDE:
parsedline=parseinclude(tup)
if tup[0] == ELEMENT_TYPE_ELIF:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_IF:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_ELSE:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_ENDIF:
parsedline=parseendif(tup)
if tup[0] == ELEMENT_TYPE_IFDEF:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_ERROR:
parsedline=parsedefs(tup)
if tup[0] == ELEMENT_TYPE_UNDEF:
parsedline=parseundef(tup)
if tup[0] == ELEMENT_TYPE_PRAGMA:
parsedline=parsedefs(tup)
else:
parsedline=parseemptyline()
return parsedline
def parsecomment(element):
global multilinecomment
index = 0
elist = element
if elist[-1] == ELEMENT_TYPE_COMMENT_END:
elist[-1] = '\n'
if elist[0] in inc_keywords:
elist[1]=inc_keywords[elist[0]]
del elist[0]
for e in elist:
if e in inc_keywords:
elist[index]=inc_keywords[e]
del elist[index]
index +=1
if elist[-1] != '\n':
elist.append('\n')
line = ' '.join(elist)
return line
def parseemptyline():
line='\n'
return line
def parsedefs(element):
elist = element
clist = []
if len(elist)>2: #If more than 2 elements in line, 3rd element is a singleline comment.
clist = parsecomment(elist)
if elist[0] in inc_keywords:
elist[1]=inc_keywords[elist[0]]
del elist[0]
if elist[-1] != '\n':
elist.append('\n')
line = ' '.join(elist)
return line
def parseinclude(element):
elist = element
if elist[0] in inc_keywords:
elist[1]=inc_keywords[elist[0]]
del elist[0]
if len(elist)>2: #If more than 2 elements in line, 3rd element is a singleline comment.
if elist[2] in inc_keywords:
elist[3]=inc_keywords[elist[2]]
del elist[2]
if elist[-2] in inc_keywords:
elist[-1]=inc_keywords[elist[-2]]
del elist[-2]
tempstr = str(elist[1])
tempstr = tempstr.replace('<', '"')
tempstr = tempstr.replace('.h>', '.inc"')
tempstr = tempstr.replace('.h"', '.inc"')
elist[1] = tempstr
if elist[-1] != '\n':
elist.append('\n')
line = ' '.join(elist)
return line
def parseendif(element):
elist = element
if elist[0] in inc_keywords:
elist[1]=inc_keywords[elist[0]]
del elist[0]
if len(elist) > 1:
if elist[1] in inc_keywords:
elist[2]=inc_keywords[elist[1]]
del elist[1]
if elist[-2] in inc_keywords:
elist[-1]=inc_keywords[elist[-2]]
del elist[-2]
if elist[-1] != '\n':
elist.append('\n')
line = ' '.join(elist)
return line
def parseundef(element):
elist = element
if elist[0] in inc_keywords:
elist[1]=inc_keywords[elist[0]]
del elist[0]
if elist[1] in inc_keywords:
elist[2]=inc_keywords[elist[1]]
del elist[1]
if elist[-2] in inc_keywords:
elist[-1]=inc_keywords[elist[-2]]
del elist[-2]
if elist[-1] != '\n':
elist.append('\n')
line = ' '.join(elist)
return line
multilinecomment = False
ELEMENT_TYPE_DEFINE = 1
ELEMENT_TYPE_INCLUDE = 2
ELEMENT_TYPE_UNDEF = 3
ELEMENT_TYPE_IFDEF = 4
ELEMENT_TYPE_IFNDEF = 5
ELEMENT_TYPE_IF = 6
ELEMENT_TYPE_ELSE = 7
ELEMENT_TYPE_ELIF = 8
ELEMENT_TYPE_ENDIF = 9
ELEMENT_TYPE_ERROR = 10
ELEMENT_TYPE_PRAGMA = 11
ELEMENT_TYPE_COMMENT_START = 20
ELEMENT_TYPE_COMMENT_MULTILINE = 21
ELEMENT_TYPE_COMMENT_END = 22
hdr_keywords = {'/*': ELEMENT_TYPE_COMMENT_START,
'*': ELEMENT_TYPE_COMMENT_MULTILINE,
'*/': ELEMENT_TYPE_COMMENT_END,
'#define': ELEMENT_TYPE_DEFINE,
'#include': ELEMENT_TYPE_INCLUDE,
'#undef': ELEMENT_TYPE_UNDEF,
'#ifdef': ELEMENT_TYPE_IFDEF,
'#ifndef': ELEMENT_TYPE_IFNDEF,
'#if': ELEMENT_TYPE_IF,
'#else': ELEMENT_TYPE_ELSE,
'#elif': ELEMENT_TYPE_ELIF,
'#endif': ELEMENT_TYPE_ENDIF,
'#error': ELEMENT_TYPE_ERROR,
'#pragma': ELEMENT_TYPE_PRAGMA}
inc_keywords = {ELEMENT_TYPE_COMMENT_START: ';',
ELEMENT_TYPE_COMMENT_MULTILINE: ';',
ELEMENT_TYPE_COMMENT_END: '',
ELEMENT_TYPE_DEFINE: '%define',
ELEMENT_TYPE_INCLUDE: '%include',
ELEMENT_TYPE_UNDEF: '%undef',
ELEMENT_TYPE_IFDEF: '%ifdef',
ELEMENT_TYPE_IFNDEF: '%ifndef',
ELEMENT_TYPE_IF: '%if',
ELEMENT_TYPE_ELSE: '%else',
ELEMENT_TYPE_ELIF: '%elif',
ELEMENT_TYPE_ENDIF: '%endif',
ELEMENT_TYPE_ERROR: '%error',
ELEMENT_TYPE_PRAGMA: '%pragma'}