# 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'}