Skip to content

Commit

Permalink
file2string: remove question mark from safe chars
Browse files Browse the repository at this point in the history
Trigraphs such as "??=" (which are enabled by default with -std=c11)
can mess up strings, so avoid them entirely by escaping question marks.

This also drops Python 2 compatibility from file2string, making the
change to the waf rule necessary. The input file is now opened in
binary mode which is also more correct versus the old text mode
which just happened to work even on binary files.
  • Loading branch information
sfan5 committed Nov 22, 2020
1 parent 4dcaf70 commit 6bb7304
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 9 deletions.
11 changes: 3 additions & 8 deletions TOOLS/file2string.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,21 @@
# License along with mpv. If not, see <http://www.gnu.org/licenses/>.
#

from __future__ import unicode_literals
import sys

# Indexing a byte string yields int on Python 3.x, and a str on Python 2.x
def pord(c):
return ord(c) if type(c) == str else c

def file2string(infilename, infile, outfile):
outfile.write("// Generated from %s\n\n" % infilename)

conv = ['\\' + ("%03o" % c) for c in range(256)]
conv = ["\\%03o" % c for c in range(256)]
safe_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" \
"0123456789!#%&'()*+,-./:;<=>?[]^_{|}~ "
"0123456789!#%&'()*+,-./:;<=>[]^_{|}~ "

for c in safe_chars:
conv[ord(c)] = c
for c, esc in ("\nn", "\tt", r"\\", '""'):
conv[ord(c)] = '\\' + esc
for line in infile:
outfile.write('"' + ''.join(conv[pord(c)] for c in line) + '"\n')
outfile.write('"' + ''.join(conv[c] for c in line) + '"\n')

if __name__ == "__main__":
with open(sys.argv[1], 'rb') as infile:
Expand Down
2 changes: 1 addition & 1 deletion waftools/generators/sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def f2s(self):
def fn(out):
source = getattr(self, 'source', None)
src = self.path.find_resource(source)
file2string(source, iter(src.read().splitlines(True)), out)
file2string(source, iter(src.read('rb').splitlines(True)), out)
execf(self, fn)

@TaskGen.feature('ebml_header')
Expand Down

0 comments on commit 6bb7304

Please sign in to comment.