# FreeCAD qembed script to embed arbitrary text into an executable # (c) 2006 Werner Mayer # # Creates a C++ header file of arbitrary text files that gets compiled into # an executable. It's a reimplementation of Qt's qembed tool in Python #*************************************************************************** #* Copyright (c) 2006 Werner Mayer * #* * #* This file is part of the FreeCAD CAx development system. * #* * #* This program is free software; you can redistribute it and/or modify * #* it under the terms of the GNU Library General Public License (LGPL) * #* as published by the Free Software Foundation; either version 2 of * #* the License, or (at your option) any later version. * #* for detail see the LICENCE text file. * #* * #* FreeCAD is distributed in the hope that it will be useful, * #* but WITHOUT ANY WARRANTY; without even the implied warranty of * #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * #* GNU Library General Public License for more details. * #* * #* You should have received a copy of the GNU Library General Public * #* License along with FreeCAD; if not, write to the Free Software * #* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * #* USA * #* * #*************************************************************************** #!/usr/bin/python import os,sys,string def convertFileNameToCIdentifier(s): r = '' t = s if (len(t) > 0): if (t[0].isalpha()==False): r='_' t=t[1:] for i in t: if (i.isalnum()==False): i='_' r=r+i return r def embedData(input, output): i = 0 nbytes=len(input) s='' while(i> 4) & 15 b=v&15 s=s+"0x" s=s+(hex(a))[2] s=s+(hex(b))[2] if (i0): output.write(s) if(len(sys.argv) > 4 or len(sys.argv) < 2): sys.stderr.write("Wrong Parameter\n Usage:\n qembed Infile [Outfile][Identifier]\n") sys.exit() file = open(sys.argv[1]) if(len(sys.argv) > 2): out = open(sys.argv[2],"w"); else: out = sys.stdout # Filenamw without path separators if (len(sys.argv) > 3): filenm = sys.argv[3]+"_h" else: filenm = file.name p=string.rfind(filenm,'\\') filenm=filenm[p+1:] p=string.rfind(filenm,'/') filenm=filenm[p+1:] basenm = convertFileNameToCIdentifier(filenm) define = basenm.upper() input=file.read() out.write("#ifndef _"+define+"_\n") out.write("#define _"+define+"_\n") out.write("static const unsigned int "+basenm+"_len = "+str(len(input))+";\n") out.write("static const unsigned char "+basenm+"_data[] = {") embedData(input,out) out.write("\n};\n\n") """ out.write( "/* Generated by qembed */\n" "#include \n" "#include \n" "static struct Embed {\n" " unsigned int size;\n" " const unsigned char *data;\n" " const char *name;\n" "} embed_vec[] = {\n" " { 74029, "+basenm+"_data, \""+filenm+"\" },\n" " { 0, 0, 0 }\n" "};\n" "\n" "static const QByteArray& qembed_findData( const char* name )\n" "{\n" " static QDict dict;\n" " QByteArray* ba = dict.find( name );\n" " if ( !ba ) {\n" " for ( int i = 0; embed_vec[i].data; i++ ) {\n" " if ( strcmp(embed_vec[i].name, name) == 0 ) {\n" " ba = new QByteArray;\n" " ba->setRawData( (char*)embed_vec[i].data,\n" " embed_vec[i].size );\n" " dict.insert( name, ba );\n" " break;\n" " }\n" " }\n" " if ( !ba ) {\n" " static QByteArray dummy;\n" " return dummy;\n" " }\n" " }\n" " return *ba;\n" "}\n" "\n") """ out.write("#endif // _"+define+"_\n")