From 00a9a1a7ab6ca0d68ad49ead2e84061dfde2eecd Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 2 Sep 2015 07:49:20 +0200 Subject: bug fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- COPYING | 4 +-- Makefile | 2 +- README | 2 +- dist/archlinux/stable/PKGBUILD | 2 +- info/gpp.texinfo | 8 ++--- src/gpp.py | 80 +++++++++++++++--------------------------- tests/complex | 7 ++++ tests/quoted | 2 ++ tests/quoted-brackets | 3 ++ tests/unquoted | 2 ++ 10 files changed, 52 insertions(+), 60 deletions(-) create mode 100644 tests/complex create mode 100644 tests/quoted create mode 100644 tests/quoted-brackets create mode 100644 tests/unquoted diff --git a/COPYING b/COPYING index ab19927..63a681e 100644 --- a/COPYING +++ b/COPYING @@ -1,6 +1,6 @@ -gpp – Bash based general purpose preprocessor +gpp – Bash-based general-purpose preprocessor -Copyright © 2013, 2014 Mattias Andrée (maandree@member.fsf.org) +Copyright © 2013, 2014, 2015 Mattias Andrée (maandree@member.fsf.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/Makefile b/Makefile index 6a8162a..6dab478 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # notice and this notice are preserved. This file is offered as-is, # without any warranty. -VERSION = 1.2 +VERSION = 1.3 PREFIX = /usr DATA = /share diff --git a/README b/README index 6a3b981..61fbd1d 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ General Perprocessor -Bash based preprocessor for anything. +Bash-based preprocessor for anything. diff --git a/dist/archlinux/stable/PKGBUILD b/dist/archlinux/stable/PKGBUILD index eb5813f..e5e7319 100644 --- a/dist/archlinux/stable/PKGBUILD +++ b/dist/archlinux/stable/PKGBUILD @@ -3,7 +3,7 @@ pkgname=general-preprocessor pkgver=1.3 pkgrel=1 -pkgdesc="Bash based preprocessor for anything" +pkgdesc="Bash-based preprocessor for anything" url="https://github.com/maandree/gpp" arch=(any) license=(GPL3) diff --git a/info/gpp.texinfo b/info/gpp.texinfo index 2698230..e39156b 100644 --- a/info/gpp.texinfo +++ b/info/gpp.texinfo @@ -12,12 +12,12 @@ @dircategory Development @direntry -* ?{GPP}: (?{GPP}). Bash based preprocessor for anything +* ?{GPP}: (?{GPP}). Bash-based preprocessor for anything @end direntry @copying -Copyright @copyright{} 2013 Mattias Andrée +Copyright @copyright{} 2013, 2015 Mattias Andrée @quotation Permission is granted to copy, distribute and/or modify this document @@ -31,13 +31,13 @@ Texts. A copy of the license is included in the section entitled @ifnottex @node Top -@top gpp -- Bash based preprocessor for anything +@top gpp -- Bash-based preprocessor for anything @insertcopying @end ifnottex @titlepage @title gpp -@subtitle Bash based preprocessor for anything +@subtitle Bash-based preprocessor for anything @author by Mattias Andrée (maandree) @page diff --git a/src/gpp.py b/src/gpp.py index 7d3f4f0..fb240fe 100755 --- a/src/gpp.py +++ b/src/gpp.py @@ -1,9 +1,9 @@ #!@{SHEBANG} # -*- coding: utf-8 -*- -''' -gpp – Bash based general purpose preprocessor +copyright = ''' +gpp – Bash-based general-purpose preprocessor -Copyright © 2013, 2014 Mattias Andrée (maandree@member.fsf.org) +Copyright © 2013, 2014, 2015 Mattias Andrée (maandree@member.fsf.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -76,22 +76,7 @@ for i in range(1, len(args)): print('gpp ' + VERSION) sys.exit(0) elif arg in ('-c', '--copying'): - print('gpp -- Bash based general purpose preprocessor') - print('') - print('Copyright (C) 2013, 2014 Mattias Andrée (maandree@member.fsf.org)') - print('') - print('This program is free software: you can redistribute it and/or modify') - print('it under the terms of the GNU General Public License as published by') - print('the Free Software Foundation, either version 3 of the License, or') - print('(at your option) any later version.') - print('') - print('This program is distributed in the hope that it will be useful,') - print('but WITHOUT ANY WARRANTY; without even the implied warranty of') - print('MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the') - print('GNU General Public License for more details.') - print('') - print('You should have received a copy of the GNU General Public License') - print('along with this program. If not, see .') + print(copyright[1:-1]) sys.exit(0) else: continue @@ -157,27 +142,45 @@ def pp(line): quote = [] n = len(line) i = 0 + rc.append(ord('\'')) while i < n: c = line[i] i += 1 if brackets > 0: if esc: esc = False - elif (c in (ord(')'), ord('}'))): + elif len(quote) > 0: + if dollar: + dollar = False + if c == ord('('): + quote.append(ord(')')) + elif c == ord('{'): + quote.append(ord('}')) + elif c == quote[-1]: + quote[:] = quote[:-1] + elif (quote[-1] in (ord(')'), ord('}'))) and (c in (ord('"'), ord('\''), ord('`'))): + quote.append(c) + elif (c == ord('\\')) and (quote[-1] != ord('\'')): + esc = True + elif c == ord('$'): + dollar = True + elif c in (ord('"'), ord('\''), ord('`')): + quote.append(c) + elif c in (ord(')'), ord('}')): brackets -= 1 if brackets == 0: rc.append(c) rc.append(ord('"')) rc.append(ord('\'')) continue - elif (c in (ord('('), ord('{'))): + elif c in (ord('('), ord('{')): brackets += 1 elif c == ord('\\'): esc = True rc.append(c) elif symb: symb = False - if (c in (ord('('), ord('{'))): + if c in (ord('('), ord('{')): brackets += 1 rc.append(ord('\'')) rc.append(ord('"')) @@ -186,29 +189,14 @@ def pp(line): elif line[i - 1 : i + symlen - 1] == symbol: symb = True i += symlen - 1 - elif len(quote) > 0: - if esc: - esc = False - elif dollar: - dollar = False - if c == ord('('): - quote.append(ord(')')) - elif c == ord('{'): - quote.append(ord('}')) - elif c == quote[-1]: - quote[:] = quote[:-1] - elif (quote[-1] in (ord(')'), ord('}'))) and (c in (ord('"'), ord('\''), ord('`'))): - quote.append(c) - elif (c == ord('\\')) and (quote[-1] != ord('\'')): - esc = True - elif c == ord('$'): - dollar = True + elif c == ord('\''): + rc.append(c) + rc.append(ord('\\')) rc.append(c) - elif c in (ord('"'), ord('\''), ord('`')): - quote.append(c) rc.append(c) else: rc.append(c) + rc.append(ord('\'')) return rc for _ in range(iterations): @@ -223,16 +211,6 @@ for _ in range(iterations): elif entered: bashed.append(line) else: - buf = [] - for c in line: - if c == ord('\''): - buf.append(c) - buf.append(ord('\\')) - buf.append(c) - buf.append(c) - else: - buf.append(c) - line = [ord('\'')] + buf + [ord('\'')] buf = bytelist(('echo $\'\\e%i\\e\'' % lineno).encode()) bashed.append(buf + pp(line)) diff --git a/tests/complex b/tests/complex new file mode 100644 index 0000000..2f6af5b --- /dev/null +++ b/tests/complex @@ -0,0 +1,7 @@ +@ +@>h=H + +'@{h}ello @(echo `echo 'W'`"o$(echo $(echo r))"'ld!')' +@('$()$()') + diff --git a/tests/quoted b/tests/quoted new file mode 100644 index 0000000..469b5d8 --- /dev/null +++ b/tests/quoted @@ -0,0 +1,2 @@ +@>set -v +'ello @(echo 'world')!!! diff --git a/tests/quoted-brackets b/tests/quoted-brackets new file mode 100644 index 0000000..5b170d8 --- /dev/null +++ b/tests/quoted-brackets @@ -0,0 +1,3 @@ +@>set -v +'ello @(echo 'wo(rld')!!! +'ello @(echo 'wo)rld')!!! diff --git a/tests/unquoted b/tests/unquoted new file mode 100644 index 0000000..ac3742e --- /dev/null +++ b/tests/unquoted @@ -0,0 +1,2 @@ +@>set -v +'ello @(echo world)!!! -- cgit v1.2.3-70-g09d2