From f6dbe87c03c91cb4ba6672e7dee81475b86c1384 Mon Sep 17 00:00:00 2001
From: Paulo Henrique Silva <ph.silva@gmail.com>
Date: Fri, 6 Mar 2015 15:00:16 -0300
Subject: Add support for unary minus operator on macro parsing

---
 gerber/am_read.py | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/gerber/am_read.py b/gerber/am_read.py
index 05f3343..872c513 100644
--- a/gerber/am_read.py
+++ b/gerber/am_read.py
@@ -126,6 +126,9 @@ def read_macro(macro):
         equation_left_side = 0
         primitive_code = 0
 
+        unary_minus_allowed = False
+        unary_minus = False
+
         if Token.EQUALS in block:
             is_equation = True
         else:
@@ -159,7 +162,14 @@ def read_macro(macro):
                 while not empty():
                     instructions.append((token_to_opcode(pop()), None))
 
+                unary_minus_allowed = True
+
             elif c in Token.OPERATORS:
+                if c == Token.SUB and unary_minus_allowed:
+                    unary_minus = True
+                    unary_minus_allowed = False
+                    continue
+
                 while not empty() and is_op(top()) and precedence(top()) >= precedence(c):
                     instructions.append((token_to_opcode(pop()), None))
 
@@ -204,8 +214,12 @@ def read_macro(macro):
                 if is_primitive and not found_primitive_code:
                     primitive_code = scanner.readint()
                 else:
-                    instructions.append((OpCode.PUSH, scanner.readfloat()))
+                    n = scanner.readfloat()
+                    if unary_minus:
+                        unary_minus = False
+                        n *= -1
 
+                    instructions.append((OpCode.PUSH, n))
             else:
                 # whitespace or unknown char
                 pass
-- 
cgit