[SCM] 2D CAD system branch, master, updated. debian/1.0.0_beta5+nolibs-1-16-gc106faf
Lisandro Damián Nicanor Pérez Meyer
perezmeyer at gmail.com
Fri Jun 17 21:49:19 UTC 2011
The following commit has been merged in the master branch:
commit 8496a6a8c20d56d5d1cd31253e5771d45c04ec90
Author: Lisandro Damián Nicanor Pérez Meyer <perezmeyer at gmail.com>
Date: Fri Jun 17 18:06:48 2011 -0300
Remove dxflib and fparser directories.
We will use the libs provided by Debian.
diff --git a/dxflib/dxflib_commercial_license.txt b/dxflib/dxflib_commercial_license.txt
deleted file mode 100644
index 051acc2..0000000
--- a/dxflib/dxflib_commercial_license.txt
+++ /dev/null
@@ -1,179 +0,0 @@
-dxflib COMMERCIAL LICENSE AGREEMENT
-FOR PROFESSIONAL EDITIONS
-Agreement version 1.2
-
-IMPORTANT-READ CAREFULLY:
-1. This RibbonSoft End-User License Agreement ("Agreement") is a legal
-agreement between you (either an individual or a legal entity)
-("Licensee") and RibbonSoft GmbH ("RibbonSoft") for the RibbonSoft
-software product(s) accompanying this Agreement, which include(s)
-computer software and may include "online" or electronic documentation,
-associated media, and printed materials, including the source code,
-example programs and the documentation ("Licensed Software").
-
-2. The Licensed Software is protected by copyright laws and
-international copyright treaties, as well as other intellectual
-property laws and treaties. The Licensed Software is licensed, not
-sold.
-
-3. By installing, copying, or otherwise using the Licensed Software,
-Licensee agrees to be bound by the terms of this Agreement. If
-Licensee does not agree to the terms of this Agreement, Licensee may
-not install, copy, or otherwise use the Licensed Software.
-
-4. Upon Licensee's acceptance of the terms and conditions of this
-Agreement, RibbonSoft grants Licensee the right to use the Licensed
-Software in the manner provided below.
-
-5. RibbonSoft grants to Licensee as an individual a royalty-free,
-personal, non-exclusive, non-transferable, perpetual license to make
-and use copies of the Licensed Software for the sole purposes of
-designing, developing, and testing Licensee's software product(s)
-("Applications"). Licensee may install copies of the Licensed Software
-on an unlimited number of computers provided that Licensee is the only
-individual using the Licensed Software. If Licensee is an entity,
-RibbonSoft grants Licensee the right to designate one, and only one,
-individual within Licensee's organization who shall have the sole
-right to use the Licensed Software in the manner provided
-above. Licensee may at any time, but not more frequently that once
-every six (6) months, designate another individual within Licensee's
-organization to replace the current designated user by notifying
-RibbonSoft, so long as there is no more than one designated user at any
-given time.
-
-GENERAL TERMS THAT APPLY TO APPLICATIONS AND REDISTRIBUTABLES
-6. RibbonSoft grants Licensee a nonexclusive, royalty-free right to
-reproduce and distribute the object code form of certain portions of the
-Licensed Software ("Redistributables"), as specified in Appendix 1,
-Section 1, for execution on any operating system. Copies of
-Redistributables may only be distributed with and for the sole purpose
-of executing Applications permitted under this Agreement that Licensee
-has created using the Licensed Software. Under no circumstances may any
-copies of Redistributables be distributed separately. This Agreement
-does not give Licensee any rights to distribute any of the parts of
-the Licensed Software listed in Appendix 1, Section 2, neither as a
-whole nor as parts or snippets of code.
-
-7. The license granted in this Agreement for Licensee to create
-Applications and distribute them to Licensee's customers is subject
-to all of the following conditions:
-(i) Licensee will indemnify and hold RibbonSoft, its related companies
-and its suppliers, harmless from and against any claims or liabilities
-arising out of the use, reproduction or distribution of Applications;
-(ii) Applications must be developed using a licensed, registered copy
-of the Licensed Software; (iii) Applications must add primary and
-substantial functionality to the Licensed Software; (iv) Applications
-may not pass on functionality which in any way makes it possible for
-others to create software with the Licensed Software; (v) Applications
-may not compete with the Licensed Software; (iv) Licensee may not use
-RibbonSoft's or any of its suppliers' names, logos, or trademarks to
-market Application(s), except to state that Application was developed
-using the Licensed Software.
-
-NOTE: dxflib Open Source Edition is licensed under the terms of the
-GPL and not under this Agreement. If Licensee has, at any time,
-developed all (or any portions of) the Application(s) using RibbonSoft's
-publicly licensed dxflib Open Source Edition, Licensee must comply
-with RibbonSoft's requirements and license such Application(s)
-(or any portions derived there from) under the terms of the Free Software
-Foundation's GNU General Public License version 2 (the "GPL") a copy of
-which is located at http://www.gnu.org/copyleft/gpl.html#SEC1
-(i.e., any Product(s) and/or parts, components, portions thereof developed
-using GPL licensed software, including dxflib Open Source Edition, must
-be licensed under the terms of the GPL, and the GPL-based source code must
-be made available upon request).
-
-WARRANTY DISCLAIMER
-8. The Licensed Software is licensed to Licensee "as is". To the
-maximum extent permitted by applicable law, RibbonSoft on behalf of
-itself and its suppliers, disclaims all warranties and conditions,
-either express or implied, including, but not limited to, implied
-warranties of merchantability, fitness for a particular purpose, title
-and non-infringement with regard to the Licensed Software.
-
-LIMITATION OF LIABILITY
-9. If, RibbonSoft's warranty disclaimer notwithstanding, RibbonSoft is
-held liable to Licensee, whether in contract, tort or any other legal
-theory, based on the Licensed Software, RibbonSoft's entire liability
-to Licensee and Licensee's exclusive remedy shall be, at RibbonSoft's
-option, either (A) return of the price Licensee paid for the Licensed
-Software, or (B) repair or replacement of the Licensed Software,
-provided Licensee returns to RibbonSoft all copies of the Licensed
-Software as originally delivered to Licensee. RibbonSoft shall not
-under any circumstances be liable to Licensee based on failure of the
-Licensed Software if the failure resulted from accident, abuse or
-misapplication, nor shall RibbonSoft under any circumstances be liable
-for special damages, punitive or exemplary damages, damages for loss
-of profits or interruption of business or for loss or corruption of
-data. Any award of damages from RibbonSoft to Licensee shall not exceed
-the total amount Licensee has paid to RibbonSoft in connection with
-this Agreement.
-
-SUPPORT AND UPDATES
-10. Licensee will be eligible to access to Updates ("Updates") to
-the Licensed Software for a period not to exceed one year from the
-date of initial delivery ("Initial Term"), in accordance with
-RibbonSoft's then current policies and procedures, if any. Such
-policies and procedures may be changed from time to time. Following
-the Initial Term, RibbonSoft will no longer make the Licensed Software
-available to Licensee unless Licensee purchases additional Updates
-according to section 11 below.
-
-GENERAL PROVISIONS
-11. Licensee Name: RibbonSoft may include Licensee's company name in a
-publicly available list of RibbonSoft customers.
-
-12. Renewal of Updates: Licensee may purchase additional Updates
-following the Initial Term at RibbonSoft's terms and conditions
-applicable at the time of renewal.
-
-13. No Assignment: Neither this Agreement nor Licensee's rights under
-this Agreement are assignable or transferable by Licensee either in
-whole or in part to any third party without RibbonSoft's written
-consent. Any attempted assignment or transfer in violation of the
-foregoing shall be void. RibbonSoft may assign or transfer this
-Agreement to any third party who acquires substantially all of
-RibbonSoft copyrights in and to the Licensed Software.
-
-14. Termination: RibbonSoft may terminate the Agreement at any time
-immediately upon written notice by RibbonSoft to Licensee if Licensee
-breaches this Agreement, fails to pay the fees for the Licensed
-Software, or infringes RibbonSoft's intellectual property in or to the
-Licensed Software. Upon termination of the Licenses, Licensee shall
-return to RibbonSoft all copies of Licensed Software that were supplied
-by RibbonSoft. All other copies of Licensed Software in the possession
-or control of Licensee must be erased or destroyed. An officer of
-Licensee must promptly deliver to RibbonSoft a written confirmation
-that this has occurred.
-
-15. Entire Agreement: This Agreement constitutes the complete
-agreement between the parties and supersedes all prior or
-contemporaneous discussions, representations, and proposals, written
-or oral, with respect to the subject matters discussed herein. No
-modification of this Agreement will be effective unless contained in a
-writing executed by an authorized representative of each party. No
-term or condition contained in Licensee's purchase order will apply
-unless expressly accepted by RibbonSoft in writing. If any provision of
-the Agreement is found void or unenforceable, the remainder will
-remain valid and enforceable according to its terms. If any remedy
-provided is determined to have failed for its essential purpose, all
-limitations of liability and exclusions of damages set forth in this
-Agreement shall remain in effect.
-
-16. Governing law, legal venue: This Agreement shall be construed,
-interpreted and governed by the laws of Switzerland, the legal venue
-to be Zurich City Court. RibbonSoft reserves all rights not specifically
-granted in this Agreement.
-
-Appendix 1:
-
-1. Parts of the Licensed Software that are permitted for distribution
-("Redistributables"):
-
-- The Licensed Software's library in object code form
-
-2. Parts of the Licensed Software that are not permitted for distribution
-include, but are not limited to:
-
-- The Licensed Software's source code and header files
-- The Licensed Software's documentation
diff --git a/dxflib/src/dl_attributes.h b/dxflib/src/dl_attributes.h
deleted file mode 100644
index b9036ac..0000000
--- a/dxflib/src/dl_attributes.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_ATTRIBUTES_H
-#define DL_ATTRIBUTES_H
-
-#include <string>
-using std::string;
-
-#include "dl_codes.h"
-
-/**
- * Storing and passing around attributes. Attributes
- * are the layer name, color, width and line type.
- *
- * @author Andrew Mustun
- */
-class DL_Attributes {
-
-public:
-
- /**
- * Default constructor.
- */
- DL_Attributes() {
- setLayer("");
- setColor(0);
- setWidth(0);
- setLineType("BYLAYER");
- }
-
-
-
- /**
- * Constructor for DXF attributes.
- *
- * @param layer Layer name for this entity or NULL for no layer
- * (every entity should be on a named layer!).
- * @param color Color number (0..256). 0 = BYBLOCK, 256 = BYLAYER.
- * @param width Line thickness. Defaults to zero. -1 = BYLAYER,
- * -2 = BYBLOCK, -3 = default width
- * @param lineType Line type name or "BYLAYER" or "BYBLOCK". Defaults
- * to "BYLAYER"
- */
- DL_Attributes(const string& layer,
- int color, int width,
- const string& lineType) {
- setLayer(layer);
- setColor(color);
- setWidth(width);
- setLineType(lineType);
- }
-
-
-
- /**
- * Sets the layer. If the given pointer points to NULL, the
- * new layer name will be an empty but valid string.
- */
- void setLayer(const string& layer) {
- this->layer = layer;
- }
-
-
-
- /**
- * @return Layer name.
- */
- string getLayer() const {
- return layer;
- }
-
-
-
- /**
- * Sets the color.
- *
- * @see DL_Codes, dxfColors
- */
- void setColor(int color) {
- this->color = color;
- }
-
-
-
- /**
- * @return Color.
- *
- * @see DL_Codes, dxfColors
- */
- int getColor() const {
- return color;
- }
-
-
-
- /**
- * Sets the width.
- */
- void setWidth(int width) {
- this->width = width;
- }
-
-
-
- /**
- * @return Width.
- */
- int getWidth() const {
- return width;
- }
-
-
-
- /**
- * Sets the line type. This can be any string and is not
- * checked to be a valid line type.
- */
- void setLineType(const string& lineType) {
- this->lineType = lineType;
- }
-
-
-
- /**
- * @return Line type.
- */
- string getLineType() const {
- if (lineType.length()==0) {
- return "BYLAYER";
- } else {
- return lineType;
- }
- }
-
-
-
- /**
- * Copies attributes (deep copies) from another attribute object.
- */
- DL_Attributes operator = (const DL_Attributes& attrib) {
- setLayer(attrib.layer);
- setColor(attrib.color);
- setWidth(attrib.width);
- setLineType(attrib.lineType);
-
- return *this;
- }
-
-private:
- string layer;
- int color;
- int width;
- string lineType;
-};
-
-#endif
-
-// EOF
diff --git a/dxflib/src/dl_codes.h b/dxflib/src/dl_codes.h
deleted file mode 100644
index aa469d8..0000000
--- a/dxflib/src/dl_codes.h
+++ /dev/null
@@ -1,537 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-/**
- * Defines common DXF codes and constants.
- */
-
-#ifndef DXF_CODES_H
-#define DXF_CODES_H
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#if defined(__OS2__)||defined(__EMX__)||defined(_WIN32)
-#define strcasecmp(s,t) stricmp(s,t)
-#endif
-
-
-#ifdef _WIN32
-#undef M_PI
-#define M_PI 3.14159265358979323846
-#pragma warning(disable : 4800)
-#endif
-
-#ifndef M_PI
-#define M_PI 3.1415926535897932384626433832795
-#endif
-
-#define DL_DXF_MAXLINE 1024
-#define DL_DXF_MAXGROUPCODE 1100
-
-// used to mark invalid vectors:
-//#define DL_DXF_MAXDOUBLE 1.0E+10
-
-/**
- * Codes for colors and DXF versions.
- */
-class DL_Codes {
-public:
- /**
- * Standard DXF colors.
- */
- enum color {
- black = 250,
- green = 3,
- red = 1,
- brown = 15,
- yellow = 2,
- cyan = 4,
- magenta = 6,
- gray = 8,
- blue = 5,
- l_blue = 163,
- l_green = 121,
- l_cyan = 131,
- l_red = 23,
- l_magenta = 221,
- l_gray = 252,
- white = 7,
- bylayer = 256,
- byblock = 0
- };
-
- /**
- * Version numbers for the DXF Format.
- */
- enum version {
- AC1009, AC1012, AC1014, AC1015
- };
-};
-
-
-// Extended color palette:
-// The first entry is only for direct indexing starting with [1]
-// Color 1 is red (1,0,0)
-const double dxfColors[][3] = {
- {0,0,0}, // unused
- {1,0,0}, // 1
- {1,1,0},
- {0,1,0},
- {0,1,1},
- {0,0,1},
- {1,0,1},
- {1,1,1}, // black or white
- {0.5,0.5,0.5},
- {0.75,0.75,0.75},
- {1,0,0}, // 10
- {1,0.5,0.5},
- {0.65,0,0},
- {0.65,0.325,0.325},
- {0.5,0,0},
- {0.5,0.25,0.25},
- {0.3,0,0},
- {0.3,0.15,0.15},
- {0.15,0,0},
- {0.15,0.075,0.075},
- {1,0.25,0}, // 20
- {1,0.625,0.5},
- {0.65,0.1625,0},
- {0.65,0.4063,0.325},
- {0.5,0.125,0},
- {0.5,0.3125,0.25},
- {0.3,0.075,0},
- {0.3,0.1875,0.15},
- {0.15,0.0375,0},
- {0.15,0.0938,0.075},
- {1,0.5,0}, // 30
- {1,0.75,0.5},
- {0.65,0.325,0},
- {0.65,0.4875,0.325},
- {0.5,0.25,0},
- {0.5,0.375,0.25},
- {0.3,0.15,0},
- {0.3,0.225,0.15},
- {0.15,0.075,0},
- {0.15,0.1125,0.075},
- {1,0.75,0}, // 40
- {1,0.875,0.5},
- {0.65,0.4875,0},
- {0.65,0.5688,0.325},
- {0.5,0.375,0},
- {0.5,0.4375,0.25},
- {0.3,0.225,0},
- {0.3,0.2625,0.15},
- {0.15,0.1125,0},
- {0.15,0.1313,0.075},
- {1,1,0}, // 50
- {1,1,0.5},
- {0.65,0.65,0},
- {0.65,0.65,0.325},
- {0.5,0.5,0},
- {0.5,0.5,0.25},
- {0.3,0.3,0},
- {0.3,0.3,0.15},
- {0.15,0.15,0},
- {0.15,0.15,0.075},
- {0.75,1,0}, // 60
- {0.875,1,0.5},
- {0.4875,0.65,0},
- {0.5688,0.65,0.325},
- {0.375,0.5,0},
- {0.4375,0.5,0.25},
- {0.225,0.3,0},
- {0.2625,0.3,0.15},
- {0.1125,0.15,0},
- {0.1313,0.15,0.075},
- {0.5,1,0}, // 70
- {0.75,1,0.5},
- {0.325,0.65,0},
- {0.4875,0.65,0.325},
- {0.25,0.5,0},
- {0.375,0.5,0.25},
- {0.15,0.3,0},
- {0.225,0.3,0.15},
- {0.075,0.15,0},
- {0.1125,0.15,0.075},
- {0.25,1,0}, // 80
- {0.625,1,0.5},
- {0.1625,0.65,0},
- {0.4063,0.65,0.325},
- {0.125,0.5,0},
- {0.3125,0.5,0.25},
- {0.075,0.3,0},
- {0.1875,0.3,0.15},
- {0.0375,0.15,0},
- {0.0938,0.15,0.075},
- {0,1,0}, // 90
- {0.5,1,0.5},
- {0,0.65,0},
- {0.325,0.65,0.325},
- {0,0.5,0},
- {0.25,0.5,0.25},
- {0,0.3,0},
- {0.15,0.3,0.15},
- {0,0.15,0},
- {0.075,0.15,0.075},
- {0,1,0.25}, // 100
- {0.5,1,0.625},
- {0,0.65,0.1625},
- {0.325,0.65,0.4063},
- {0,0.5,0.125},
- {0.25,0.5,0.3125},
- {0,0.3,0.075},
- {0.15,0.3,0.1875},
- {0,0.15,0.0375},
- {0.075,0.15,0.0938},
- {0,1,0.5}, // 110
- {0.5,1,0.75},
- {0,0.65,0.325},
- {0.325,0.65,0.4875},
- {0,0.5,0.25},
- {0.25,0.5,0.375},
- {0,0.3,0.15},
- {0.15,0.3,0.225},
- {0,0.15,0.075},
- {0.075,0.15,0.1125},
- {0,1,0.75}, // 120
- {0.5,1,0.875},
- {0,0.65,0.4875},
- {0.325,0.65,0.5688},
- {0,0.5,0.375},
- {0.25,0.5,0.4375},
- {0,0.3,0.225},
- {0.15,0.3,0.2625},
- {0,0.15,0.1125},
- {0.075,0.15,0.1313},
- {0,1,1}, // 130
- {0.5,1,1},
- {0,0.65,0.65},
- {0.325,0.65,0.65},
- {0,0.5,0.5},
- {0.25,0.5,0.5},
- {0,0.3,0.3},
- {0.15,0.3,0.3},
- {0,0.15,0.15},
- {0.075,0.15,0.15},
- {0,0.75,1}, // 140
- {0.5,0.875,1},
- {0,0.4875,0.65},
- {0.325,0.5688,0.65},
- {0,0.375,0.5},
- {0.25,0.4375,0.5},
- {0,0.225,0.3},
- {0.15,0.2625,0.3},
- {0,0.1125,0.15},
- {0.075,0.1313,0.15},
- {0,0.5,1}, // 150
- {0.5,0.75,1},
- {0,0.325,0.65},
- {0.325,0.4875,0.65},
- {0,0.25,0.5},
- {0.25,0.375,0.5},
- {0,0.15,0.3},
- {0.15,0.225,0.3},
- {0,0.075,0.15},
- {0.075,0.1125,0.15},
- {0,0.25,1}, // 160
- {0.5,0.625,1},
- {0,0.1625,0.65},
- {0.325,0.4063,0.65},
- {0,0.125,0.5},
- {0.25,0.3125,0.5},
- {0,0.075,0.3},
- {0.15,0.1875,0.3},
- {0,0.0375,0.15},
- {0.075,0.0938,0.15},
- {0,0,1}, // 170
- {0.5,0.5,1},
- {0,0,0.65},
- {0.325,0.325,0.65},
- {0,0,0.5},
- {0.25,0.25,0.5},
- {0,0,0.3},
- {0.15,0.15,0.3},
- {0,0,0.15},
- {0.075,0.075,0.15},
- {0.25,0,1}, // 180
- {0.625,0.5,1},
- {0.1625,0,0.65},
- {0.4063,0.325,0.65},
- {0.125,0,0.5},
- {0.3125,0.25,0.5},
- {0.075,0,0.3},
- {0.1875,0.15,0.3},
- {0.0375,0,0.15},
- {0.0938,0.075,0.15},
- {0.5,0,1}, // 190
- {0.75,0.5,1},
- {0.325,0,0.65},
- {0.4875,0.325,0.65},
- {0.25,0,0.5},
- {0.375,0.25,0.5},
- {0.15,0,0.3},
- {0.225,0.15,0.3},
- {0.075,0,0.15},
- {0.1125,0.075,0.15},
- {0.75,0,1}, // 200
- {0.875,0.5,1},
- {0.4875,0,0.65},
- {0.5688,0.325,0.65},
- {0.375,0,0.5},
- {0.4375,0.25,0.5},
- {0.225,0,0.3},
- {0.2625,0.15,0.3},
- {0.1125,0,0.15},
- {0.1313,0.075,0.15},
- {1,0,1}, // 210
- {1,0.5,1},
- {0.65,0,0.65},
- {0.65,0.325,0.65},
- {0.5,0,0.5},
- {0.5,0.25,0.5},
- {0.3,0,0.3},
- {0.3,0.15,0.3},
- {0.15,0,0.15},
- {0.15,0.075,0.15},
- {1,0,0.75}, // 220
- {1,0.5,0.875},
- {0.65,0,0.4875},
- {0.65,0.325,0.5688},
- {0.5,0,0.375},
- {0.5,0.25,0.4375},
- {0.3,0,0.225},
- {0.3,0.15,0.2625},
- {0.15,0,0.1125},
- {0.15,0.075,0.1313},
- {1,0,0.5}, // 230
- {1,0.5,0.75},
- {0.65,0,0.325},
- {0.65,0.325,0.4875},
- {0.5,0,0.25},
- {0.5,0.25,0.375},
- {0.3,0,0.15},
- {0.3,0.15,0.225},
- {0.15,0,0.075},
- {0.15,0.075,0.1125},
- {1,0,0.25}, // 240
- {1,0.5,0.625},
- {0.65,0,0.1625},
- {0.65,0.325,0.4063},
- {0.5,0,0.125},
- {0.5,0.25,0.3125},
- {0.3,0,0.075},
- {0.3,0.15,0.1875},
- {0.15,0,0.0375},
- {0.15,0.075,0.0938},
- {0.33,0.33,0.33}, // 250
- {0.464,0.464,0.464},
- {0.598,0.598,0.598},
- {0.732,0.732,0.732},
- {0.866,0.866,0.866},
- {1,1,1} // 255
- }
- ;
-
-
-// AutoCAD VERSION aliases
-#define VER_R12 DL_Codes::AC1009
-#define VER_LT2 DL_Codes::AC1009
-#define VER_R13 DL_Codes::AC1012 // not supported yet
-#define VER_LT95 DL_Codes::AC1012 // not supported yet
-#define VER_R14 DL_Codes::AC1014 // not supported yet
-#define VER_LT97 DL_Codes::AC1014 // not supported yet
-#define VER_LT98 DL_Codes::AC1014 // not supported yet
-#define VER_2000 DL_Codes::AC1015
-#define VER_2002 DL_Codes::AC1015
-
-
-// DXF Group Codes:
-
-// Strings
-#define STRGRP_START 0
-#define STRGRP_END 9
-
-// Coordinates
-#define CRDGRP_START 10
-#define CRDGRP_END 19
-
-// Real values
-#define RLGRP_START 38
-#define RLGRP_END 59
-
-// Short integer values
-#define SHOGRP_START 60
-#define SHOGRP_END 79
-
-// New in Release 13,
-#define SUBCLASS 100
-
-// More coordinates
-#define CRD2GRP_START 210
-#define CRD2GRP_END 239
-
-// Extended data strings
-#define ESTRGRP_START 1000
-#define ESTRGRP_END 1009
-
-// Extended data reals
-#define ERLGRP_START 1010
-#define ERLGRP_END 1059
-
-
-#define Y8_COORD_CODE 28
-#define Z0_COORD_CODE 30
-#define Z8_COORD_CODE 38
-
-#define POINT_COORD_CODE 10
-#define INSERT_COORD_CODE 10
-
-#define CRD2GRP_START 210
-#define CRD2GRP_END 239
-
-#define THICKNESS 39
-#define FIRST_REAL_CODE THICKNESS
-#define LAST_REAL_CODE 59
-#define FIRST_INT_CODE 60
-#define ATTFLAGS_CODE 70
-#define PLINE_FLAGS_CODE 70
-#define LAYER_FLAGS_CODE 70
-#define FLD_LEN_CODE 73 // Inside ATTRIB resbuf
-#define LAST_INT_CODE 79
-#define X_EXTRU_CODE 210
-#define Y_EXTRU_CODE 220
-#define Z_EXTRU_CODE 230
-#define COMMENT_CODE 999
-
-// Start and endpoints of a line
-#define LINE_START_CODE 10 // Followed by x coord
-#define LINE_END_CODE 11 // Followed by x coord
-
-// Some codes used by blocks
-#define BLOCK_FLAGS_CODE 70 // An int containing flags
-#define BLOCK_BASE_CODE 10 // Origin of block definition
-#define XREF_DEPENDENT 16 // If a block contains an XREF
-#define XREF_RESOLVED 32 // If a XREF resolved ok
-#define REFERENCED 64 // If a block is ref'd in DWG
-
-#define XSCALE_CODE 41
-#define YSCALE_CODE 42
-#define ANGLE_CODE 50
-#define INS_POINT_CODE 10 // Followed by x of ins pnt
-#define NAME2_CODE 3 // Second appearance of name
-
-// Some codes used by circle entities
-#define CENTER_CODE 10 // Followed by x of center
-#define RADIUS_CODE 40 // Followd by radius of circle
-
-#define COND_OP_CODE -4 // Conditional op,ads_ssget
-
-// When using ads_buildlist you MUST use RTDXF0 instead of these
-#define ENTITY_TYPE_CODE 0 // Then there is LINE, 3DFACE..
-#define SES_CODE 0 // Start End String Code
-#define FILE_SEP_CODE 0 // File separator
-#define SOT_CODE 0 // Start Of Table
-#define TEXTVAL_CODE 1
-#define NAME_CODE 2
-#define BLOCK_NAME_CODE 2
-#define SECTION_NAME_CODE 2
-#define ENT_HAND_CODE 5 // What follows is hexa string
-#define TXT_STYLE_CODE 7 // Inside attributes
-#define LAYER_NAME_CODE 8 // What follows is layer name
-#define FIRST_XCOORD_CODE 10 // Group code x of 1st coord
-#define FIRST_YCOORD_CODE 20 // Group code y of 1st coord
-#define FIRST_ZCOORD_CODE 30 // Group code z of 1st coord
-#define L_START_CODE 10
-#define L_END_CODE 11
-#define TXTHI_CODE 40
-#define SCALE_X_CODE 41
-#define SCALE_Y_CODE 42
-#define SCALE_Z_CODE 43
-#define BULGE_CODE 42 // Used in PLINE verts for arcs
-#define ROTATION_CODE 50
-#define COLOUR_CODE 62 // What follows is a color int
-#define LTYPE_CODE 6 // What follows is a linetype
-
-
-// Attribute flags
-#define ATTS_FOLLOW_CODE 66
-#define ATT_TAG_CODE 2
-#define ATT_VAL_CODE 1
-#define ATT_FLAGS_CODE 70 // 4 1 bit flags as follows...
-#define ATT_INVIS_FLAG 1
-#define ATT_CONST_FLAG 2
-#define ATT_VERIFY_FLAG 4 // Prompt and verify
-#define ATT_PRESET_FLAG 8 // No prompt and no verify
-
-// PLINE defines
-// Flags
-#define OPEN_PLINE 0x00
-#define CLOSED_PLINE 0x01
-#define POLYLINE3D 0x80
-#define PFACE_MESH 0x40
-#define PGON_MESH 0x10
-// Vertices follow entity, required in POLYLINES
-#define VERTS_FOLLOW_CODE 66 // Value should always be 1
-#define VERTEX_COORD_CODE 10
-
-
-// LAYER flags
-#define FROZEN 1
-#define FROZEN_BY_DEF 2
-#define LOCKED 4
-#define OBJECT_USED 64 // Object is ref'd in the dwg
-
-#define BLOCK_EN_CODE -2 // Block entity definition
-#define E_NAME -1 // Entity name
-
-// Extended data codes
-#define EXTD_SENTINEL (-3)
-#define EXTD_STR 1000
-#define EXTD_APP_NAME 1001
-#define EXTD_CTL_STR 1002
-#define EXTD_LYR_STR 1003
-#define EXTD_CHUNK 1004
-#define EXTD_HANDLE 1005
-#define EXTD_POINT 1010
-#define EXTD_POS 1011
-#define EXTD_DISP 1012
-#define EXTD_DIR 1013
-#define EXTD_FLOAT 1040
-#define EXTD_DIST 1041
-#define EXTD_SCALE 1042
-#define EXTD_INT16 1070
-#define EXTD_INT32 1071
-
-// UCS codes for use in ads_trans
-#define WCS_TRANS_CODE 0
-#define UCS_TRANS_CODE 1
-#define DCS_TRANS_CODE 2
-#define PCS_TRANS_CODE 3
-
-#endif
-
diff --git a/dxflib/src/dl_creationadapter.h b/dxflib/src/dl_creationadapter.h
deleted file mode 100644
index ef3096d..0000000
--- a/dxflib/src/dl_creationadapter.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_CREATIONADAPTER_H
-#define DL_CREATIONADAPTER_H
-
-#include "dl_creationinterface.h"
-
-/**
- * An abstract adapter class for receiving DXF events when a DXF file is being read.
- * The methods in this class are empty. This class exists as convenience for creating
- * listener objects.
- *
- * @author Andrew Mustun
- */
-class DL_CreationAdapter : public DL_CreationInterface {
-public:
- DL_CreationAdapter() {}
- virtual ~DL_CreationAdapter() {}
- virtual void addLayer(const DL_LayerData&) {}
- virtual void addBlock(const DL_BlockData&) {}
- virtual void endBlock() {}
- virtual void addPoint(const DL_PointData&) {}
- virtual void addLine(const DL_LineData&) {}
- virtual void addArc(const DL_ArcData&) {}
- virtual void addCircle(const DL_CircleData&) {}
- virtual void addEllipse(const DL_EllipseData&) {}
-
- virtual void addPolyline(const DL_PolylineData&) {}
- virtual void addVertex(const DL_VertexData&) {}
-
- virtual void addSpline(const DL_SplineData&) {}
- virtual void addControlPoint(const DL_ControlPointData&) {}
- virtual void addKnot(const DL_KnotData&) {}
-
- virtual void addInsert(const DL_InsertData&) {}
-
- virtual void addMText(const DL_MTextData&) {}
- virtual void addMTextChunk(const char*) {}
- virtual void addText(const DL_TextData&) {}
-
- virtual void addDimAlign(const DL_DimensionData&,
- const DL_DimAlignedData&) {}
- virtual void addDimLinear(const DL_DimensionData&,
- const DL_DimLinearData&) {}
- virtual void addDimRadial(const DL_DimensionData&,
- const DL_DimRadialData&) {}
- virtual void addDimDiametric(const DL_DimensionData&,
- const DL_DimDiametricData&) {}
- virtual void addDimAngular(const DL_DimensionData&,
- const DL_DimAngularData&) {}
- virtual void addDimAngular3P(const DL_DimensionData&,
- const DL_DimAngular3PData&) {}
- virtual void addDimOrdinate(const DL_DimensionData&,
- const DL_DimOrdinateData&) {}
- virtual void addLeader(const DL_LeaderData&) {}
- virtual void addLeaderVertex(const DL_LeaderVertexData&) {}
-
- virtual void addHatch(const DL_HatchData&) {}
-
- virtual void addTrace(const DL_TraceData&) {}
- virtual void add3dFace(const DL_3dFaceData&) {}
- virtual void addSolid(const DL_SolidData&) {}
-
- virtual void addImage(const DL_ImageData&) {}
- virtual void linkImage(const DL_ImageDefData&) {}
- virtual void addHatchLoop(const DL_HatchLoopData&) {}
- virtual void addHatchEdge(const DL_HatchEdgeData&) {}
- virtual void endEntity() {}
- virtual void addComment(const char* comment) {}
- virtual void setVariableVector(const char*,
- double, double, double, int) {}
- virtual void setVariableString(const char*, const char*, int) {}
- virtual void setVariableInt(const char*, int, int) {}
- virtual void setVariableDouble(const char*, double, int) {}
- virtual void endSequence() {}
-};
-
-#endif
diff --git a/dxflib/src/dl_creationinterface.h b/dxflib/src/dl_creationinterface.h
deleted file mode 100644
index f2b8c35..0000000
--- a/dxflib/src/dl_creationinterface.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_CREATIONINTERFACE_H
-#define DL_CREATIONINTERFACE_H
-
-#include <string.h>
-
-#include "dl_attributes.h"
-#include "dl_codes.h"
-#include "dl_entities.h"
-#include "dl_extrusion.h"
-
-/**
- * Abstract class (interface) for the creation of new entities.
- * Inherit your class which takes care of the entities in the
- * processed DXF file from this interface.
- *
- * Double arrays passed to your implementation contain 3 double
- * values for x, y, z coordinates unless stated differently.
- *
- * @author Andrew Mustun
- */
-class DL_CreationInterface {
-public:
- DL_CreationInterface() {
- extrusion = new DL_Extrusion;
- }
- virtual ~DL_CreationInterface() {
- delete extrusion;
- }
-
- /**
- * Called for every layer.
- */
- virtual void addLayer(const DL_LayerData& data) = 0;
-
- /**
- * Called for every block. Note: all entities added after this
- * command go into this block until endBlock() is called.
- *
- * @see endBlock()
- */
- virtual void addBlock(const DL_BlockData& data) = 0;
-
- /** Called to end the current block */
- virtual void endBlock() = 0;
-
- /** Called for every point */
- virtual void addPoint(const DL_PointData& data) = 0;
-
- /** Called for every line */
- virtual void addLine(const DL_LineData& data) = 0;
-
- /** Called for every arc */
- virtual void addArc(const DL_ArcData& data) = 0;
-
- /** Called for every circle */
- virtual void addCircle(const DL_CircleData& data) = 0;
-
- /** Called for every ellipse */
- virtual void addEllipse(const DL_EllipseData& data) = 0;
-
- /** Called for every polyline start */
- virtual void addPolyline(const DL_PolylineData& data) = 0;
-
- /** Called for every polyline vertex */
- virtual void addVertex(const DL_VertexData& data) = 0;
-
- /** Called for every spline */
- virtual void addSpline(const DL_SplineData& data) = 0;
-
- /** Called for every spline control point */
- virtual void addControlPoint(const DL_ControlPointData& data) = 0;
-
- /** Called for every spline knot value */
- virtual void addKnot(const DL_KnotData& data) = 0;
-
- /** Called for every insert. */
- virtual void addInsert(const DL_InsertData& data) = 0;
-
- /** Called for every trace start */
- virtual void addTrace(const DL_TraceData& data) = 0;
-
- /** Called for every 3dface start */
- virtual void add3dFace(const DL_3dFaceData& data) = 0;
-
- /** Called for every solid start */
- virtual void addSolid(const DL_SolidData& data) = 0;
-
-
- /** Called for every Multi Text entity. */
- virtual void addMText(const DL_MTextData& data) = 0;
-
- /**
- * Called for additional text chunks for MTEXT entities.
- * The chunks come at 250 character in size each. Note that
- * those chunks come <b>before</b> the actual MTEXT entity.
- */
- virtual void addMTextChunk(const char* text) = 0;
-
- /** Called for every Text entity. */
- virtual void addText(const DL_TextData& data) = 0;
-
- /**
- * Called for every aligned dimension entity.
- */
- virtual void addDimAlign(const DL_DimensionData& data,
- const DL_DimAlignedData& edata) = 0;
- /**
- * Called for every linear or rotated dimension entity.
- */
- virtual void addDimLinear(const DL_DimensionData& data,
- const DL_DimLinearData& edata) = 0;
-
- /**
- * Called for every radial dimension entity.
- */
- virtual void addDimRadial(const DL_DimensionData& data,
- const DL_DimRadialData& edata) = 0;
-
- /**
- * Called for every diametric dimension entity.
- */
- virtual void addDimDiametric(const DL_DimensionData& data,
- const DL_DimDiametricData& edata) = 0;
-
- /**
- * Called for every angular dimension (2 lines version) entity.
- */
- virtual void addDimAngular(const DL_DimensionData& data,
- const DL_DimAngularData& edata) = 0;
-
- /**
- * Called for every angular dimension (3 points version) entity.
- */
- virtual void addDimAngular3P(const DL_DimensionData& data,
- const DL_DimAngular3PData& edata) = 0;
-
- /**
- * Called for every ordinate dimension entity.
- */
- virtual void addDimOrdinate(const DL_DimensionData& data,
- const DL_DimOrdinateData& edata) = 0;
-
- /**
- * Called for every leader start.
- */
- virtual void addLeader(const DL_LeaderData& data) = 0;
-
- /**
- * Called for every leader vertex
- */
- virtual void addLeaderVertex(const DL_LeaderVertexData& data) = 0;
-
- /**
- * Called for every hatch entity.
- */
- virtual void addHatch(const DL_HatchData& data) = 0;
-
- /**
- * Called for every image entity.
- */
- virtual void addImage(const DL_ImageData& data) = 0;
-
- /**
- * Called for every image definition.
- */
- virtual void linkImage(const DL_ImageDefData& data) = 0;
-
- /**
- * Called for every hatch loop.
- */
- virtual void addHatchLoop(const DL_HatchLoopData& data) = 0;
-
- /**
- * Called for every hatch edge entity.
- */
- virtual void addHatchEdge(const DL_HatchEdgeData& data) = 0;
-
- /**
- * Called after an entity has been completed.
- */
- virtual void endEntity() = 0;
-
- /**
- * Called for every comment in the DXF file (code 999).
- */
- virtual void addComment(const char* comment) = 0;
-
- /**
- * Called for every vector variable in the DXF file (e.g. "$EXTMIN").
- */
- virtual void setVariableVector(const char* key,
- double v1, double v2, double v3, int code) = 0;
-
- /**
- * Called for every string variable in the DXF file (e.g. "$ACADVER").
- */
- virtual void setVariableString(const char* key, const char* value, int code) = 0;
-
- /**
- * Called for every int variable in the DXF file (e.g. "$ACADMAINTVER").
- */
- virtual void setVariableInt(const char* key, int value, int code) = 0;
-
- /**
- * Called for every double variable in the DXF file (e.g. "$DIMEXO").
- */
- virtual void setVariableDouble(const char* key, double value, int code) = 0;
-
- /**
- * Called when a SEQEND occurs (when a POLYLINE or ATTRIB is done)
- */
- virtual void endSequence() = 0;
-
- /** Sets the current attributes for entities. */
- void setAttributes(const DL_Attributes& attrib) {
- attributes = attrib;
- }
-
- /** @return the current attributes used for new entities. */
- DL_Attributes getAttributes() {
- return attributes;
- }
-
- /** Sets the current attributes for entities. */
- void setExtrusion(double dx, double dy, double dz, double elevation) {
- extrusion->setDirection(dx, dy, dz);
- extrusion->setElevation(elevation);
- }
-
- /** @return the current attributes used for new entities. */
- DL_Extrusion* getExtrusion() {
- return extrusion;
- }
-
-protected:
- DL_Attributes attributes;
- DL_Extrusion *extrusion;
-};
-
-#endif
diff --git a/dxflib/src/dl_dxf.cpp b/dxflib/src/dl_dxf.cpp
deleted file mode 100644
index ddc0daa..0000000
--- a/dxflib/src/dl_dxf.cpp
+++ /dev/null
@@ -1,5070 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#include "dl_dxf.h"
-
-#include <algorithm>
-#include <string>
-#include <cstdio>
-#include <cassert>
-#include <cmath>
-
-#include "dl_attributes.h"
-#include "dl_codes.h"
-#include "dl_creationinterface.h"
-#include "dl_writer_ascii.h"
-
-
-/**
- * Default constructor.
- */
-DL_Dxf::DL_Dxf() {
- styleHandleStd = 0;
- version = VER_2000;
-
- vertices = NULL;
- maxVertices = 0;
- vertexIndex = 0;
-
- knots = NULL;
- maxKnots = 0;
- knotIndex = 0;
-
- controlPoints = NULL;
- maxControlPoints = 0;
- controlPointIndex = 0;
-
- leaderVertices = NULL;
- maxLeaderVertices = 0;
- leaderVertexIndex = 0;
-
- hatchLoops = NULL;
- maxHatchLoops = 0;
- hatchLoopIndex = -1;
- hatchEdges = NULL;
- maxHatchEdges = NULL;
- hatchEdgeIndex = NULL;
- dropEdges = false;
-}
-
-
-
-/**
- * Destructor.
- */
-DL_Dxf::~DL_Dxf() {
- if (vertices!=NULL) {
- delete[] vertices;
- }
- if (knots!=NULL) {
- delete[] knots;
- }
- if (controlPoints!=NULL) {
- delete[] controlPoints;
- }
- if (leaderVertices!=NULL) {
- delete[] leaderVertices;
- }
- if (hatchLoops!=NULL) {
- delete[] hatchLoops;
- }
- if (hatchEdges!=NULL) {
- for (int i=0; i<maxHatchLoops; ++i) {
- if (hatchEdges[i]!=NULL) {
- delete[] hatchEdges[i];
- }
- }
- delete[] hatchEdges;
- }
- if (maxHatchEdges!=NULL) {
- delete[] maxHatchEdges;
- }
- if (hatchEdgeIndex!=NULL) {
- delete[] hatchEdgeIndex;
- }
-}
-
-
-
-/**
- * @brief Reads the given file and calls the appropriate functions in
- * the given creation interface for every entity found in the file.
- *
- * @param file Input
- * Path and name of file to read
- * @param creationInterface
- * Pointer to the class which takes care of the entities in the file.
- *
- * @retval true If \p file could be opened.
- * @retval false If \p file could not be opened.
- */
-bool DL_Dxf::in(const string& file, DL_CreationInterface* creationInterface) {
- FILE *fp;
- firstCall = true;
- currentEntity = DL_UNKNOWN;
- int errorCounter = 0;
-
- fp = fopen(file.c_str(), "rt");
- if (fp) {
- while (readDxfGroups(fp, creationInterface, &errorCounter)) {}
- fclose(fp);
- if (errorCounter>0) {
- std::cerr << "DXF Filter: There have been " << errorCounter <<
- " errors. The drawing might be incomplete / incorrect.\n";
- }
- return true;
- }
-
- return false;
-}
-
-
-
-/**
- * Reads a DXF file from an existing stream.
- *
- * @param stream The string stream.
- * @param creationInterface
- * Pointer to the class which takes care of the entities in the file.
- *
- * @retval true If \p file could be opened.
- * @retval false If \p file could not be opened.
- */
-#ifndef __GCC2x__
-bool DL_Dxf::in(std::stringstream& stream,
- DL_CreationInterface* creationInterface) {
-
- int errorCounter = 0;
-
- if (stream.good()) {
- firstCall=true;
- currentEntity = DL_UNKNOWN;
- while (readDxfGroups(stream, creationInterface, &errorCounter)) {}
- if (errorCounter>0) {
- std::cerr << "DXF Filter: There have been " << errorCounter <<
- " errors. The drawing might be incomplete / incorrect.\n";
- }
- return true;
- }
- return false;
-}
-#endif
-
-
-
-/**
- * @brief Reads a group couplet from a DXF file. Calls another function
- * to process it.
- *
- * A group couplet consists of two lines that represent a single
- * piece of data. An integer constant on the first line indicates
- * the type of data. The value is on the next line.\n
- *
- * This function reads a couplet, determines the type of data, and
- * passes the value to the the appropriate handler function of
- * \p creationInterface.\n
- *
- * \p fp is advanced so that the next call to \p readDXFGroups() reads
- * the next couplet in the file.
- *
- * @param fp Handle of input file
- * @param creationInterface Handle of class which processes entities
- * in the file
- *
- * @retval true If EOF not reached.
- * @retval false If EOF reached.
- */
-bool DL_Dxf::readDxfGroups(FILE *fp, DL_CreationInterface* creationInterface,
- int* errorCounter) {
-
- bool ok = true;
- static int line = 1;
-
- // Read one group of the DXF file and chop the lines:
- if (DL_Dxf::getChoppedLine(groupCodeTmp, DL_DXF_MAXLINE, fp) &&
- DL_Dxf::getChoppedLine(groupValue, DL_DXF_MAXLINE, fp) ) {
-
- groupCode = (unsigned int)stringToInt(groupCodeTmp, &ok);
-
- if (ok) {
- //std::cerr << groupCode << "\n";
- //std::cerr << groupValue << "\n";
- line+=2;
- processDXFGroup(creationInterface, groupCode, groupValue);
- } else {
- std::cerr << "DXF read error: Line: " << line << "\n";
- if (errorCounter!=NULL) {
- (*errorCounter)++;
- }
- // try to fix:
- std::cerr << "DXF read error: trying to fix..\n";
- // drop a line to sync:
- DL_Dxf::getChoppedLine(groupCodeTmp, DL_DXF_MAXLINE, fp);
- }
- }
-
- return !feof(fp);
-}
-
-
-
-/**
- * Same as above but for stringstreams.
- */
-#ifndef __GCC2x__
-bool DL_Dxf::readDxfGroups(std::stringstream& stream,
- DL_CreationInterface* creationInterface,
- int* errorCounter) {
-
- bool ok = true;
- static int line = 1;
-
- // Read one group of the DXF file and chop the lines:
- if (DL_Dxf::getChoppedLine(groupCodeTmp, DL_DXF_MAXLINE, stream) &&
- DL_Dxf::getChoppedLine(groupValue, DL_DXF_MAXLINE, stream) ) {
-
- groupCode = (unsigned int)stringToInt(groupCodeTmp, &ok);
-
- if (ok) {
- //std::cout << "group code: " << groupCode << "\n";
- //std::cout << "group value: " << groupValue << "\n";
- line+=2;
- processDXFGroup(creationInterface, groupCode, groupValue);
- } else {
- std::cerr << "DXF read error: Line: " << line << "\n";
- if (errorCounter!=NULL) {
- (*errorCounter)++;
- }
- // try to fix:
- //std::cerr << "DXF read error: trying to fix..\n";
- // drop a line to sync:
- //DL_Dxf::getChoppedLine(groupCodeTmp, DL_DXF_MAXLINE, stream);
- }
- }
- return !stream.eof();
-}
-#endif
-
-
-
-/**
- * @brief Reads line from file & strips whitespace at start and newline
- * at end.
- *
- * @param s Output\n
- * Pointer to character array that chopped line will be returned in.
- * @param size Size of \p s. (Including space for NULL.)
- * @param fp Input\n
- * Handle of input file.
- *
- * @retval true if line could be read
- * @retval false if \p fp is already at end of file
- *
- * @todo Change function to use safer FreeBSD strl* functions
- * @todo Is it a problem if line is blank (i.e., newline only)?
- * Then, when function returns, (s==NULL).
- */
-bool DL_Dxf::getChoppedLine(char *s, unsigned int size, FILE *fp) {
- if (!feof(fp)) {
- // The whole line in the file. Includes space for NULL.
- char* wholeLine = new char[size];
- // Only the useful part of the line
- char* line;
-
- line = fgets(wholeLine, size, fp);
-
- if (line!=NULL && line[0] != '\0') { // Evaluates to fgets() retval
- // line == wholeLine at this point.
- // Both guaranteed to be NULL terminated.
-
- // Strip leading whitespace and trailing CR/LF.
- stripWhiteSpace(&line);
-
- strncpy(s, line, size);
- s[size] = '\0';
- // s should always be NULL terminated, because:
- assert(size > strlen(line));
- }
-
- delete[] wholeLine; // Done with wholeLine
-
- return true;
- } else {
- s[0] = '\0';
- return false;
- }
-}
-
-
-
-/**
- * Same as above but for stringstreams.
- */
-#ifndef __GCC2x__
-bool DL_Dxf::getChoppedLine(char *s, unsigned int size,
- std::stringstream& stream) {
-
- if (!stream.eof()) {
- // Only the useful part of the line
- char* line = new char[size+1];
- char* oriLine = line;
- stream.getline(line, size);
- stripWhiteSpace(&line);
- strncpy(s, line, size);
- s[size] = '\0';
- assert(size > strlen(s));
- delete[] oriLine;
- return true;
- } else {
- s[0] = '\0';
- return false;
- }
-}
-#endif
-
-
-
-/**
- * @brief Strips leading whitespace and trailing Carriage Return (CR)
- * and Line Feed (LF) from NULL terminated string.
- *
- * @param s Input and output.
- * NULL terminates string.
- *
- * @retval true if \p s is non-NULL
- * @retval false if \p s is NULL
- */
-bool DL_Dxf::stripWhiteSpace(char** s) {
- // last non-NULL char:
- int lastChar = strlen(*s) - 1;
-
- // Is last character CR or LF?
- while ( (lastChar >= 0) &&
- (((*s)[lastChar] == 10) || ((*s)[lastChar] == 13) ||
- ((*s)[lastChar] == ' ' || ((*s)[lastChar] == '\t'))) ) {
- (*s)[lastChar] = '\0';
- lastChar--;
- }
-
- // Skip whitespace, excluding \n, at beginning of line
- while ((*s)[0]==' ' || (*s)[0]=='\t') {
- ++(*s);
- }
-
- return ((*s) ? true : false);
-}
-
-
-
-/**
- * Processes a group (pair of group code and value).
- *
- * @param creationInterface Handle to class that creates entities and
- * other CAD data from DXF group codes
- *
- * @param groupCode Constant indicating the data type of the group.
- * @param groupValue The data value.
- *
- * @retval true if done processing current entity and new entity begun
- * @retval false if not done processing current entity
-*/
-bool DL_Dxf::processDXFGroup(DL_CreationInterface* creationInterface,
- int groupCode, const char *groupValue) {
-
- // Init on first call
- if (firstCall) {
- for (int i=0; i<DL_DXF_MAXGROUPCODE; ++i) {
- values[i][0] = '\0';
- }
- settingValue[0] = '\0';
- firstCall=false;
- }
-
- // Indicates comment or dxflib version:
- if (groupCode==999) {
- if (groupValue!=NULL) {
- if (!strncmp(groupValue, "dxflib", 6)) {
- libVersion = getLibVersion(&groupValue[7]);
- }
-
- addComment(creationInterface, groupValue);
- }
- }
-
- // Indicates start of new entity or var
- else if (groupCode==0 || groupCode==9) {
-
- // If new entity is encountered, the last one must be complete
- // prepare attributes which can be used for most entities:
- char name[DL_DXF_MAXLINE+1];
- if ((values[8])[0]!='\0') {
- strcpy(name, values[8]);
- }
- // defaults to layer '0':
- else {
- strcpy(name, "0");
- }
-
- int width;
- // Compatibillity with qcad1:
- if ((values[39])[0]!='\0' &&
- (values[370])[0]=='\0') {
- width = toInt(values[39], -1);
- }
- // since autocad 2002:
- else if ((values[370])[0]!='\0') {
- width = toInt(values[370], -1);
- }
- // default to BYLAYER:
- else {
- width = -1;
- }
-
- int color;
- color = toInt(values[62], 256);
-
- char linetype[DL_DXF_MAXLINE+1];
- strcpy(linetype, toString(values[6], "BYLAYER"));
-
- attrib = DL_Attributes(values[8], // layer
- color, // color
- width, // width
- linetype); // linetype
- creationInterface->setAttributes(attrib);
-
- creationInterface->setExtrusion(toReal(values[210], 0.0),
- toReal(values[220], 0.0),
- toReal(values[230], 1.0),
- toReal(values[30], 0.0));
-
- // Add the last entity via creationInterface
- switch (currentEntity) {
- case DL_SETTING:
- addSetting(creationInterface);
- break;
-
- case DL_LAYER:
- addLayer(creationInterface);
- break;
-
- case DL_BLOCK:
- addBlock(creationInterface);
- break;
-
- case DL_ENDBLK:
- endBlock(creationInterface);
- break;
-
- case DL_ENTITY_POINT:
- addPoint(creationInterface);
- break;
-
- case DL_ENTITY_LINE:
- addLine(creationInterface);
- break;
-
- case DL_ENTITY_POLYLINE:
- //bulge = toReal(values[42]);
- // fall through
- case DL_ENTITY_LWPOLYLINE:
- addPolyline(creationInterface);
- break;
-
- case DL_ENTITY_VERTEX:
- addVertex(creationInterface);
- break;
-
- case DL_ENTITY_SPLINE:
- addSpline(creationInterface);
- break;
-
- case DL_ENTITY_ARC:
- addArc(creationInterface);
- break;
-
- case DL_ENTITY_CIRCLE:
- addCircle(creationInterface);
- break;
-
- case DL_ENTITY_ELLIPSE:
- addEllipse(creationInterface);
- break;
-
- case DL_ENTITY_INSERT:
- addInsert(creationInterface);
- break;
-
- case DL_ENTITY_MTEXT:
- addMText(creationInterface);
- break;
-
- case DL_ENTITY_TEXT:
- addText(creationInterface);
- break;
-
- case DL_ENTITY_ATTRIB:
- addAttrib(creationInterface);
- break;
-
- case DL_ENTITY_DIMENSION: {
- int type = (toInt(values[70], 0)&0x07);
-
- switch (type) {
- case 0:
- addDimLinear(creationInterface);
- break;
-
- case 1:
- addDimAligned(creationInterface);
- break;
-
- case 2:
- addDimAngular(creationInterface);
- break;
-
- case 3:
- addDimDiametric(creationInterface);
- break;
-
- case 4:
- addDimRadial(creationInterface);
- break;
-
- case 5:
- addDimAngular3P(creationInterface);
- break;
-
- case 6:
- addDimOrdinate(creationInterface);
- break;
-
- default:
- break;
- }
- }
- break;
-
- case DL_ENTITY_LEADER:
- addLeader(creationInterface);
- break;
-
- case DL_ENTITY_HATCH:
- addHatch(creationInterface);
- break;
-
- case DL_ENTITY_IMAGE:
- addImage(creationInterface);
- break;
-
- case DL_ENTITY_IMAGEDEF:
- addImageDef(creationInterface);
- break;
-
- case DL_ENTITY_TRACE:
- addTrace(creationInterface);
- break;
-
- case DL_ENTITY_3DFACE:
- add3dFace(creationInterface);
- break;
-
- case DL_ENTITY_SOLID:
- addSolid(creationInterface);
- break;
-
- case DL_ENTITY_SEQEND:
- endSequence(creationInterface);
- break;
-
- default:
- break;
- }
-
-
- // reset all values (they are not persistent and only this
- // way we can detect default values for unstored settings)
- for (int i=0; i<DL_DXF_MAXGROUPCODE; ++i) {
- values[i][0] = '\0';
- }
- settingValue[0] = '\0';
- settingKey[0] = '\0';
-
-
- // Last DXF entity or setting has been handled
- // Now determine what the next entity or setting type is
-
- int prevEntity = currentEntity;
-
- // Read DXF settings:
- if (groupValue[0]=='$') {
- currentEntity = DL_SETTING;
- strncpy(settingKey, groupValue, DL_DXF_MAXLINE);
- settingKey[DL_DXF_MAXLINE] = '\0';
- }
- // Read Layers:
- else if (!strcmp(groupValue, "LAYER")) {
- currentEntity = DL_LAYER;
-
- }
- // Read Blocks:
- else if (!strcmp(groupValue, "BLOCK")) {
- currentEntity = DL_BLOCK;
- } else if (!strcmp(groupValue, "ENDBLK")) {
- currentEntity = DL_ENDBLK;
-
- }
- // Read entities:
- else if (!strcmp(groupValue, "POINT")) {
- currentEntity = DL_ENTITY_POINT;
- } else if (!strcmp(groupValue, "LINE")) {
- currentEntity = DL_ENTITY_LINE;
- } else if (!strcmp(groupValue, "POLYLINE")) {
- currentEntity = DL_ENTITY_POLYLINE;
- } else if (!strcmp(groupValue, "LWPOLYLINE")) {
- currentEntity = DL_ENTITY_LWPOLYLINE;
- } else if (!strcmp(groupValue, "VERTEX")) {
- currentEntity = DL_ENTITY_VERTEX;
- } else if (!strcmp(groupValue, "SPLINE")) {
- currentEntity = DL_ENTITY_SPLINE;
- } else if (!strcmp(groupValue, "ARC")) {
- currentEntity = DL_ENTITY_ARC;
- } else if (!strcmp(groupValue, "ELLIPSE")) {
- currentEntity = DL_ENTITY_ELLIPSE;
- } else if (!strcmp(groupValue, "CIRCLE")) {
- currentEntity = DL_ENTITY_CIRCLE;
- } else if (!strcmp(groupValue, "INSERT")) {
- currentEntity = DL_ENTITY_INSERT;
- } else if (!strcmp(groupValue, "TEXT")) {
- currentEntity = DL_ENTITY_TEXT;
- } else if (!strcmp(groupValue, "MTEXT")) {
- currentEntity = DL_ENTITY_MTEXT;
- } else if (!strcmp(groupValue, "ATTRIB")) {
- currentEntity = DL_ENTITY_ATTRIB;
- } else if (!strcmp(groupValue, "DIMENSION")) {
- currentEntity = DL_ENTITY_DIMENSION;
- } else if (!strcmp(groupValue, "LEADER")) {
- currentEntity = DL_ENTITY_LEADER;
- } else if (!strcmp(groupValue, "HATCH")) {
- currentEntity = DL_ENTITY_HATCH;
- } else if (!strcmp(groupValue, "IMAGE")) {
- currentEntity = DL_ENTITY_IMAGE;
- } else if (!strcmp(groupValue, "IMAGEDEF")) {
- currentEntity = DL_ENTITY_IMAGEDEF;
- } else if (!strcmp(groupValue, "TRACE")) {
- currentEntity = DL_ENTITY_TRACE;
- } else if (!strcmp(groupValue, "SOLID")) {
- currentEntity = DL_ENTITY_SOLID;
- } else if (!strcmp(groupValue, "3DFACE")) {
- currentEntity = DL_ENTITY_3DFACE;
- } else if (!strcmp(groupValue, "SEQEND")) {
- currentEntity = DL_ENTITY_SEQEND;
- } else {
- currentEntity = DL_UNKNOWN;
- }
-
- // end of old style POLYLINE entity
- if (prevEntity==DL_ENTITY_VERTEX && currentEntity!=DL_ENTITY_VERTEX) {
- endEntity(creationInterface);
- }
-
- return true;
-
- } else {
- // Group code does not indicate start of new entity or setting,
- // so this group must be continuation of data for the current
- // one.
- if (groupCode<DL_DXF_MAXGROUPCODE) {
-
- bool handled = false;
-
- switch (currentEntity) {
- case DL_ENTITY_MTEXT:
- handled = handleMTextData(creationInterface);
- break;
-
- case DL_ENTITY_LWPOLYLINE:
- handled = handleLWPolylineData(creationInterface);
- break;
-
- case DL_ENTITY_SPLINE:
- handled = handleSplineData(creationInterface);
- break;
-
- case DL_ENTITY_LEADER:
- handled = handleLeaderData(creationInterface);
- break;
-
- case DL_ENTITY_HATCH:
- handled = handleHatchData(creationInterface);
- break;
-
- default:
- break;
- }
-
- if (!handled) {
- // Normal group / value pair:
- strncpy(values[groupCode], groupValue, DL_DXF_MAXLINE);
- values[groupCode][DL_DXF_MAXLINE] = '\0';
- }
- }
-
- return false;
- }
- return false;
-}
-
-
-
-/**
- * Adds a comment from the DXF file.
- */
-void DL_Dxf::addComment(DL_CreationInterface* creationInterface, const char* comment) {
- creationInterface->addComment(comment);
-}
-
-
-
-/**
- * Adds a variable from the DXF file.
- */
-void DL_Dxf::addSetting(DL_CreationInterface* creationInterface) {
- int c = -1;
- for (int i=0; i<=380; ++i) {
- if (values[i][0]!='\0') {
- c = i;
- break;
- }
- }
-
- // string
- if (c>=0 && c<=9) {
- creationInterface->setVariableString(settingKey,
- values[c], c);
- }
- // vector
- else if (c>=10 && c<=39) {
- if (c==10) {
- creationInterface->setVariableVector(
- settingKey,
- toReal(values[c]),
- toReal(values[c+10]),
- toReal(values[c+20]),
- c);
- }
- }
- // double
- else if (c>=40 && c<=59) {
- creationInterface->setVariableDouble(settingKey,
- toReal(values[c]),
- c);
- }
- // int
- else if (c>=60 && c<=99) {
- creationInterface->setVariableInt(settingKey,
- toInt(values[c]),
- c);
- }
- // misc
- else if (c>=0) {
- creationInterface->setVariableString(settingKey,
- values[c],
- c);
- }
-}
-
-
-
-/**
- * Adds a layer that was read from the file via the creation interface.
- */
-void DL_Dxf::addLayer(DL_CreationInterface* creationInterface) {
- // correct some impossible attributes for layers:
- attrib = creationInterface->getAttributes();
- if (attrib.getColor()==256 || attrib.getColor()==0) {
- attrib.setColor(7);
- }
- if (attrib.getWidth()<0) {
- attrib.setWidth(1);
- }
- if (!strcasecmp(attrib.getLineType().c_str(), "BYLAYER") ||
- !strcasecmp(attrib.getLineType().c_str(), "BYBLOCK")) {
- attrib.setLineType("CONTINUOUS");
- }
-
- // add layer
- creationInterface->addLayer(DL_LayerData(values[2],
- toInt(values[70])));
-}
-
-
-
-/**
- * Adds a block that was read from the file via the creation interface.
- */
-void DL_Dxf::addBlock(DL_CreationInterface* creationInterface) {
- DL_BlockData d(
- // Name:
- values[2],
- // flags:
- toInt(values[70]),
- // base point:
- toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]));
-
- creationInterface->addBlock(d);
-}
-
-
-
-/**
- * Ends a block that was read from the file via the creation interface.
- */
-void DL_Dxf::endBlock(DL_CreationInterface* creationInterface) {
- creationInterface->endBlock();
-}
-
-
-
-/**
- * Adds a point entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addPoint(DL_CreationInterface* creationInterface) {
- DL_PointData d(toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]));
- creationInterface->addPoint(d);
-}
-
-
-
-/**
- * Adds a line entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addLine(DL_CreationInterface* creationInterface) {
- DL_LineData d(toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]),
- toReal(values[11]),
- toReal(values[21]),
- toReal(values[31]));
-
- creationInterface->addLine(d);
-}
-
-
-
-/**
- * Adds a polyline entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addPolyline(DL_CreationInterface* creationInterface) {
- DL_PolylineData pd(maxVertices, toInt(values[71], 0), toInt(values[72], 0), toInt(values[70], 0));
- creationInterface->addPolyline(pd);
-
- if (currentEntity==DL_ENTITY_LWPOLYLINE) {
- for (int i=0; i<maxVertices; i++) {
- DL_VertexData d(vertices[i*4],
- vertices[i*4+1],
- vertices[i*4+2],
- vertices[i*4+3]);
-
- creationInterface->addVertex(d);
- }
- creationInterface->endEntity();
- }
-}
-
-
-
-/**
- * Adds a polyline vertex entity that was read from the file
- * via the creation interface.
- */
-void DL_Dxf::addVertex(DL_CreationInterface* creationInterface) {
- DL_VertexData d(toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]),
- //bulge);
- toReal(values[42]));
-
- //bulge = toReal(values[42]);
-
- creationInterface->addVertex(d);
-}
-
-
-
-/**
- * Adds a spline entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addSpline(DL_CreationInterface* creationInterface) {
- DL_SplineData sd(toInt(values[71], 3),
- maxKnots,
- maxControlPoints,
- toInt(values[70], 4));
- /*DL_SplineData sd(toInt(values[71], 3), toInt(values[72], 0),
- toInt(values[73], 0), toInt(values[70], 4));*/
- creationInterface->addSpline(sd);
-
- int i;
- for (i=0; i<maxControlPoints; i++) {
- DL_ControlPointData d(controlPoints[i*3],
- controlPoints[i*3+1],
- controlPoints[i*3+2]);
-
- creationInterface->addControlPoint(d);
- }
- for (i=0; i<maxKnots; i++) {
- DL_KnotData k(knots[i]);
-
- creationInterface->addKnot(k);
- }
-}
-
-
-
-/**
- * Adds an arc entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addArc(DL_CreationInterface* creationInterface) {
- DL_ArcData d(toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]),
- toReal(values[40]),
- toReal(values[50]),
- toReal(values[51]));
-
- creationInterface->addArc(d);
-}
-
-
-
-/**
- * Adds a circle entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addCircle(DL_CreationInterface* creationInterface) {
- DL_CircleData d(toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]),
- toReal(values[40]));
-
- creationInterface->addCircle(d);
-}
-
-
-
-/**
- * Adds an ellipse entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addEllipse(DL_CreationInterface* creationInterface) {
- DL_EllipseData d(toReal(values[10]),
- toReal(values[20]),
- toReal(values[30]),
- toReal(values[11]),
- toReal(values[21]),
- toReal(values[31]),
- toReal(values[40], 1.0),
- toReal(values[41], 0.0),
- toReal(values[42], 2*M_PI));
-
- creationInterface->addEllipse(d);
-}
-
-
-
-/**
- * Adds an insert entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addInsert(DL_CreationInterface* creationInterface) {
- DL_InsertData d(values[2],
- // insertion point
- toReal(values[10], 0.0),
- toReal(values[20], 0.0),
- toReal(values[30], 0.0),
- // scale:
- toReal(values[41], 1.0),
- toReal(values[42], 1.0),
- toReal(values[43], 1.0),
- // angle:
- toReal(values[50], 0.0),
- // cols / rows:
- toInt(values[70], 1),
- toInt(values[71], 1),
- // spacing:
- toReal(values[44], 0.0),
- toReal(values[45], 0.0));
-
- creationInterface->addInsert(d);
-}
-
-
-
-/**
- * Adds a trace entity (4 edge closed polyline) that was read from the file via the creation interface.
- *
- * @author AHM
- */
-void DL_Dxf::addTrace(DL_CreationInterface* creationInterface) {
- DL_TraceData td;
-
- for (int k = 0; k < 4; k++) {
- td.x[k] = toReal(values[10 + k]);
- td.y[k] = toReal(values[20 + k]);
- td.z[k] = toReal(values[30 + k]);
- }
- creationInterface->addTrace(td);
-}
-
-
-
-/**
- * Adds a 3dface entity that was read from the file via the creation interface.
- */
-void DL_Dxf::add3dFace(DL_CreationInterface* creationInterface) {
- DL_3dFaceData td;
-
- for (int k = 0; k < 4; k++) {
- td.x[k] = toReal(values[10 + k]);
- td.y[k] = toReal(values[20 + k]);
- td.z[k] = toReal(values[30 + k]);
- }
- creationInterface->add3dFace(td);
-}
-
-
-
-/**
- * Adds a solid entity (filled trace) that was read from the file via the creation interface.
- *
- * @author AHM
- */
-void DL_Dxf::addSolid(DL_CreationInterface* creationInterface) {
- DL_SolidData sd;
-
- for (int k = 0; k < 4; k++) {
- sd.x[k] = toReal(values[10 + k]);
- sd.y[k] = toReal(values[20 + k]);
- sd.z[k] = toReal(values[30 + k]);
- }
- creationInterface->addSolid(sd);
-}
-
-
-/**
- * Adds an MText entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addMText(DL_CreationInterface* creationInterface) {
- double angle = 0.0;
-
- if (values[50][0]!='\0') {
- if (libVersion<=0x02000200) {
- // wrong but compatible with dxflib <=2.0.2.0:
- angle = toReal(values[50], 0.0);
- } else {
- angle = (toReal(values[50], 0.0)*2*M_PI)/360.0;
- }
- } else if (values[11][0]!='\0' && values[21][0]!='\0') {
- double x = toReal(values[11], 0.0);
- double y = toReal(values[21], 0.0);
-
- if (fabs(x)<1.0e-6) {
- if (y>0.0) {
- angle = M_PI/2.0;
- } else {
- angle = M_PI/2.0*3.0;
- }
- } else {
- angle = atan(y/x);
- }
- }
-
- DL_MTextData d(
- // insertion point
- toReal(values[10], 0.0),
- toReal(values[20], 0.0),
- toReal(values[30], 0.0),
- // height
- toReal(values[40], 2.5),
- // width
- toReal(values[41], 100.0),
- // attachment point
- toInt(values[71], 1),
- // drawing direction
- toInt(values[72], 1),
- // line spacing style
- toInt(values[73], 1),
- // line spacing factor
- toReal(values[44], 1.0),
- // text
- values[1],
- // style
- values[7],
- // angle
- angle);
- creationInterface->addMText(d);
-}
-
-
-
-/**
- * Handles additional MText data.
- */
-bool DL_Dxf::handleMTextData(DL_CreationInterface* creationInterface) {
- // Special handling of text chunks for MTEXT entities:
- if (groupCode==3) {
- creationInterface->addMTextChunk(groupValue);
- return true;
- }
-
- return false;
-}
-
-
-
-/**
- * Handles additional polyline data.
- */
-bool DL_Dxf::handleLWPolylineData(DL_CreationInterface* /*creationInterface*/) {
- // Allocate LWPolyline vertices (group code 90):
- if (groupCode==90) {
- maxVertices = toInt(groupValue);
- if (maxVertices>0) {
- if (vertices!=NULL) {
- delete[] vertices;
- }
- vertices = new double[4*maxVertices];
- for (int i=0; i<maxVertices; ++i) {
- vertices[i*4] = 0.0;
- vertices[i*4+1] = 0.0;
- vertices[i*4+2] = 0.0;
- vertices[i*4+3] = 0.0;
- }
- }
- vertexIndex=-1;
- return true;
- }
-
- // Compute LWPolylines vertices (group codes 10/20/30/42):
- else if (groupCode==10 || groupCode==20 ||
- groupCode==30 || groupCode==42) {
-
- if (vertexIndex<maxVertices-1 && groupCode==10) {
- vertexIndex++;
- }
-
- if (groupCode<=30) {
- if (vertexIndex>=0 && vertexIndex<maxVertices) {
- vertices[4*vertexIndex + (groupCode/10-1)]
- = toReal(groupValue);
- }
- } else if (groupCode==42 && vertexIndex<maxVertices) {
- vertices[4*vertexIndex + 3] = toReal(groupValue);
- }
- return true;
- }
- return false;
-}
-
-
-
-/**
- * Handles additional spline data.
- */
-bool DL_Dxf::handleSplineData(DL_CreationInterface* /*creationInterface*/) {
- // Allocate Spline knots (group code 72):
- if (groupCode==72) {
- maxKnots = toInt(groupValue);
- if (maxKnots>0) {
- if (knots!=NULL) {
- delete[] knots;
- }
- knots = new double[maxKnots];
- for (int i=0; i<maxKnots; ++i) {
- knots[i] = 0.0;
- }
- }
- knotIndex=-1;
- return true;
- }
-
- // Allocate Spline control points (group code 73):
- else if (groupCode==73) {
- maxControlPoints = toInt(groupValue);
- if (maxControlPoints>0) {
- if (controlPoints!=NULL) {
- delete[] controlPoints;
- }
- controlPoints = new double[3*maxControlPoints];
- for (int i=0; i<maxControlPoints; ++i) {
- controlPoints[i*3] = 0.0;
- controlPoints[i*3+1] = 0.0;
- controlPoints[i*3+2] = 0.0;
- }
- }
- controlPointIndex=-1;
- return true;
- }
-
- // Compute spline knot vertices (group code 40):
- else if (groupCode==40) {
- if (knotIndex<maxKnots-1) {
- knotIndex++;
- knots[knotIndex] = toReal(groupValue);
- }
- return true;
- }
-
- // Compute spline control points (group codes 10/20/30):
- else if (groupCode==10 || groupCode==20 ||
- groupCode==30) {
-
- if (controlPointIndex<maxControlPoints-1 && groupCode==10) {
- controlPointIndex++;
- }
-
- if (controlPointIndex>=0 && controlPointIndex<maxControlPoints) {
- controlPoints[3*controlPointIndex + (groupCode/10-1)]
- = toReal(groupValue);
- }
- return true;
- }
- return false;
-}
-
-
-
-/**
- * Handles additional leader data.
- */
-bool DL_Dxf::handleLeaderData(DL_CreationInterface* /*creationInterface*/) {
- // Allocate Leader vertices (group code 76):
- if (groupCode==76) {
- maxLeaderVertices = toInt(groupValue);
- if (maxLeaderVertices>0) {
- if (leaderVertices!=NULL) {
- delete[] leaderVertices;
- }
- leaderVertices = new double[3*maxLeaderVertices];
- for (int i=0; i<maxLeaderVertices; ++i) {
- leaderVertices[i*3] = 0.0;
- leaderVertices[i*3+1] = 0.0;
- leaderVertices[i*3+2] = 0.0;
- }
- }
- leaderVertexIndex=-1;
- return true;
- }
-
- // Compute Leader vertices (group codes 10/20/30):
- else if (groupCode==10 || groupCode==20 || groupCode==30) {
-
- if (leaderVertexIndex<maxLeaderVertices-1 && groupCode==10) {
- leaderVertexIndex++;
- }
-
- if (groupCode<=30) {
- if (leaderVertexIndex>=0 &&
- leaderVertexIndex<maxLeaderVertices) {
- leaderVertices[3*leaderVertexIndex + (groupCode/10-1)]
- = toReal(groupValue);
- }
- }
- return true;
- }
-
- return false;
-}
-
-
-
-/**
- * Handles additional hatch data.
- */
-bool DL_Dxf::handleHatchData(DL_CreationInterface* /*creationInterface*/) {
-
- static int firstPolylineStatus = 0;
-
- // Allocate hatch loops (group code 91):
- if (groupCode==91 && toInt(groupValue)>0) {
-
- if (hatchLoops!=NULL) {
- delete[] hatchLoops;
- hatchLoops = NULL;
- }
- if (maxHatchEdges!=NULL) {
- delete[] maxHatchEdges;
- maxHatchEdges = NULL;
- }
- if (hatchEdgeIndex!=NULL) {
- delete[] hatchEdgeIndex;
- hatchEdgeIndex = NULL;
- }
- if (hatchEdges!=NULL) {
- for (int i=0; i<maxHatchLoops; ++i) {
- delete[] hatchEdges[i];
- }
- delete[] hatchEdges;
- hatchEdges = NULL;
- }
- maxHatchLoops = toInt(groupValue);
-
- if (maxHatchLoops>0) {
- hatchLoops = new DL_HatchLoopData[maxHatchLoops];
- maxHatchEdges = new int[maxHatchLoops];
- hatchEdgeIndex = new int[maxHatchLoops];
- hatchEdges = new DL_HatchEdgeData*[maxHatchLoops];
- for (int i=0; i<maxHatchLoops; ++i) {
- hatchEdges[i] = NULL;
- maxHatchEdges[i] = 0;
- }
- hatchLoopIndex = -1;
- dropEdges = false;
- }
- return true;
- }
-
- // Allocate hatch edges, group code 93
- if (groupCode==93 && toInt(groupValue)>0) {
- if (hatchLoopIndex<maxHatchLoops-1 && hatchLoops!=NULL &&
- maxHatchEdges!=NULL && hatchEdgeIndex!=NULL &&
- hatchEdges!=NULL) {
-
- dropEdges = false;
-
- hatchLoopIndex++;
- hatchLoops[hatchLoopIndex]
- = DL_HatchLoopData(toInt(groupValue));
-
- maxHatchEdges[hatchLoopIndex] = toInt(groupValue);
- hatchEdgeIndex[hatchLoopIndex] = -1;
- hatchEdges[hatchLoopIndex]
- = new DL_HatchEdgeData[toInt(groupValue)];
- firstPolylineStatus = 0;
- } else {
- dropEdges = true;
- }
- return true;
- }
-
- // Init hatch edge for non-polyline boundary (group code 72)
- if (hatchEdges!=NULL &&
- hatchEdgeIndex!=NULL &&
- maxHatchEdges!=NULL &&
- hatchLoopIndex>=0 &&
- hatchLoopIndex<maxHatchLoops &&
- hatchEdgeIndex[hatchLoopIndex] <
- maxHatchEdges[hatchLoopIndex] &&
- (atoi(values[92])&2)==0 && // not a polyline
- groupCode==72 &&
- !dropEdges) {
-
- hatchEdgeIndex[hatchLoopIndex]++;
-
- hatchEdges[hatchLoopIndex][hatchEdgeIndex[hatchLoopIndex]]
- .type = toInt(groupValue);
- hatchEdges[hatchLoopIndex][hatchEdgeIndex[hatchLoopIndex]]
- .defined = false;
-
- return true;
- }
-
- // Handle hatch edges for non-polyline boundaries
- // (group codes 10, 20, 11, 21, 40, 50, 51, 73)
- if (!dropEdges &&
- hatchEdges!=NULL &&
- hatchEdgeIndex!=NULL &&
- hatchLoopIndex>=0 &&
- hatchLoopIndex<maxHatchLoops &&
- hatchEdges[hatchLoopIndex]!=NULL &&
- hatchEdgeIndex[hatchLoopIndex]>=0 &&
- hatchEdgeIndex[hatchLoopIndex] <
- maxHatchEdges[hatchLoopIndex] &&
- ((atoi(values[92])&2)==0) && // not a polyline
- (groupCode==10 || groupCode==20 ||
- groupCode==11 || groupCode==21 ||
- groupCode==40 || groupCode==50 ||
- groupCode==51 || groupCode==73)) {
-
- if (hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].defined==false) {
- if (hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].type==1) {
- switch (groupCode) {
- case 10:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].x1
- = toReal(groupValue);
- break;
- case 20:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].y1
- = toReal(groupValue);
- break;
- case 11:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].x2
- = toReal(groupValue);
- break;
- case 21:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].y2
- = toReal(groupValue);
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].defined = true;
- break;
- default:
- break;
- }
- }
-
- if (hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].type==2) {
- switch (groupCode) {
- case 10:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].cx
- = toReal(groupValue);
- break;
- case 20:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].cy
- = toReal(groupValue);
- break;
- case 40:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].radius
- = toReal(groupValue);
- break;
- case 50:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].angle1
- = toReal(groupValue)/360.0*2*M_PI;
- break;
- case 51:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].angle2
- = toReal(groupValue)/360.0*2*M_PI;
- break;
- case 73:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].ccw
- = (bool)toInt(groupValue);
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].defined = true;
- break;
- default:
- break;
- }
- }
- }
- return true;
- }
-
- /*
- // 2003/12/31: polyline hatches can be extremely slow and are rarely used
- //
- // Handle hatch edges for polyline boundaries
- // (group codes 10, 20, 42)
- if (!dropEdges &&
- hatchEdges!=NULL &&
- hatchEdgeIndex!=NULL &&
- hatchLoopIndex>=0 &&
- hatchLoopIndex<maxHatchLoops &&
- hatchEdges[hatchLoopIndex]!=NULL &&
- //hatchEdgeIndex[hatchLoopIndex]>=0 &&
- hatchEdgeIndex[hatchLoopIndex] <
- maxHatchEdges[hatchLoopIndex] &&
- ((atoi(values[92])&2)==2)) { // a polyline
-
- if (groupCode==10 || groupCode==20 ||
- groupCode==42) {
-
- std::cout << " found polyline edge data: " << groupCode << "\n";
- std::cout << " value: " << toReal(groupValue) << "\n";
-
- static double lastX = 0.0;
- static double lastY = 0.0;
- static double lastB = 0.0;
-
- if (firstPolylineStatus<2) {
- switch (groupCode) {
- case 10:
- firstPolylineStatus++;
- if (firstPolylineStatus==1) {
- lastX = toReal(groupValue);
- std::cout << " firstX: " << lastX << "\n";
- }
- break;
-
- case 20:
- lastY = toReal(groupValue);
- std::cout << " firstY: " << lastY << "\n";
- break;
-
- case 42:
- lastB = toReal(groupValue);
- break;
-
- default:
- break;
- }
-
- if (firstPolylineStatus!=2) {
- return true;
- }
- }
-
-
- switch (groupCode) {
- case 10:
- hatchEdgeIndex[hatchLoopIndex]++;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].type = 1;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].x1
- = lastX;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].x2
- = lastX = toReal(groupValue);
- std::cout << " X: " << lastX << "\n";
- break;
- case 20:
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].y1
- = lastY;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].y2
- = lastY = toReal(groupValue);
- std::cout << " Y: " << lastY << "\n";
- break;
- / *
- case 42: {
- // convert to arc:
- double x1 = hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].x1;
- double y1 = hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].y1;
- double x2 = hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].x2;
- double y2 = hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].y2;
-
- double bulge = toReal(groupValue);
-
- bool reversed = (bulge<0.0);
- double alpha = atan(bulge)*4.0;
- double radius;
- double cx;
- double cy;
- double a1;
- double a2;
- double mx = (x2+x1)/2.0;
- double my = (y2+y1)/2.0;
- double dist = sqrt(pow(x2-x1,2) + pow(y2-y1,2)) / 2.0;
-
- // alpha can't be 0.0 at this point
- radius = fabs(dist / sin(alpha/2.0));
-
- double wu = fabs(pow(radius, 2.0) - pow(dist, 2.0));
- double h = sqrt(wu);
- double angle = acos((x2-x1) / dist);
-
- if (bulge>0.0) {
- angle+=M_PI/2.0;
- } else {
- angle-=M_PI/2.0;
- }
-
- if (fabs(alpha)>M_PI) {
- h*=-1.0;
- }
-
- cx = mx + cos(angle) * h;
- cy = my + sin(angle) * h;
-
- a1 = hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].type = 2;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].ccw = (toReal(groupValue)>0.0);
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].cx = cx;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].cy = cy;
- hatchEdges[hatchLoopIndex]
- [hatchEdgeIndex[hatchLoopIndex]].radius = radius;
- } break;
- * /
-
- default:
- break;
- }
- } else {
- // end polyline boundary
- dropEdges = true;
- }
-
- return true;
- }
- */
-
- return false;
-}
-
-
-
-
-/**
- * Adds an text entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addText(DL_CreationInterface* creationInterface) {
- DL_TextData d(
- // insertion point
- toReal(values[10], 0.0),
- toReal(values[20], 0.0),
- toReal(values[30], 0.0),
- // alignment point
- toReal(values[11], 0.0),
- toReal(values[21], 0.0),
- toReal(values[31], 0.0),
- // height
- toReal(values[40], 2.5),
- // x scale
- toReal(values[41], 1.0),
- // generation flags
- toInt(values[71], 0),
- // h just
- toInt(values[72], 0),
- // v just
- toInt(values[73], 0),
- // text
- values[1],
- // style
- values[7],
- // angle
- (toReal(values[50], 0.0)*2*M_PI)/360.0);
-
- creationInterface->addText(d);
-}
-
-
-
-/**
- * Adds an attrib entity that was read from the file via the creation interface.
- * @todo add attrib instead of normal text
- */
-void DL_Dxf::addAttrib(DL_CreationInterface* creationInterface) {
- DL_TextData d(
- // insertion point
- toReal(values[10], 0.0),
- toReal(values[20], 0.0),
- toReal(values[30], 0.0),
- // alignment point
- toReal(values[11], 0.0),
- toReal(values[21], 0.0),
- toReal(values[31], 0.0),
- // height
- toReal(values[40], 2.5),
- // x scale
- toReal(values[41], 1.0),
- // generation flags
- toInt(values[71], 0),
- // h just
- toInt(values[72], 0),
- // v just
- toInt(values[74], 0),
- // text
- values[1],
- // style
- values[7],
- // angle
- (toReal(values[50], 0.0)*2*M_PI)/360.0);
-
- creationInterface->addText(d);
-}
-
-
-
-/**
- * @return dimension data from current values.
- */
-DL_DimensionData DL_Dxf::getDimData() {
- // generic dimension data:
- return DL_DimensionData(
- // def point
- toReal(values[10], 0.0),
- toReal(values[20], 0.0),
- toReal(values[30], 0.0),
- // text middle point
- toReal(values[11], 0.0),
- toReal(values[21], 0.0),
- toReal(values[31], 0.0),
- // type
- toInt(values[70], 0),
- // attachment point
- toInt(values[71], 5),
- // line sp. style
- toInt(values[72], 1),
- // line sp. factor
- toReal(values[41], 1.0),
- // text
- values[1],
- // style
- values[3],
- // angle
- toReal(values[53], 0.0));
-}
-
-
-
-/**
- * Adds a linear dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimLinear(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- // horizontal / vertical / rotated dimension:
- DL_DimLinearData dl(
- // definition point 1
- toReal(values[13], 0.0),
- toReal(values[23], 0.0),
- toReal(values[33], 0.0),
- // definition point 2
- toReal(values[14], 0.0),
- toReal(values[24], 0.0),
- toReal(values[34], 0.0),
- // angle
- toReal(values[50], 0.0),
- // oblique
- toReal(values[52], 0.0));
- creationInterface->addDimLinear(d, dl);
-}
-
-
-
-/**
- * Adds an aligned dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimAligned(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- // aligned dimension:
- DL_DimAlignedData da(
- // extension point 1
- toReal(values[13], 0.0),
- toReal(values[23], 0.0),
- toReal(values[33], 0.0),
- // extension point 2
- toReal(values[14], 0.0),
- toReal(values[24], 0.0),
- toReal(values[34], 0.0));
- creationInterface->addDimAlign(d, da);
-}
-
-
-
-/**
- * Adds a radial dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimRadial(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- DL_DimRadialData dr(
- // definition point
- toReal(values[15], 0.0),
- toReal(values[25], 0.0),
- toReal(values[35], 0.0),
- // leader length:
- toReal(values[40], 0.0));
- creationInterface->addDimRadial(d, dr);
-}
-
-
-
-/**
- * Adds a diametric dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimDiametric(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- // diametric dimension:
- DL_DimDiametricData dr(
- // definition point
- toReal(values[15], 0.0),
- toReal(values[25], 0.0),
- toReal(values[35], 0.0),
- // leader length:
- toReal(values[40], 0.0));
- creationInterface->addDimDiametric(d, dr);
-}
-
-
-
-/**
- * Adds an angular dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimAngular(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- // angular dimension:
- DL_DimAngularData da(
- // definition point 1
- toReal(values[13], 0.0),
- toReal(values[23], 0.0),
- toReal(values[33], 0.0),
- // definition point 2
- toReal(values[14], 0.0),
- toReal(values[24], 0.0),
- toReal(values[34], 0.0),
- // definition point 3
- toReal(values[15], 0.0),
- toReal(values[25], 0.0),
- toReal(values[35], 0.0),
- // definition point 4
- toReal(values[16], 0.0),
- toReal(values[26], 0.0),
- toReal(values[36], 0.0));
- creationInterface->addDimAngular(d, da);
-}
-
-
-/**
- * Adds an angular dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimAngular3P(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- // angular dimension (3P):
- DL_DimAngular3PData da(
- // definition point 1
- toReal(values[13], 0.0),
- toReal(values[23], 0.0),
- toReal(values[33], 0.0),
- // definition point 2
- toReal(values[14], 0.0),
- toReal(values[24], 0.0),
- toReal(values[34], 0.0),
- // definition point 3
- toReal(values[15], 0.0),
- toReal(values[25], 0.0),
- toReal(values[35], 0.0));
- creationInterface->addDimAngular3P(d, da);
-}
-
-
-
-/**
- * Adds an ordinate dimension entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addDimOrdinate(DL_CreationInterface* creationInterface) {
- DL_DimensionData d = getDimData();
-
- // ordinate dimension:
- DL_DimOrdinateData dl(
- // definition point 1
- toReal(values[13], 0.0),
- toReal(values[23], 0.0),
- toReal(values[33], 0.0),
- // definition point 2
- toReal(values[14], 0.0),
- toReal(values[24], 0.0),
- toReal(values[34], 0.0),
- (toInt(values[70])&64)==64 // true: X-type, false: Y-type
- );
- creationInterface->addDimOrdinate(d, dl);
-}
-
-
-
-/**
- * Adds a leader entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addLeader(DL_CreationInterface* creationInterface) {
- // leader (arrow)
- DL_LeaderData le(
- // arrow head flag
- toInt(values[71], 1),
- // leader path type
- toInt(values[72], 0),
- // Leader creation flag
- toInt(values[73], 3),
- // Hookline direction flag
- toInt(values[74], 1),
- // Hookline flag
- toInt(values[75], 0),
- // Text annotation height
- toReal(values[40], 1.0),
- // Text annotation width
- toReal(values[41], 1.0),
- // Number of vertices in leader
- toInt(values[76], 0)
- );
- creationInterface->addLeader(le);
-
- for (int i=0; i<maxLeaderVertices; i++) {
- DL_LeaderVertexData d(leaderVertices[i*3],
- leaderVertices[i*3+1],
- leaderVertices[i*3+2]);
-
- creationInterface->addLeaderVertex(d);
- }
-}
-
-
-
-/**
- * Adds a hatch entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addHatch(DL_CreationInterface* creationInterface) {
- DL_HatchData hd(toInt(values[91], 1),
- toInt(values[70], 0),
- toReal(values[41], 1.0),
- toReal(values[52], 0.0),
- values[2]);
- creationInterface->addHatch(hd);
-
- for (int l=0; l<maxHatchLoops; l++) {
- DL_HatchLoopData ld(maxHatchEdges[l]);
- creationInterface->addHatchLoop(ld);
- for (int b=0; b<maxHatchEdges[l]; b++) {
- creationInterface->addHatchEdge(hatchEdges[l][b]);
- }
- }
- creationInterface->endEntity();
- currentEntity = DL_UNKNOWN;
-}
-
-
-
-/**
- * Adds an image entity that was read from the file via the creation interface.
- */
-void DL_Dxf::addImage(DL_CreationInterface* creationInterface) {
- DL_ImageData id(// pass ref insead of name we don't have yet
- values[340],
- // ins point:
- toReal(values[10], 0.0),
- toReal(values[20], 0.0),
- toReal(values[30], 0.0),
- // u vector:
- toReal(values[11], 1.0),
- toReal(values[21], 0.0),
- toReal(values[31], 0.0),
- // v vector:
- toReal(values[12], 0.0),
- toReal(values[22], 1.0),
- toReal(values[32], 0.0),
- // image size (pixel):
- toInt(values[13], 1),
- toInt(values[23], 1),
- // brightness, contrast, fade
- toInt(values[281], 50),
- toInt(values[282], 50),
- toInt(values[283], 0));
-
- creationInterface->addImage(id);
- creationInterface->endEntity();
- currentEntity = DL_UNKNOWN;
-}
-
-
-
-/**
- * Adds an image definition that was read from the file via the creation interface.
- */
-void DL_Dxf::addImageDef(DL_CreationInterface* creationInterface) {
- DL_ImageDefData id(// handle
- values[5],
- values[1]);
-
- creationInterface->linkImage(id);
- creationInterface->endEntity();
- currentEntity = DL_UNKNOWN;
-}
-
-
-
-/**
- * Ends some special entities like hatches or old style polylines.
- */
-void DL_Dxf::endEntity(DL_CreationInterface* creationInterface) {
- creationInterface->endEntity();
-}
-
-
-/**
- * Ends a sequence and notifies the creation interface.
- */
-void DL_Dxf::endSequence(DL_CreationInterface* creationInterface) {
- creationInterface->endSequence();
-}
-
-
-/**
- * Converts the given string into an int.
- * ok is set to false if there was an error.
- */
-int DL_Dxf::stringToInt(const char* s, bool* ok) {
- if (ok!=NULL) {
- // check string:
- *ok = true;
- int i=0;
- bool dot = false;
- do {
- if (s[i]=='\0') {
- break;
- } else if (s[i]=='.') {
- if (dot==true) {
- //std::cerr << "two dots\n";
- *ok = false;
- } else {
- dot = true;
- }
- } else if (s[i]<'0' || s[i]>'9') {
- //std::cerr << "NaN: '" << s[i] << "'\n";
- *ok = false;
- }
- i++;
- } while(s[i]!='\0' && *ok==true);
- }
-
- return atoi(s);
-}
-
-
-/**
- * @brief Opens the given file for writing and returns a pointer
- * to the dxf writer. This pointer needs to be passed on to other
- * writing functions.
- *
- * @param file Full path of the file to open.
- *
- * @return Pointer to an ascii dxf writer object.
- */
-DL_WriterA* DL_Dxf::out(const char* file, DL_Codes::version version) {
- char* f = new char[strlen(file)+1];
- strcpy(f, file);
- this->version = version;
-
- DL_WriterA* dw = new DL_WriterA(f, version);
- if (dw->openFailed()) {
- delete dw;
- delete[] f;
- return NULL;
- } else {
- delete[] f;
- return dw;
- }
-}
-
-
-
-/**
- * @brief Writes a DXF header to the file currently opened
- * by the given DXF writer object.
- */
-void DL_Dxf::writeHeader(DL_WriterA& dw) {
- dw.comment("dxflib " DL_VERSION);
- dw.sectionHeader();
-
- dw.dxfString(9, "$ACADVER");
- switch (version) {
- case DL_Codes::AC1009:
- dw.dxfString(1, "AC1009");
- break;
- case DL_Codes::AC1012:
- dw.dxfString(1, "AC1012");
- break;
- case DL_Codes::AC1014:
- dw.dxfString(1, "AC1014");
- break;
- case DL_Codes::AC1015:
- dw.dxfString(1, "AC1015");
- break;
- }
-
- // Newer version require that (otherwise a*cad crashes..)
- if (version==VER_2000) {
- dw.dxfString(9, "$HANDSEED");
- dw.dxfHex(5, 0xFFFF);
- }
-
- //dw.sectionEnd();
-}
-
-
-
-
-/**
- * Writes a point entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writePoint(DL_WriterA& dw,
- const DL_PointData& data,
- const DL_Attributes& attrib) {
- dw.entity("POINT");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbPoint");
- }
- dw.entityAttributes(attrib);
- dw.coord(POINT_COORD_CODE, data.x, data.y);
-}
-
-
-
-/**
- * Writes a line entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeLine(DL_WriterA& dw,
- const DL_LineData& data,
- const DL_Attributes& attrib) {
- dw.entity("LINE");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbLine");
- }
- dw.entityAttributes(attrib);
- dw.coord(LINE_START_CODE, data.x1, data.y1);
- dw.coord(LINE_END_CODE, data.x2, data.y2);
-}
-
-
-
-/**
- * Writes a polyline entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- * @see writeVertex
- */
-void DL_Dxf::writePolyline(DL_WriterA& dw,
- const DL_PolylineData& data,
- const DL_Attributes& attrib) {
- if (version==VER_2000) {
- dw.entity("LWPOLYLINE");
- dw.entityAttributes(attrib);
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbPolyline");
- dw.dxfInt(90, (int)data.number);
- dw.dxfInt(70, data.flags);
- } else {
- dw.entity("POLYLINE");
- dw.entityAttributes(attrib);
- polylineLayer = attrib.getLayer();
- dw.dxfInt(66, 1);
- dw.dxfInt(70, data.flags);
- dw.coord(VERTEX_COORD_CODE, 0.0, 0.0);
- }
-}
-
-
-
-/**
- * Writes a single vertex of a polyline to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeVertex(DL_WriterA& dw,
- const DL_VertexData& data) {
-
-
- if (version==VER_2000) {
- dw.dxfReal(10, data.x);
- dw.dxfReal(20, data.y);
- if (fabs(data.bulge)>1.0e-10) {
- dw.dxfReal(42, data.bulge);
- }
- } else {
- dw.entity("VERTEX");
- //dw.entityAttributes(attrib);
- dw.dxfString(8, polylineLayer);
- dw.coord(VERTEX_COORD_CODE, data.x, data.y);
- if (fabs(data.bulge)>1.0e-10) {
- dw.dxfReal(42, data.bulge);
- }
- }
-}
-
-
-
-/**
- * Writes the polyline end. Only needed for DXF R12.
- */
-void DL_Dxf::writePolylineEnd(DL_WriterA& dw) {
- if (version==VER_2000) {
- } else {
- dw.entity("SEQEND");
- }
-}
-
-
-/**
- * Writes a spline entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- * @see writeControlPoint
- */
-void DL_Dxf::writeSpline(DL_WriterA& dw,
- const DL_SplineData& data,
- const DL_Attributes& attrib) {
-
- dw.entity("SPLINE");
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbSpline");
- }
- dw.dxfInt(70, data.flags);
- dw.dxfInt(71, data.degree);
- dw.dxfInt(72, data.nKnots); // number of knots
- dw.dxfInt(73, data.nControl); // number of control points
- dw.dxfInt(74, 0); // number of fit points
-}
-
-
-
-/**
- * Writes a single control point of a spline to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeControlPoint(DL_WriterA& dw,
- const DL_ControlPointData& data) {
-
- dw.dxfReal(10, data.x);
- dw.dxfReal(20, data.y);
- dw.dxfReal(30, data.z);
-}
-
-
-
-/**
- * Writes a single knot of a spline to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeKnot(DL_WriterA& dw,
- const DL_KnotData& data) {
-
- dw.dxfReal(40, data.k);
-}
-
-
-
-/**
- * Writes a circle entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeCircle(DL_WriterA& dw,
- const DL_CircleData& data,
- const DL_Attributes& attrib) {
- dw.entity("CIRCLE");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbCircle");
- }
- dw.entityAttributes(attrib);
- dw.coord(10, data.cx, data.cy);
- dw.dxfReal(40, data.radius);
-}
-
-
-
-/**
- * Writes an arc entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeArc(DL_WriterA& dw,
- const DL_ArcData& data,
- const DL_Attributes& attrib) {
- dw.entity("ARC");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbCircle");
- }
- dw.coord(10, data.cx, data.cy);
- dw.dxfReal(40, data.radius);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbArc");
- }
- dw.dxfReal(50, data.angle1);
- dw.dxfReal(51, data.angle2);
-}
-
-
-
-/**
- * Writes an ellipse entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeEllipse(DL_WriterA& dw,
- const DL_EllipseData& data,
- const DL_Attributes& attrib) {
-
- if (version>VER_R12) {
- dw.entity("ELLIPSE");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbEllipse");
- }
- dw.entityAttributes(attrib);
- dw.coord(10, data.cx, data.cy);
- dw.coord(11, data.mx, data.my);
- dw.dxfReal(40, data.ratio);
- dw.dxfReal(41, data.angle1);
- dw.dxfReal(42, data.angle2);
- }
-}
-
-
-
-/**
- * Writes a solid entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeSolid(DL_WriterA& dw,
- const DL_SolidData& data,
- const DL_Attributes& attrib) {
- dw.entity("SOLID");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbTrace");
- }
- dw.entityAttributes(attrib);
- dw.coord(10, data.x[0], data.y[0], data.z[0]);
- dw.coord(11, data.x[1], data.y[1], data.z[1]);
- dw.coord(12, data.x[2], data.y[2], data.z[2]);
- dw.coord(13, data.x[3], data.y[3], data.z[3]);
- dw.dxfReal(39, data.thickness);
-}
-
-
-
-/**
- * Writes a 3d face entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::write3dFace(DL_WriterA& dw,
- const DL_3dFaceData& data,
- const DL_Attributes& attrib) {
- dw.entity("3DFACE");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbFace");
- }
- dw.entityAttributes(attrib);
- dw.coord(10, data.x[0], data.y[0], data.z[0]);
- dw.coord(11, data.x[1], data.y[1], data.z[1]);
- dw.coord(12, data.x[2], data.y[2], data.z[2]);
- dw.coord(13, data.x[3], data.y[3], data.z[3]);
-}
-
-
-
-/**
- * Writes an insert to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeInsert(DL_WriterA& dw,
- const DL_InsertData& data,
- const DL_Attributes& attrib) {
-
- if (data.name.empty()) {
- std::cerr << "DL_Dxf::writeInsert: "
- << "Block name must not be empty\n";
- return;
- }
-
- dw.entity("INSERT");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbBlockReference");
- }
- dw.entityAttributes(attrib);
- dw.dxfString(2, data.name);
- dw.dxfReal(10, data.ipx);
- dw.dxfReal(20, data.ipy);
- dw.dxfReal(30, 0.0);
- if (data.sx!=1.0 || data.sy!=1.0) {
- dw.dxfReal(41, data.sx);
- dw.dxfReal(42, data.sy);
- dw.dxfReal(43, 1.0);
- }
- if (data.angle!=0.0) {
- dw.dxfReal(50, data.angle);
- }
- if (data.cols!=1 || data.rows!=1) {
- dw.dxfInt(70, data.cols);
- dw.dxfInt(71, data.rows);
- }
- if (data.colSp!=0.0 || data.rowSp!=0.0) {
- dw.dxfReal(44, data.colSp);
- dw.dxfReal(45, data.rowSp);
- }
-
-}
-
-
-
-/**
- * Writes a multi text entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeMText(DL_WriterA& dw,
- const DL_MTextData& data,
- const DL_Attributes& attrib) {
-
- dw.entity("MTEXT");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbMText");
- }
- dw.entityAttributes(attrib);
- dw.dxfReal(10, data.ipx);
- dw.dxfReal(20, data.ipy);
- dw.dxfReal(30, 0.0);
- dw.dxfReal(40, data.height);
- dw.dxfReal(41, data.width);
-
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.drawingDirection);
-
- // Creare text chunks of 250 characters each:
- int length = data.text.length();
- char chunk[251];
- int i;
- for (i=250; i<length; i+=250) {
- strncpy(chunk, &data.text.c_str()[i-250], 250);
- chunk[250]='\0';
- dw.dxfString(3, chunk);
- }
- strncpy(chunk, &data.text.c_str()[i-250], 250);
- chunk[250]='\0';
- dw.dxfString(1, chunk);
-
- dw.dxfString(7, data.style);
-
- // since dxflib 2.0.2.1: degrees not rad (error in autodesk dxf doc)
- dw.dxfReal(50, data.angle/(2.0*M_PI)*360.0);
-
- dw.dxfInt(73, data.lineSpacingStyle);
- dw.dxfReal(44, data.lineSpacingFactor);
-}
-
-
-
-/**
- * Writes a text entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeText(DL_WriterA& dw,
- const DL_TextData& data,
- const DL_Attributes& attrib) {
-
- dw.entity("TEXT");
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbText");
- }
- dw.entityAttributes(attrib);
- dw.dxfReal(10, data.ipx);
- dw.dxfReal(20, data.ipy);
- dw.dxfReal(30, 0.0);
- dw.dxfReal(40, data.height);
- dw.dxfString(1, data.text);
- dw.dxfReal(50, data.angle/(2*M_PI)*360.0);
- dw.dxfReal(41, data.xScaleFactor);
- dw.dxfString(7, data.style);
-
- dw.dxfInt(71, data.textGenerationFlags);
- dw.dxfInt(72, data.hJustification);
-
- dw.dxfReal(11, data.apx);
- dw.dxfReal(21, data.apy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(73, data.vJustification);
-}
-
-
-/**
- * Writes an aligned dimension entity to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific aligned dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimAligned(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimAlignedData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(70, 1);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfReal(42, data.angle);
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbAlignedDimension");
- }
-
- dw.dxfReal(13, edata.epx1);
- dw.dxfReal(23, edata.epy1);
- dw.dxfReal(33, 0.0);
-
- dw.dxfReal(14, edata.epx2);
- dw.dxfReal(24, edata.epy2);
- dw.dxfReal(34, 0.0);
-}
-
-
-
-/**
- * Writes a linear dimension entity to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific linear dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimLinear(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimLinearData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(70, 0);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfReal(42, data.angle);
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbAlignedDimension");
- }
-
- dw.dxfReal(13, edata.dpx1);
- dw.dxfReal(23, edata.dpy1);
- dw.dxfReal(33, 0.0);
-
- dw.dxfReal(14, edata.dpx2);
- dw.dxfReal(24, edata.dpy2);
- dw.dxfReal(34, 0.0);
-
- dw.dxfReal(50, edata.angle/(2.0*M_PI)*360.0);
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbRotatedDimension");
- /*
- dw.dxfString(1001, "ACAD");
- dw.dxfString(1000, "DSTYLE");
- dw.dxfString(1002, "{");
- dw.dxfInt(1070, 340);
- dw.dxfInt(1005, 11);
- dw.dxfString(1002, "}");
- */
- }
-}
-
-
-
-/**
- * Writes a radial dimension entity to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific radial dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimRadial(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimRadialData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(70, 4);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfReal(42, data.angle);
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbRadialDimension");
- }
-
- dw.dxfReal(15, edata.dpx);
- dw.dxfReal(25, edata.dpy);
- dw.dxfReal(35, 0.0);
-
- dw.dxfReal(40, edata.leader);
-}
-
-
-
-/**
- * Writes a diametric dimension entity to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific diametric dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimDiametric(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimDiametricData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(70, 3);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfReal(42, data.angle);
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDiametricDimension");
- }
-
- dw.dxfReal(15, edata.dpx);
- dw.dxfReal(25, edata.dpy);
- dw.dxfReal(35, 0.0);
-
- dw.dxfReal(40, edata.leader);
-}
-
-
-
-/**
- * Writes an angular dimension entity to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific angular dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimAngular(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimAngularData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(70, 2);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfReal(42, data.angle);
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDb2LineAngularDimension");
- }
-
- dw.dxfReal(13, edata.dpx1);
- dw.dxfReal(23, edata.dpy1);
- dw.dxfReal(33, 0.0);
-
- dw.dxfReal(14, edata.dpx2);
- dw.dxfReal(24, edata.dpy2);
- dw.dxfReal(34, 0.0);
-
- dw.dxfReal(15, edata.dpx3);
- dw.dxfReal(25, edata.dpy3);
- dw.dxfReal(35, 0.0);
-
- dw.dxfReal(16, edata.dpx4);
- dw.dxfReal(26, edata.dpy4);
- dw.dxfReal(36, 0.0);
-}
-
-
-
-/**
- * Writes an angular dimension entity (3 points version) to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific angular dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimAngular3P(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimAngular3PData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- dw.dxfInt(70, 5);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfReal(42, data.angle);
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDb3PointAngularDimension");
- }
-
- dw.dxfReal(13, edata.dpx1);
- dw.dxfReal(23, edata.dpy1);
- dw.dxfReal(33, 0.0);
-
- dw.dxfReal(14, edata.dpx2);
- dw.dxfReal(24, edata.dpy2);
- dw.dxfReal(34, 0.0);
-
- dw.dxfReal(15, edata.dpx3);
- dw.dxfReal(25, edata.dpy3);
- dw.dxfReal(35, 0.0);
-}
-
-
-
-
-/**
- * Writes an ordinate dimension entity to the file.
- *
- * @param dw DXF writer
- * @param data Generic dimension data for from the file
- * @param data Specific ordinate dimension data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeDimOrdinate(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimOrdinateData& edata,
- const DL_Attributes& attrib) {
-
- dw.entity("DIMENSION");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- }
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimension");
- }
-
- dw.dxfReal(10, data.dpx);
- dw.dxfReal(20, data.dpy);
- dw.dxfReal(30, 0.0);
-
- dw.dxfReal(11, data.mpx);
- dw.dxfReal(21, data.mpy);
- dw.dxfReal(31, 0.0);
-
- int type = 6;
- if (edata.xtype) {
- type+=64;
- }
-
- dw.dxfInt(70, type);
- if (version>VER_R12) {
- dw.dxfInt(71, data.attachmentPoint);
- dw.dxfInt(72, data.lineSpacingStyle); // opt
- dw.dxfReal(41, data.lineSpacingFactor); // opt
- }
-
- dw.dxfString(1, data.text); // opt
- //dw.dxfString(3, data.style);
- dw.dxfString(3, "Standard");
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbOrdinateDimension");
- }
-
- dw.dxfReal(13, edata.dpx1);
- dw.dxfReal(23, edata.dpy1);
- dw.dxfReal(33, 0.0);
-
- dw.dxfReal(14, edata.dpx2);
- dw.dxfReal(24, edata.dpy2);
- dw.dxfReal(34, 0.0);
-}
-
-
-
-/**
- * Writes a leader entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- * @see writeVertex
- */
-void DL_Dxf::writeLeader(DL_WriterA& dw,
- const DL_LeaderData& data,
- const DL_Attributes& attrib) {
- if (version>VER_R12) {
- dw.entity("LEADER");
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbLeader");
- }
- dw.dxfString(3, "Standard");
- dw.dxfInt(71, data.arrowHeadFlag);
- dw.dxfInt(72, data.leaderPathType);
- dw.dxfInt(73, data.leaderCreationFlag);
- dw.dxfInt(74, data.hooklineDirectionFlag);
- dw.dxfInt(75, data.hooklineFlag);
- dw.dxfReal(40, data.textAnnotationHeight);
- dw.dxfReal(41, data.textAnnotationWidth);
- dw.dxfInt(76, data.number);
- }
-}
-
-
-
-/**
- * Writes a single vertex of a leader to the file.
- *
- * @param dw DXF writer
- * @param data Entity data
- */
-void DL_Dxf::writeLeaderVertex(DL_WriterA& dw,
- const DL_LeaderVertexData& data) {
- if (version>VER_R12) {
- dw.dxfReal(10, data.x);
- dw.dxfReal(20, data.y);
- }
-}
-
-
-
-/**
- * Writes the beginning of a hatch entity to the file.
- * This must be followed by one or more writeHatchLoop()
- * calls and a writeHatch2() call.
- *
- * @param dw DXF writer
- * @param data Entity data.
- * @param attrib Attributes
- */
-void DL_Dxf::writeHatch1(DL_WriterA& dw,
- const DL_HatchData& data,
- const DL_Attributes& attrib) {
-
- dw.entity("HATCH");
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbHatch");
- }
- dw.dxfReal(10, 0.0); // elevation
- dw.dxfReal(20, 0.0);
- dw.dxfReal(30, 0.0);
- dw.dxfReal(210, 0.0); // extrusion dir.
- dw.dxfReal(220, 0.0);
- dw.dxfReal(230, 1.0);
- if (data.solid==false) {
- dw.dxfString(2, data.pattern);
- } else {
- dw.dxfString(2, "SOLID");
- }
- dw.dxfInt(70, (int)data.solid);
- dw.dxfInt(71, 0); // associative
- dw.dxfInt(91, data.numLoops);
-}
-
-
-
-/**
- * Writes the end of a hatch entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data.
- * @param attrib Attributes
- */
-void DL_Dxf::writeHatch2(DL_WriterA& dw,
- const DL_HatchData& data,
- const DL_Attributes& /*attrib*/) {
-
- dw.dxfInt(75, 0); // odd parity
- dw.dxfInt(76, 1); // pattern type
- if (data.solid==false) {
- dw.dxfReal(52, data.angle);
- dw.dxfReal(41, data.scale);
- dw.dxfInt(77, 0); // not double
- //dw.dxfInt(78, 0);
- dw.dxfInt(78, 1);
- dw.dxfReal(53, 45.0);
- dw.dxfReal(43, 0.0);
- dw.dxfReal(44, 0.0);
- dw.dxfReal(45, -0.0883883476483184);
- dw.dxfReal(46, 0.0883883476483185);
- dw.dxfInt(79, 0);
- }
- dw.dxfInt(98, 0);
-}
-
-
-
-/**
- * Writes the beginning of a hatch loop to the file. This
- * must happen after writing the beginning of a hatch entity.
- *
- * @param dw DXF writer
- * @param data Entity data.
- * @param attrib Attributes
- */
-void DL_Dxf::writeHatchLoop1(DL_WriterA& dw,
- const DL_HatchLoopData& data) {
-
- dw.dxfInt(92, 1);
- dw.dxfInt(93, data.numEdges);
- //dw.dxfInt(97, 0);
-}
-
-
-
-/**
- * Writes the end of a hatch loop to the file.
- *
- * @param dw DXF writer
- * @param data Entity data.
- * @param attrib Attributes
- */
-void DL_Dxf::writeHatchLoop2(DL_WriterA& dw,
- const DL_HatchLoopData& /*data*/) {
-
- dw.dxfInt(97, 0);
-}
-
-
-/**
- * Writes the beginning of a hatch entity to the file.
- *
- * @param dw DXF writer
- * @param data Entity data.
- * @param attrib Attributes
- */
-void DL_Dxf::writeHatchEdge(DL_WriterA& dw,
- const DL_HatchEdgeData& data) {
-
- dw.dxfInt(72, data.type);
-
- switch (data.type) {
- case 1:
- dw.dxfReal(10, data.x1);
- dw.dxfReal(20, data.y1);
- dw.dxfReal(11, data.x2);
- dw.dxfReal(21, data.y2);
- break;
- case 2:
- dw.dxfReal(10, data.cx);
- dw.dxfReal(20, data.cy);
- dw.dxfReal(40, data.radius);
- dw.dxfReal(50, data.angle1/(2*M_PI)*360.0);
- dw.dxfReal(51, data.angle2/(2*M_PI)*360.0);
- dw.dxfInt(73, (int)(data.ccw));
- break;
- default:
- break;
- }
-}
-
-
-
-/**
- * Writes an image entity.
- *
- * @return IMAGEDEF handle. Needed for the IMAGEDEF counterpart.
- */
-int DL_Dxf::writeImage(DL_WriterA& dw,
- const DL_ImageData& data,
- const DL_Attributes& attrib) {
-
- /*if (data.file.empty()) {
- std::cerr << "DL_Dxf::writeImage: "
- << "Image file must not be empty\n";
- return;
-}*/
-
- dw.entity("IMAGE");
-
- dw.entityAttributes(attrib);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbEntity");
- dw.dxfString(100, "AcDbRasterImage");
- dw.dxfInt(90, 0);
- }
- // insertion point
- dw.dxfReal(10, data.ipx);
- dw.dxfReal(20, data.ipy);
- dw.dxfReal(30, 0.0);
-
- // vector along bottom side (1 pixel long)
- dw.dxfReal(11, data.ux);
- dw.dxfReal(21, data.uy);
- dw.dxfReal(31, 0.0);
-
- // vector along left side (1 pixel long)
- dw.dxfReal(12, data.vx);
- dw.dxfReal(22, data.vy);
- dw.dxfReal(32, 0.0);
-
- // image size in pixel
- dw.dxfReal(13, data.width);
- dw.dxfReal(23, data.height);
-
- // handle of IMAGEDEF object
- int handle = dw.incHandle();
- dw.dxfHex(340, handle);
-
- // flags
- dw.dxfInt(70, 15);
-
- // clipping:
- dw.dxfInt(280, 0);
-
- // brightness, contrast, fade
- dw.dxfInt(281, data.brightness);
- dw.dxfInt(282, data.contrast);
- dw.dxfInt(283, data.fade);
-
- return handle;
-}
-
-
-
-/**
- * Writes an image definiition entity.
- */
-void DL_Dxf::writeImageDef(DL_WriterA& dw,
- int handle,
- const DL_ImageData& data) {
-
- /*if (data.file.empty()) {
- std::cerr << "DL_Dxf::writeImage: "
- << "Image file must not be empty\n";
- return;
-}*/
-
- dw.dxfString(0, "IMAGEDEF");
- if (version==VER_2000) {
- dw.dxfHex(5, handle);
- }
-
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbRasterImageDef");
- dw.dxfInt(90, 0);
- }
- // file name:
- dw.dxfString(1, data.ref);
-
- // image size in pixel
- dw.dxfReal(10, data.width);
- dw.dxfReal(20, data.height);
-
- dw.dxfReal(11, 1.0);
- dw.dxfReal(21, 1.0);
-
- // loaded:
- dw.dxfInt(280, 1);
- // units:
- dw.dxfInt(281, 0);
-}
-
-
-/**
- * Writes a layer to the file. Layers are stored in the
- * tables section of a DXF file.
- *
- * @param dw DXF writer
- * @param data Entity data from the file
- * @param attrib Attributes
- */
-void DL_Dxf::writeLayer(DL_WriterA& dw,
- const DL_LayerData& data,
- const DL_Attributes& attrib) {
-
- if (data.name.empty()) {
- std::cerr << "DL_Dxf::writeLayer: "
- << "Layer name must not be empty\n";
- return;
- }
-
- int color = attrib.getColor();
- if (color>=256) {
- std::cerr << "Layer color cannot be " << color << ". Changed to 7.\n";
- color = 7;
- }
-
- if (data.name == "0") {
- dw.tableLayerEntry(0x10);
- } else {
- dw.tableLayerEntry();
- }
-
- dw.dxfString(2, data.name);
- dw.dxfInt(70, data.flags);
- dw.dxfInt(62, color);
-
- dw.dxfString(6, (attrib.getLineType().length()==0 ?
- string("CONTINUOUS") : attrib.getLineType()));
-
- if (version>=VER_2000) {
- // layer defpoints cannot be plotted
- std::string lstr = data.name;
- std::transform(lstr.begin(), lstr.end(), lstr.begin(), tolower);
- if (lstr=="defpoints") {
- dw.dxfInt(290, 0);
- }
- }
- if (version>=VER_2000 && attrib.getWidth()!=-1) {
- dw.dxfInt(370, attrib.getWidth());
- }
- if (version>=VER_2000) {
- dw.dxfHex(390, 0xF);
- }
-}
-
-
-
-/**
- * Writes a line type to the file. Line types are stored in the
- * tables section of a DXF file.
- */
-void DL_Dxf::writeLineType(DL_WriterA& dw,
- const DL_LineTypeData& data) {
- //const char* description,
- //int elements,
- //double patternLength) {
-
- if (data.name.empty()) {
- std::cerr << "DL_Dxf::writeLineType: "
- << "Line type name must not be empty\n";
- return;
- }
-
- // ignore BYLAYER, BYBLOCK for R12
- if (version<VER_2000) {
- if (!strcasecmp(data.name.c_str(), "BYBLOCK") ||
- !strcasecmp(data.name.c_str(), "BYLAYER")) {
- return;
- }
- }
-
- // write id (not for R12)
- if (!strcasecmp(data.name.c_str(), "BYBLOCK")) {
- dw.tableLineTypeEntry(0x14);
- } else if (!strcasecmp(data.name.c_str(), "BYLAYER")) {
- dw.tableLineTypeEntry(0x15);
- } else if (!strcasecmp(data.name.c_str(), "CONTINUOUS")) {
- dw.tableLineTypeEntry(0x16);
- } else {
- dw.tableLineTypeEntry();
- }
-
- dw.dxfString(2, data.name);
- //if (version>=VER_2000) {
- dw.dxfInt(70, data.flags);
- //}
-
- if (!strcasecmp(data.name.c_str(), "BYBLOCK")) {
- dw.dxfString(3, "");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 0);
- dw.dxfReal(40, 0.0);
- } else if (!strcasecmp(data.name.c_str(), "BYLAYER")) {
- dw.dxfString(3, "");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 0);
- dw.dxfReal(40, 0.0);
- } else if (!strcasecmp(data.name.c_str(), "CONTINUOUS")) {
- dw.dxfString(3, "Solid line");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 0);
- dw.dxfReal(40, 0.0);
- } else if (!strcasecmp(data.name.c_str(), "ACAD_ISO02W100")) {
- dw.dxfString(3, "ISO Dashed __ __ __ __ __ __ __ __ __ __ _");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 15.0);
- dw.dxfReal(49, 12.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "ACAD_ISO03W100")) {
- dw.dxfString(3, "ISO Dashed with Distance __ __ __ _");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 30.0);
- dw.dxfReal(49, 12.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -18.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "ACAD_ISO04W100")) {
- dw.dxfString(3, "ISO Long Dashed Dotted ____ . ____ . __");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 30.0);
- dw.dxfReal(49, 24.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "ACAD_ISO05W100")) {
- dw.dxfString(3, "ISO Long Dashed Double Dotted ____ .. __");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 33.0);
- dw.dxfReal(49, 24.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "BORDER")) {
- dw.dxfString(3, "Border __ __ . __ __ . __ __ . __ __ . __ __ .");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 44.45);
- dw.dxfReal(49, 12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "BORDER2")) {
- dw.dxfString(3, "Border (.5x) __.__.__.__.__.__.__.__.__.__.__.");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 22.225);
- dw.dxfReal(49, 6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "BORDERX2")) {
- dw.dxfString(3, "Border (2x) ____ ____ . ____ ____ . ___");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 88.9);
- dw.dxfReal(49, 25.4);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 25.4);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "CENTER")) {
- dw.dxfString(3, "Center ____ _ ____ _ ____ _ ____ _ ____ _ ____");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 50.8);
- dw.dxfReal(49, 31.75);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "CENTER2")) {
- dw.dxfString(3, "Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 28.575);
- dw.dxfReal(49, 19.05);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "CENTERX2")) {
- dw.dxfString(3, "Center (2x) ________ __ ________ __ _____");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 101.6);
- dw.dxfReal(49, 63.5);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DASHDOT")) {
- dw.dxfString(3, "Dash dot __ . __ . __ . __ . __ . __ . __ . __");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 25.4);
- dw.dxfReal(49, 12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DASHDOT2")) {
- dw.dxfString(3, "Dash dot (.5x) _._._._._._._._._._._._._._._.");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 12.7);
- dw.dxfReal(49, 6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DASHDOTX2")) {
- dw.dxfString(3, "Dash dot (2x) ____ . ____ . ____ . ___");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 4);
- dw.dxfReal(40, 50.8);
- dw.dxfReal(49, 25.4);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DASHED")) {
- dw.dxfString(3, "Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 19.05);
- dw.dxfReal(49, 12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DASHED2")) {
- dw.dxfString(3, "Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 9.525);
- dw.dxfReal(49, 6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DASHEDX2")) {
- dw.dxfString(3, "Dashed (2x) ____ ____ ____ ____ ____ ___");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 38.1);
- dw.dxfReal(49, 25.4);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DIVIDE")) {
- dw.dxfString(3, "Divide ____ . . ____ . . ____ . . ____ . . ____");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 31.75);
- dw.dxfReal(49, 12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DIVIDE2")) {
- dw.dxfString(3, "Divide (.5x) __..__..__..__..__..__..__..__.._");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 15.875);
- dw.dxfReal(49, 6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DIVIDEX2")) {
- dw.dxfString(3, "Divide (2x) ________ . . ________ . . _");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 6);
- dw.dxfReal(40, 63.5);
- dw.dxfReal(49, 25.4);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DOT")) {
- dw.dxfString(3, "Dot . . . . . . . . . . . . . . . . . . . . . .");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 6.35);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -6.35);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DOT2")) {
- dw.dxfString(3, "Dot (.5x) .....................................");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 3.175);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -3.175);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else if (!strcasecmp(data.name.c_str(), "DOTX2")) {
- dw.dxfString(3, "Dot (2x) . . . . . . . . . . . . .");
- dw.dxfInt(72, 65);
- dw.dxfInt(73, 2);
- dw.dxfReal(40, 12.7);
- dw.dxfReal(49, 0.0);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- dw.dxfReal(49, -12.7);
- if (version>=VER_R13)
- dw.dxfInt(74, 0);
- } else {
- std::cerr << "dxflib warning: DL_Dxf::writeLineType: Unknown Line Type\n";
- }
-}
-
-
-
-/**
- * Writes the APPID section to the DXF file.
- *
- * @param name Application name
- */
-void DL_Dxf::writeAppid(DL_WriterA& dw, const string& name) {
- if (name.empty()) {
- std::cerr << "DL_Dxf::writeAppid: "
- << "Application name must not be empty\n";
- return;
- }
-
- if (!strcasecmp(name.c_str(), "ACAD")) {
- dw.tableAppidEntry(0x12);
- } else {
- dw.tableAppidEntry();
- }
- dw.dxfString(2, name);
- dw.dxfInt(70, 0);
-}
-
-
-
-/**
- * Writes a block's definition (no entities) to the DXF file.
- */
-void DL_Dxf::writeBlock(DL_WriterA& dw, const DL_BlockData& data) {
- if (data.name.empty()) {
- std::cerr << "DL_Dxf::writeBlock: "
- << "Block name must not be empty\n";
- return;
- }
-
- //bool paperSpace = !strcasecmp(name, "*paper_space");
- //!strcasecmp(name, "*paper_space0");
-
- if (!strcasecmp(data.name.c_str(), "*paper_space")) {
- dw.sectionBlockEntry(0x1C);
- } else if (!strcasecmp(data.name.c_str(), "*model_space")) {
- dw.sectionBlockEntry(0x20);
- } else if (!strcasecmp(data.name.c_str(), "*paper_space0")) {
- dw.sectionBlockEntry(0x24);
- } else {
- dw.sectionBlockEntry();
- }
- dw.dxfString(2, data.name);
- dw.dxfInt(70, 0);
- dw.coord(10, data.bpx, data.bpy);
- dw.dxfString(3, data.name);
- dw.dxfString(1, "");
-}
-
-
-
-/**
- * Writes a block end.
- *
- * @param name Block name
- */
-void DL_Dxf::writeEndBlock(DL_WriterA& dw, const string& name) {
- if (!strcasecmp(name.c_str(), "*paper_space")) {
- dw.sectionBlockEntryEnd(0x1D);
- } else if (!strcasecmp(name.c_str(), "*model_space")) {
- dw.sectionBlockEntryEnd(0x21);
- } else if (!strcasecmp(name.c_str(), "*paper_space0")) {
- dw.sectionBlockEntryEnd(0x25);
- } else {
- dw.sectionBlockEntryEnd();
- }
-}
-
-
-
-/**
- * Writes a viewport section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked VPORT section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeVPort(DL_WriterA& dw) {
- dw.dxfString(0, "TABLE");
- dw.dxfString(2, "VPORT");
- if (version==VER_2000) {
- dw.dxfHex(5, 0x8);
- }
- //dw.dxfHex(330, 0);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTable");
- }
- dw.dxfInt(70, 1);
- dw.dxfString(0, "VPORT");
- //dw.dxfHex(5, 0x2F);
- if (version==VER_2000) {
- dw.handle();
- }
- //dw.dxfHex(330, 8);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbViewportTableRecord");
- }
- dw.dxfString( 2, "*Active");
- dw.dxfInt( 70, 0);
- dw.dxfReal( 10, 0.0);
- dw.dxfReal( 20, 0.0);
- dw.dxfReal( 11, 1.0);
- dw.dxfReal( 21, 1.0);
- dw.dxfReal( 12, 286.3055555555555);
- dw.dxfReal( 22, 148.5);
- dw.dxfReal( 13, 0.0);
- dw.dxfReal( 23, 0.0);
- dw.dxfReal( 14, 10.0);
- dw.dxfReal( 24, 10.0);
- dw.dxfReal( 15, 10.0);
- dw.dxfReal( 25, 10.0);
- dw.dxfReal( 16, 0.0);
- dw.dxfReal( 26, 0.0);
- dw.dxfReal( 36, 1.0);
- dw.dxfReal( 17, 0.0);
- dw.dxfReal( 27, 0.0);
- dw.dxfReal( 37, 0.0);
- dw.dxfReal( 40, 297.0);
- dw.dxfReal( 41, 1.92798353909465);
- dw.dxfReal( 42, 50.0);
- dw.dxfReal( 43, 0.0);
- dw.dxfReal( 44, 0.0);
- dw.dxfReal( 50, 0.0);
- dw.dxfReal( 51, 0.0);
- dw.dxfInt( 71, 0);
- dw.dxfInt( 72, 100);
- dw.dxfInt( 73, 1);
- dw.dxfInt( 74, 3);
- dw.dxfInt( 75, 1);
- dw.dxfInt( 76, 1);
- dw.dxfInt( 77, 0);
- dw.dxfInt( 78, 0);
-
- if (version==VER_2000) {
- dw.dxfInt(281, 0);
- dw.dxfInt( 65, 1);
- dw.dxfReal(110, 0.0);
- dw.dxfReal(120, 0.0);
- dw.dxfReal(130, 0.0);
- dw.dxfReal(111, 1.0);
- dw.dxfReal(121, 0.0);
- dw.dxfReal(131, 0.0);
- dw.dxfReal(112, 0.0);
- dw.dxfReal(122, 1.0);
- dw.dxfReal(132, 0.0);
- dw.dxfInt( 79, 0);
- dw.dxfReal(146, 0.0);
- }
- dw.dxfString( 0, "ENDTAB");
-}
-
-
-
-/**
- * Writes a style section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked STYLE section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeStyle(DL_WriterA& dw) {
- dw.dxfString( 0, "TABLE");
- dw.dxfString( 2, "STYLE");
- if (version==VER_2000) {
- dw.dxfHex(5, 3);
- }
- //dw.dxfHex(330, 0);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTable");
- }
- dw.dxfInt( 70, 1);
- dw.dxfString( 0, "STYLE");
- if (version==VER_2000) {
- dw.dxfHex(5, 0x11);
- }
- //styleHandleStd = dw.handle();
- //dw.dxfHex(330, 3);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbTextStyleTableRecord");
- }
- dw.dxfString( 2, "Standard");
- dw.dxfInt( 70, 0);
- dw.dxfReal( 40, 0.0);
- dw.dxfReal( 41, 0.75);
- dw.dxfReal( 50, 0.0);
- dw.dxfInt( 71, 0);
- dw.dxfReal( 42, 2.5);
- dw.dxfString( 3, "txt");
- dw.dxfString( 4, "");
- dw.dxfString( 0, "ENDTAB");
-}
-
-
-
-/**
- * Writes a view section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked VIEW section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeView(DL_WriterA& dw) {
- dw.dxfString( 0, "TABLE");
- dw.dxfString( 2, "VIEW");
- if (version==VER_2000) {
- dw.dxfHex(5, 6);
- }
- //dw.dxfHex(330, 0);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTable");
- }
- dw.dxfInt( 70, 0);
- dw.dxfString( 0, "ENDTAB");
-}
-
-
-
-/**
- * Writes a ucs section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked UCS section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeUcs(DL_WriterA& dw) {
- dw.dxfString( 0, "TABLE");
- dw.dxfString( 2, "UCS");
- if (version==VER_2000) {
- dw.dxfHex(5, 7);
- }
- //dw.dxfHex(330, 0);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTable");
- }
- dw.dxfInt( 70, 0);
- dw.dxfString( 0, "ENDTAB");
-}
-
-
-
-/**
- * Writes a dimstyle section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked DIMSTYLE section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeDimStyle(DL_WriterA& dw,
- double dimasz, double dimexe, double dimexo,
- double dimgap, double dimtxt) {
-
- dw.dxfString( 0, "TABLE");
- dw.dxfString( 2, "DIMSTYLE");
- if (version==VER_2000) {
- dw.dxfHex(5, 0xA);
- dw.dxfString(100, "AcDbSymbolTable");
- }
- dw.dxfInt( 70, 1);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbDimStyleTable");
- dw.dxfInt( 71, 0);
- }
-
-
- dw.dxfString( 0, "DIMSTYLE");
- if (version==VER_2000) {
- dw.dxfHex(105, 0x27);
- }
- //dw.handle(105);
- //dw.dxfHex(330, 0xA);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbDimStyleTableRecord");
- }
- dw.dxfString( 2, "Standard");
- if (version==VER_R12) {
- dw.dxfString( 3, "");
- dw.dxfString( 4, "");
- dw.dxfString( 5, "");
- dw.dxfString( 6, "");
- dw.dxfString( 7, "");
- dw.dxfReal( 40, 1.0);
- }
-
- dw.dxfReal( 41, dimasz);
- dw.dxfReal( 42, dimexo);
- dw.dxfReal( 43, 3.75);
- dw.dxfReal( 44, dimexe);
- if (version==VER_R12) {
- dw.dxfReal( 45, 0.0);
- dw.dxfReal( 46, 0.0);
- dw.dxfReal( 47, 0.0);
- dw.dxfReal( 48, 0.0);
- }
- dw.dxfInt( 70, 0);
- if (version==VER_R12) {
- dw.dxfInt( 71, 0);
- dw.dxfInt( 72, 0);
- }
- dw.dxfInt( 73, 0);
- dw.dxfInt( 74, 0);
- if (version==VER_R12) {
- dw.dxfInt( 75, 0);
- dw.dxfInt( 76, 0);
- }
- dw.dxfInt( 77, 1);
- dw.dxfInt( 78, 8);
- dw.dxfReal(140, dimtxt);
- dw.dxfReal(141, 2.5);
- if (version==VER_R12) {
- dw.dxfReal(142, 0.0);
- }
- dw.dxfReal(143, 0.03937007874016);
- if (version==VER_R12) {
- dw.dxfReal(144, 1.0);
- dw.dxfReal(145, 0.0);
- dw.dxfReal(146, 1.0);
- }
- dw.dxfReal(147, dimgap);
- if (version==VER_R12) {
- dw.dxfInt(170, 0);
- }
- dw.dxfInt(171, 3);
- dw.dxfInt(172, 1);
- if (version==VER_R12) {
- dw.dxfInt(173, 0);
- dw.dxfInt(174, 0);
- dw.dxfInt(175, 0);
- dw.dxfInt(176, 0);
- dw.dxfInt(177, 0);
- dw.dxfInt(178, 0);
- }
- if (version==VER_2000) {
- dw.dxfInt(271, 2);
- dw.dxfInt(272, 2);
- dw.dxfInt(274, 3);
- dw.dxfInt(278, 44);
- dw.dxfInt(283, 0);
- dw.dxfInt(284, 8);
- //dw.dxfHex(340, styleHandleStd);
- dw.dxfHex(340, 0x11);
- }
- // * /
- dw.dxfString( 0, "ENDTAB");
-}
-
-
-
-/**
- * Writes a blockrecord section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked BLOCKRECORD section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeBlockRecord(DL_WriterA& dw) {
- dw.dxfString( 0, "TABLE");
- dw.dxfString( 2, "BLOCK_RECORD");
- if (version==VER_2000) {
- dw.dxfHex(5, 1);
- }
- //dw.dxfHex(330, 0);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTable");
- }
- dw.dxfInt( 70, 1);
-
- dw.dxfString( 0, "BLOCK_RECORD");
- if (version==VER_2000) {
- dw.dxfHex(5, 0x1F);
- }
- //int msh = dw.handle();
- //dw.setModelSpaceHandle(msh);
- //dw.dxfHex(330, 1);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbBlockTableRecord");
- }
- dw.dxfString( 2, "*Model_Space");
- dw.dxfHex(340, 0x22);
-
- dw.dxfString( 0, "BLOCK_RECORD");
- if (version==VER_2000) {
- dw.dxfHex(5, 0x1B);
- }
- //int psh = dw.handle();
- //dw.setPaperSpaceHandle(psh);
- //dw.dxfHex(330, 1);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbBlockTableRecord");
- }
- dw.dxfString( 2, "*Paper_Space");
- dw.dxfHex(340, 0x1E);
-
- dw.dxfString( 0, "BLOCK_RECORD");
- if (version==VER_2000) {
- dw.dxfHex(5, 0x23);
- }
- //int ps0h = dw.handle();
- //dw.setPaperSpace0Handle(ps0h);
- //dw.dxfHex(330, 1);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbBlockTableRecord");
- }
- dw.dxfString( 2, "*Paper_Space0");
- dw.dxfHex(340, 0x26);
-
- //dw.dxfString( 0, "ENDTAB");
-}
-
-
-
-/**
- * Writes a single block record with the given name.
- */
-void DL_Dxf::writeBlockRecord(DL_WriterA& dw, const string& name) {
- dw.dxfString( 0, "BLOCK_RECORD");
- if (version==VER_2000) {
- dw.handle();
- }
- //dw->dxfHex(330, 1);
- if (version==VER_2000) {
- dw.dxfString(100, "AcDbSymbolTableRecord");
- dw.dxfString(100, "AcDbBlockTableRecord");
- }
- dw.dxfString( 2, name);
- dw.dxfHex(340, 0);
-}
-
-
-
-/**
- * Writes a objects section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked OBJECTS section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeObjects(DL_WriterA& dw) {
- //int dicId, dicId2, dicId3, dicId4, dicId5;
- //int dicId5;
-
- dw.dxfString( 0, "SECTION");
- dw.dxfString( 2, "OBJECTS");
- dw.dxfString( 0, "DICTIONARY");
- dw.dxfHex(5, 0xC); // C
- //dw.dxfHex(330, 0);
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(280, 0);
- dw.dxfInt(281, 1);
- dw.dxfString( 3, "ACAD_GROUP");
- //dw.dxfHex(350, dw.getNextHandle()); // D
- dw.dxfHex(350, 0xD); // D
- dw.dxfString( 3, "ACAD_LAYOUT");
- dw.dxfHex(350, 0x1A);
- //dw.dxfHex(350, dw.getNextHandle()+0); // 1A
- dw.dxfString( 3, "ACAD_MLINESTYLE");
- dw.dxfHex(350, 0x17);
- //dw.dxfHex(350, dw.getNextHandle()+1); // 17
- dw.dxfString( 3, "ACAD_PLOTSETTINGS");
- dw.dxfHex(350, 0x19);
- //dw.dxfHex(350, dw.getNextHandle()+2); // 19
- dw.dxfString( 3, "ACAD_PLOTSTYLENAME");
- dw.dxfHex(350, 0xE);
- //dw.dxfHex(350, dw.getNextHandle()+3); // E
- dw.dxfString( 3, "AcDbVariableDictionary");
- dw.dxfHex(350, dw.getNextHandle()); // 2C
- dw.dxfString( 0, "DICTIONARY");
- dw.dxfHex(5, 0xD);
- //dw.handle(); // D
- //dw.dxfHex(330, 0xC);
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(280, 0);
- dw.dxfInt(281, 1);
- dw.dxfString( 0, "ACDBDICTIONARYWDFLT");
- dw.dxfHex(5, 0xE);
- //dicId4 = dw.handle(); // E
- //dw.dxfHex(330, 0xC); // C
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(281, 1);
- dw.dxfString( 3, "Normal");
- dw.dxfHex(350, 0xF);
- //dw.dxfHex(350, dw.getNextHandle()+5); // F
- dw.dxfString(100, "AcDbDictionaryWithDefault");
- dw.dxfHex(340, 0xF);
- //dw.dxfHex(340, dw.getNextHandle()+5); // F
- dw.dxfString( 0, "ACDBPLACEHOLDER");
- dw.dxfHex(5, 0xF);
- //dw.handle(); // F
- //dw.dxfHex(330, dicId4); // E
- dw.dxfString( 0, "DICTIONARY");
- //dicId3 = dw.handle(); // 17
- dw.dxfHex(5, 0x17);
- //dw.dxfHex(330, 0xC); // C
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(280, 0);
- dw.dxfInt(281, 1);
- dw.dxfString( 3, "Standard");
- dw.dxfHex(350, 0x18);
- //dw.dxfHex(350, dw.getNextHandle()+5); // 18
- dw.dxfString( 0, "MLINESTYLE");
- dw.dxfHex(5, 0x18);
- //dw.handle(); // 18
- //dw.dxfHex(330, dicId3); // 17
- dw.dxfString(100, "AcDbMlineStyle");
- dw.dxfString( 2, "STANDARD");
- dw.dxfInt( 70, 0);
- dw.dxfString( 3, "");
- dw.dxfInt( 62, 256);
- dw.dxfReal( 51, 90.0);
- dw.dxfReal( 52, 90.0);
- dw.dxfInt( 71, 2);
- dw.dxfReal( 49, 0.5);
- dw.dxfInt( 62, 256);
- dw.dxfString( 6, "BYLAYER");
- dw.dxfReal( 49, -0.5);
- dw.dxfInt( 62, 256);
- dw.dxfString( 6, "BYLAYER");
- dw.dxfString( 0, "DICTIONARY");
- dw.dxfHex(5, 0x19);
- //dw.handle(); // 17
- //dw.dxfHex(330, 0xC); // C
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(280, 0);
- dw.dxfInt(281, 1);
- dw.dxfString( 0, "DICTIONARY");
- //dicId2 = dw.handle(); // 1A
- dw.dxfHex(5, 0x1A);
- //dw.dxfHex(330, 0xC);
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(281, 1);
- dw.dxfString( 3, "Layout1");
- dw.dxfHex(350, 0x1E);
- //dw.dxfHex(350, dw.getNextHandle()+2); // 1E
- dw.dxfString( 3, "Layout2");
- dw.dxfHex(350, 0x26);
- //dw.dxfHex(350, dw.getNextHandle()+4); // 26
- dw.dxfString( 3, "Model");
- dw.dxfHex(350, 0x22);
- //dw.dxfHex(350, dw.getNextHandle()+5); // 22
-
- dw.dxfString( 0, "LAYOUT");
- dw.dxfHex(5, 0x1E);
- //dw.handle(); // 1E
- //dw.dxfHex(330, dicId2); // 1A
- dw.dxfString(100, "AcDbPlotSettings");
- dw.dxfString( 1, "");
- dw.dxfString( 2, "C:\\Program Files\\AutoCAD 2002\\plotters\\DWF ePlot (optimized for plotting).pc3");
- dw.dxfString( 4, "");
- dw.dxfString( 6, "");
- dw.dxfReal( 40, 0.0);
- dw.dxfReal( 41, 0.0);
- dw.dxfReal( 42, 0.0);
- dw.dxfReal( 43, 0.0);
- dw.dxfReal( 44, 0.0);
- dw.dxfReal( 45, 0.0);
- dw.dxfReal( 46, 0.0);
- dw.dxfReal( 47, 0.0);
- dw.dxfReal( 48, 0.0);
- dw.dxfReal( 49, 0.0);
- dw.dxfReal(140, 0.0);
- dw.dxfReal(141, 0.0);
- dw.dxfReal(142, 1.0);
- dw.dxfReal(143, 1.0);
- dw.dxfInt( 70, 688);
- dw.dxfInt( 72, 0);
- dw.dxfInt( 73, 0);
- dw.dxfInt( 74, 5);
- dw.dxfString( 7, "");
- dw.dxfInt( 75, 16);
- dw.dxfReal(147, 1.0);
- dw.dxfReal(148, 0.0);
- dw.dxfReal(149, 0.0);
- dw.dxfString(100, "AcDbLayout");
- dw.dxfString( 1, "Layout1");
- dw.dxfInt( 70, 1);
- dw.dxfInt( 71, 1);
- dw.dxfReal( 10, 0.0);
- dw.dxfReal( 20, 0.0);
- dw.dxfReal( 11, 420.0);
- dw.dxfReal( 21, 297.0);
- dw.dxfReal( 12, 0.0);
- dw.dxfReal( 22, 0.0);
- dw.dxfReal( 32, 0.0);
- dw.dxfReal( 14, 1.000000000000000E+20);
- dw.dxfReal( 24, 1.000000000000000E+20);
- dw.dxfReal( 34, 1.000000000000000E+20);
- dw.dxfReal( 15, -1.000000000000000E+20);
- dw.dxfReal( 25, -1.000000000000000E+20);
- dw.dxfReal( 35, -1.000000000000000E+20);
- dw.dxfReal(146, 0.0);
- dw.dxfReal( 13, 0.0);
- dw.dxfReal( 23, 0.0);
- dw.dxfReal( 33, 0.0);
- dw.dxfReal( 16, 1.0);
- dw.dxfReal( 26, 0.0);
- dw.dxfReal( 36, 0.0);
- dw.dxfReal( 17, 0.0);
- dw.dxfReal( 27, 1.0);
- dw.dxfReal( 37, 0.0);
- dw.dxfInt( 76, 0);
- //dw.dxfHex(330, dw.getPaperSpaceHandle()); // 1B
- dw.dxfHex(330, 0x1B);
- dw.dxfString( 0, "LAYOUT");
- dw.dxfHex(5, 0x22);
- //dw.handle(); // 22
- //dw.dxfHex(330, dicId2); // 1A
- dw.dxfString(100, "AcDbPlotSettings");
- dw.dxfString( 1, "");
- dw.dxfString( 2, "C:\\Program Files\\AutoCAD 2002\\plotters\\DWF ePlot (optimized for plotting).pc3");
- dw.dxfString( 4, "");
- dw.dxfString( 6, "");
- dw.dxfReal( 40, 0.0);
- dw.dxfReal( 41, 0.0);
- dw.dxfReal( 42, 0.0);
- dw.dxfReal( 43, 0.0);
- dw.dxfReal( 44, 0.0);
- dw.dxfReal( 45, 0.0);
- dw.dxfReal( 46, 0.0);
- dw.dxfReal( 47, 0.0);
- dw.dxfReal( 48, 0.0);
- dw.dxfReal( 49, 0.0);
- dw.dxfReal(140, 0.0);
- dw.dxfReal(141, 0.0);
- dw.dxfReal(142, 1.0);
- dw.dxfReal(143, 1.0);
- dw.dxfInt( 70, 1712);
- dw.dxfInt( 72, 0);
- dw.dxfInt( 73, 0);
- dw.dxfInt( 74, 0);
- dw.dxfString( 7, "");
- dw.dxfInt( 75, 0);
- dw.dxfReal(147, 1.0);
- dw.dxfReal(148, 0.0);
- dw.dxfReal(149, 0.0);
- dw.dxfString(100, "AcDbLayout");
- dw.dxfString( 1, "Model");
- dw.dxfInt( 70, 1);
- dw.dxfInt( 71, 0);
- dw.dxfReal( 10, 0.0);
- dw.dxfReal( 20, 0.0);
- dw.dxfReal( 11, 12.0);
- dw.dxfReal( 21, 9.0);
- dw.dxfReal( 12, 0.0);
- dw.dxfReal( 22, 0.0);
- dw.dxfReal( 32, 0.0);
- dw.dxfReal( 14, 0.0);
- dw.dxfReal( 24, 0.0);
- dw.dxfReal( 34, 0.0);
- dw.dxfReal( 15, 0.0);
- dw.dxfReal( 25, 0.0);
- dw.dxfReal( 35, 0.0);
- dw.dxfReal(146, 0.0);
- dw.dxfReal( 13, 0.0);
- dw.dxfReal( 23, 0.0);
- dw.dxfReal( 33, 0.0);
- dw.dxfReal( 16, 1.0);
- dw.dxfReal( 26, 0.0);
- dw.dxfReal( 36, 0.0);
- dw.dxfReal( 17, 0.0);
- dw.dxfReal( 27, 1.0);
- dw.dxfReal( 37, 0.0);
- dw.dxfInt( 76, 0);
- //dw.dxfHex(330, dw.getModelSpaceHandle()); // 1F
- dw.dxfHex(330, 0x1F);
- dw.dxfString( 0, "LAYOUT");
- //dw.handle(); // 26
- dw.dxfHex(5, 0x26);
- //dw.dxfHex(330, dicId2); // 1A
- dw.dxfString(100, "AcDbPlotSettings");
- dw.dxfString( 1, "");
- dw.dxfString( 2, "C:\\Program Files\\AutoCAD 2002\\plotters\\DWF ePlot (optimized for plotting).pc3");
- dw.dxfString( 4, "");
- dw.dxfString( 6, "");
- dw.dxfReal( 40, 0.0);
- dw.dxfReal( 41, 0.0);
- dw.dxfReal( 42, 0.0);
- dw.dxfReal( 43, 0.0);
- dw.dxfReal( 44, 0.0);
- dw.dxfReal( 45, 0.0);
- dw.dxfReal( 46, 0.0);
- dw.dxfReal( 47, 0.0);
- dw.dxfReal( 48, 0.0);
- dw.dxfReal( 49, 0.0);
- dw.dxfReal(140, 0.0);
- dw.dxfReal(141, 0.0);
- dw.dxfReal(142, 1.0);
- dw.dxfReal(143, 1.0);
- dw.dxfInt( 70, 688);
- dw.dxfInt( 72, 0);
- dw.dxfInt( 73, 0);
- dw.dxfInt( 74, 5);
- dw.dxfString( 7, "");
- dw.dxfInt( 75, 16);
- dw.dxfReal(147, 1.0);
- dw.dxfReal(148, 0.0);
- dw.dxfReal(149, 0.0);
- dw.dxfString(100, "AcDbLayout");
- dw.dxfString( 1, "Layout2");
- dw.dxfInt( 70, 1);
- dw.dxfInt( 71, 2);
- dw.dxfReal( 10, 0.0);
- dw.dxfReal( 20, 0.0);
- dw.dxfReal( 11, 12.0);
- dw.dxfReal( 21, 9.0);
- dw.dxfReal( 12, 0.0);
- dw.dxfReal( 22, 0.0);
- dw.dxfReal( 32, 0.0);
- dw.dxfReal( 14, 0.0);
- dw.dxfReal( 24, 0.0);
- dw.dxfReal( 34, 0.0);
- dw.dxfReal( 15, 0.0);
- dw.dxfReal( 25, 0.0);
- dw.dxfReal( 35, 0.0);
- dw.dxfReal(146, 0.0);
- dw.dxfReal( 13, 0.0);
- dw.dxfReal( 23, 0.0);
- dw.dxfReal( 33, 0.0);
- dw.dxfReal( 16, 1.0);
- dw.dxfReal( 26, 0.0);
- dw.dxfReal( 36, 0.0);
- dw.dxfReal( 17, 0.0);
- dw.dxfReal( 27, 1.0);
- dw.dxfReal( 37, 0.0);
- dw.dxfInt( 76, 0);
- //dw.dxfHex(330, dw.getPaperSpace0Handle()); // 23
- dw.dxfHex(330, 0x23);
- dw.dxfString( 0, "DICTIONARY");
- //dw.dxfHex(5, 0x2C);
- //dicId5 =
- dw.handle(); // 2C
- //dw.dxfHex(330, 0xC); // C
- dw.dxfString(100, "AcDbDictionary");
- dw.dxfInt(281, 1);
- dw.dxfString( 3, "DIMASSOC");
- //dw.dxfHex(350, 0x2F);
- dw.dxfHex(350, dw.getNextHandle()+1); // 2E
- dw.dxfString( 3, "HIDETEXT");
- //dw.dxfHex(350, 0x2E);
- dw.dxfHex(350, dw.getNextHandle()); // 2D
- dw.dxfString( 0, "DICTIONARYVAR");
- //dw.dxfHex(5, 0x2E);
- dw.handle(); // 2E
- //dw.dxfHex(330, dicId5); // 2C
- dw.dxfString(100, "DictionaryVariables");
- dw.dxfInt(280, 0);
- dw.dxfInt( 1, 2);
- dw.dxfString( 0, "DICTIONARYVAR");
- //dw.dxfHex(5, 0x2D);
- dw.handle(); // 2D
- //dw.dxfHex(330, dicId5); // 2C
- dw.dxfString(100, "DictionaryVariables");
- dw.dxfInt(280, 0);
- dw.dxfInt( 1, 1);
-}
-
-
-/**
- * Writes the end of the objects section. This section is needed in VER_R13.
- * Note that this method currently only writes a faked OBJECTS section
- * to make the file readable by Aut*cad.
- */
-void DL_Dxf::writeObjectsEnd(DL_WriterA& dw) {
- dw.dxfString( 0, "ENDSEC");
-}
-
-
-
-/**
- * Writes a comment to the DXF file.
- */
-void DL_Dxf::writeComment(DL_WriterA& dw, const string& comment) {
- dw.dxfString(999, comment);
-}
-
-
-/**
- * Checks if the given variable is known by the given DXF version.
- */
-bool DL_Dxf::checkVariable(const char* var, DL_Codes::version version) {
- if (version>=VER_2000) {
- return true;
- } else if (version==VER_R12) {
- // these are all the variables recognized by dxf r12:
- if (!strcmp(var, "$ACADVER")) {
- return true;
- }
- if (!strcmp(var, "$ACADVER")) {
- return true;
- }
- if (!strcmp(var, "$ANGBASE")) {
- return true;
- }
- if (!strcmp(var, "$ANGDIR")) {
- return true;
- }
- if (!strcmp(var, "$ATTDIA")) {
- return true;
- }
- if (!strcmp(var, "$ATTMODE")) {
- return true;
- }
- if (!strcmp(var, "$ATTREQ")) {
- return true;
- }
- if (!strcmp(var, "$AUNITS")) {
- return true;
- }
- if (!strcmp(var, "$AUPREC")) {
- return true;
- }
- if (!strcmp(var, "$AXISMODE")) {
- return true;
- }
- if (!strcmp(var, "$AXISUNIT")) {
- return true;
- }
- if (!strcmp(var, "$BLIPMODE")) {
- return true;
- }
- if (!strcmp(var, "$CECOLOR")) {
- return true;
- }
- if (!strcmp(var, "$CELTYPE")) {
- return true;
- }
- if (!strcmp(var, "$CHAMFERA")) {
- return true;
- }
- if (!strcmp(var, "$CHAMFERB")) {
- return true;
- }
- if (!strcmp(var, "$CLAYER")) {
- return true;
- }
- if (!strcmp(var, "$COORDS")) {
- return true;
- }
- if (!strcmp(var, "$DIMALT")) {
- return true;
- }
- if (!strcmp(var, "$DIMALTD")) {
- return true;
- }
- if (!strcmp(var, "$DIMALTF")) {
- return true;
- }
- if (!strcmp(var, "$DIMAPOST")) {
- return true;
- }
- if (!strcmp(var, "$DIMASO")) {
- return true;
- }
- if (!strcmp(var, "$DIMASZ")) {
- return true;
- }
- if (!strcmp(var, "$DIMBLK")) {
- return true;
- }
- if (!strcmp(var, "$DIMBLK1")) {
- return true;
- }
- if (!strcmp(var, "$DIMBLK2")) {
- return true;
- }
- if (!strcmp(var, "$DIMCEN")) {
- return true;
- }
- if (!strcmp(var, "$DIMCLRD")) {
- return true;
- }
- if (!strcmp(var, "$DIMCLRE")) {
- return true;
- }
- if (!strcmp(var, "$DIMCLRT")) {
- return true;
- }
- if (!strcmp(var, "$DIMDLE")) {
- return true;
- }
- if (!strcmp(var, "$DIMDLI")) {
- return true;
- }
- if (!strcmp(var, "$DIMEXE")) {
- return true;
- }
- if (!strcmp(var, "$DIMEXO")) {
- return true;
- }
- if (!strcmp(var, "$DIMGAP")) {
- return true;
- }
- if (!strcmp(var, "$DIMLFAC")) {
- return true;
- }
- if (!strcmp(var, "$DIMLIM")) {
- return true;
- }
- if (!strcmp(var, "$DIMPOST")) {
- return true;
- }
- if (!strcmp(var, "$DIMRND")) {
- return true;
- }
- if (!strcmp(var, "$DIMSAH")) {
- return true;
- }
- if (!strcmp(var, "$DIMSCALE")) {
- return true;
- }
- if (!strcmp(var, "$DIMSE1")) {
- return true;
- }
- if (!strcmp(var, "$DIMSE2")) {
- return true;
- }
- if (!strcmp(var, "$DIMSHO")) {
- return true;
- }
- if (!strcmp(var, "$DIMSOXD")) {
- return true;
- }
- if (!strcmp(var, "$DIMSTYLE")) {
- return true;
- }
- if (!strcmp(var, "$DIMTAD")) {
- return true;
- }
- if (!strcmp(var, "$DIMTFAC")) {
- return true;
- }
- if (!strcmp(var, "$DIMTIH")) {
- return true;
- }
- if (!strcmp(var, "$DIMTIX")) {
- return true;
- }
- if (!strcmp(var, "$DIMTM")) {
- return true;
- }
- if (!strcmp(var, "$DIMTOFL")) {
- return true;
- }
- if (!strcmp(var, "$DIMTOH")) {
- return true;
- }
- if (!strcmp(var, "$DIMTOL")) {
- return true;
- }
- if (!strcmp(var, "$DIMTP")) {
- return true;
- }
- if (!strcmp(var, "$DIMTSZ")) {
- return true;
- }
- if (!strcmp(var, "$DIMTVP")) {
- return true;
- }
- if (!strcmp(var, "$DIMTXT")) {
- return true;
- }
- if (!strcmp(var, "$DIMZIN")) {
- return true;
- }
- if (!strcmp(var, "$DWGCODEPAGE")) {
- return true;
- }
- if (!strcmp(var, "$DRAGMODE")) {
- return true;
- }
- if (!strcmp(var, "$ELEVATION")) {
- return true;
- }
- if (!strcmp(var, "$EXTMAX")) {
- return true;
- }
- if (!strcmp(var, "$EXTMIN")) {
- return true;
- }
- if (!strcmp(var, "$FILLETRAD")) {
- return true;
- }
- if (!strcmp(var, "$FILLMODE")) {
- return true;
- }
- if (!strcmp(var, "$HANDLING")) {
- return true;
- }
- if (!strcmp(var, "$HANDSEED")) {
- return true;
- }
- if (!strcmp(var, "$INSBASE")) {
- return true;
- }
- if (!strcmp(var, "$LIMCHECK")) {
- return true;
- }
- if (!strcmp(var, "$LIMMAX")) {
- return true;
- }
- if (!strcmp(var, "$LIMMIN")) {
- return true;
- }
- if (!strcmp(var, "$LTSCALE")) {
- return true;
- }
- if (!strcmp(var, "$LUNITS")) {
- return true;
- }
- if (!strcmp(var, "$LUPREC")) {
- return true;
- }
- if (!strcmp(var, "$MAXACTVP")) {
- return true;
- }
- if (!strcmp(var, "$MENU")) {
- return true;
- }
- if (!strcmp(var, "$MIRRTEXT")) {
- return true;
- }
- if (!strcmp(var, "$ORTHOMODE")) {
- return true;
- }
- if (!strcmp(var, "$OSMODE")) {
- return true;
- }
- if (!strcmp(var, "$PDMODE")) {
- return true;
- }
- if (!strcmp(var, "$PDSIZE")) {
- return true;
- }
- if (!strcmp(var, "$PELEVATION")) {
- return true;
- }
- if (!strcmp(var, "$PEXTMAX")) {
- return true;
- }
- if (!strcmp(var, "$PEXTMIN")) {
- return true;
- }
- if (!strcmp(var, "$PLIMCHECK")) {
- return true;
- }
- if (!strcmp(var, "$PLIMMAX")) {
- return true;
- }
- if (!strcmp(var, "$PLIMMIN")) {
- return true;
- }
- if (!strcmp(var, "$PLINEGEN")) {
- return true;
- }
- if (!strcmp(var, "$PLINEWID")) {
- return true;
- }
- if (!strcmp(var, "$PSLTSCALE")) {
- return true;
- }
- if (!strcmp(var, "$PUCSNAME")) {
- return true;
- }
- if (!strcmp(var, "$PUCSORG")) {
- return true;
- }
- if (!strcmp(var, "$PUCSXDIR")) {
- return true;
- }
- if (!strcmp(var, "$PUCSYDIR")) {
- return true;
- }
- if (!strcmp(var, "$QTEXTMODE")) {
- return true;
- }
- if (!strcmp(var, "$REGENMODE")) {
- return true;
- }
- if (!strcmp(var, "$SHADEDGE")) {
- return true;
- }
- if (!strcmp(var, "$SHADEDIF")) {
- return true;
- }
- if (!strcmp(var, "$SKETCHINC")) {
- return true;
- }
- if (!strcmp(var, "$SKPOLY")) {
- return true;
- }
- if (!strcmp(var, "$SPLFRAME")) {
- return true;
- }
- if (!strcmp(var, "$SPLINESEGS")) {
- return true;
- }
- if (!strcmp(var, "$SPLINETYPE")) {
- return true;
- }
- if (!strcmp(var, "$SURFTAB1")) {
- return true;
- }
- if (!strcmp(var, "$SURFTAB2")) {
- return true;
- }
- if (!strcmp(var, "$SURFTYPE")) {
- return true;
- }
- if (!strcmp(var, "$SURFU")) {
- return true;
- }
- if (!strcmp(var, "$SURFV")) {
- return true;
- }
- if (!strcmp(var, "$TDCREATE")) {
- return true;
- }
- if (!strcmp(var, "$TDINDWG")) {
- return true;
- }
- if (!strcmp(var, "$TDUPDATE")) {
- return true;
- }
- if (!strcmp(var, "$TDUSRTIMER")) {
- return true;
- }
- if (!strcmp(var, "$TEXTSIZE")) {
- return true;
- }
- if (!strcmp(var, "$TEXTSTYLE")) {
- return true;
- }
- if (!strcmp(var, "$THICKNESS")) {
- return true;
- }
- if (!strcmp(var, "$TILEMODE")) {
- return true;
- }
- if (!strcmp(var, "$TRACEWID")) {
- return true;
- }
- if (!strcmp(var, "$UCSNAME")) {
- return true;
- }
- if (!strcmp(var, "$UCSORG")) {
- return true;
- }
- if (!strcmp(var, "$UCSXDIR")) {
- return true;
- }
- if (!strcmp(var, "$UCSYDIR")) {
- return true;
- }
- if (!strcmp(var, "$UNITMODE")) {
- return true;
- }
- if (!strcmp(var, "$USERI1")) {
- return true;
- }
- if (!strcmp(var, "$USERR1")) {
- return true;
- }
- if (!strcmp(var, "$USRTIMER")) {
- return true;
- }
- if (!strcmp(var, "$VISRETAIN")) {
- return true;
- }
- if (!strcmp(var, "$WORLDVIEW")) {
- return true;
- }
- if (!strcmp(var, "$FASTZOOM")) {
- return true;
- }
- if (!strcmp(var, "$GRIDMODE")) {
- return true;
- }
- if (!strcmp(var, "$GRIDUNIT")) {
- return true;
- }
- if (!strcmp(var, "$SNAPANG")) {
- return true;
- }
- if (!strcmp(var, "$SNAPBASE")) {
- return true;
- }
- if (!strcmp(var, "$SNAPISOPAIR")) {
- return true;
- }
- if (!strcmp(var, "$SNAPMODE")) {
- return true;
- }
- if (!strcmp(var, "$SNAPSTYLE")) {
- return true;
- }
- if (!strcmp(var, "$SNAPUNIT")) {
- return true;
- }
- if (!strcmp(var, "$VIEWCTR")) {
- return true;
- }
- if (!strcmp(var, "$VIEWDIR")) {
- return true;
- }
- if (!strcmp(var, "$VIEWSIZE")) {
- return true;
- }
- return false;
- }
-
- return false;
-}
-
-
-
-/**
- * @returns the library version as int (4 bytes, each byte one version number).
- * e.g. if str = "2.0.2.0" getLibVersion returns 0x02000200
- */
-int DL_Dxf::getLibVersion(const char* str) {
- int d[4];
- int idx = 0;
- char v[4][5];
- int ret = 0;
-
- for (unsigned int i=0; i<strlen(str) && idx<3; ++i) {
- if (str[i]=='.') {
- d[idx] = i;
- idx++;
- }
- }
-
- if (idx==3) {
- d[3] = strlen(str);
-
- strncpy(v[0], str, d[0]);
- v[0][d[0]] = '\0';
-
- strncpy(v[1], &str[d[0]+1], d[1]-d[0]-1);
- v[1][d[1]-d[0]-1] = '\0';
-
- strncpy(v[2], &str[d[1]+1], d[2]-d[1]-1);
- v[2][d[2]-d[1]-1] = '\0';
-
- strncpy(v[3], &str[d[2]+1], d[3]-d[2]-1);
- v[3][d[3]-d[2]-1] = '\0';
-
- ret = (atoi(v[0])<<(3*8)) +
- (atoi(v[1])<<(2*8)) +
- (atoi(v[2])<<(1*8)) +
- (atoi(v[3])<<(0*8));
-
- return ret;
- } else {
- std::cerr << "DL_Dxf::getLibVersion: invalid version number: " << str << "\n";
- return 0;
- }
-}
-
-
-
-/**
- * Some test routines.
- */
-void DL_Dxf::test() {
- char* buf1;
- char* buf2;
- char* buf3;
- char* buf4;
- char* buf5;
- char* buf6;
-
- buf1 = new char[10];
- buf2 = new char[10];
- buf3 = new char[10];
- buf4 = new char[10];
- buf5 = new char[10];
- buf6 = new char[10];
-
- strcpy(buf1, " 10\n");
- strcpy(buf2, "10");
- strcpy(buf3, "10\n");
- strcpy(buf4, " 10 \n");
- strcpy(buf5, " 10 \r");
- strcpy(buf6, "\t10 \n");
-
- std::cout << "1 buf1: '" << buf1 << "'\n";
- stripWhiteSpace(&buf1);
- std::cout << "2 buf1: '" << buf1 << "'\n";
- //assert(!strcmp(buf1, "10"));
-
- std::cout << "1 buf2: '" << buf2 << "'\n";
- stripWhiteSpace(&buf2);
- std::cout << "2 buf2: '" << buf2 << "'\n";
-
- std::cout << "1 buf3: '" << buf3 << "'\n";
- stripWhiteSpace(&buf3);
- std::cout << "2 buf3: '" << buf3 << "'\n";
-
- std::cout << "1 buf4: '" << buf4 << "'\n";
- stripWhiteSpace(&buf4);
- std::cout << "2 buf4: '" << buf4 << "'\n";
-
- std::cout << "1 buf5: '" << buf5 << "'\n";
- stripWhiteSpace(&buf5);
- std::cout << "2 buf5: '" << buf5 << "'\n";
-
- std::cout << "1 buf6: '" << buf6 << "'\n";
- stripWhiteSpace(&buf6);
- std::cout << "2 buf6: '" << buf6 << "'\n";
-
-}
-
-
diff --git a/dxflib/src/dl_dxf.h b/dxflib/src/dl_dxf.h
deleted file mode 100644
index 5cda8a7..0000000
--- a/dxflib/src/dl_dxf.h
+++ /dev/null
@@ -1,430 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_DXF_H
-#define DL_DXF_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifndef __GCC2x__
-#include <sstream>
-#endif
-
-#include "dl_attributes.h"
-#include "dl_codes.h"
-#include "dl_entities.h"
-#include "dl_writer_ascii.h"
-
-#ifdef _WIN32
-#undef M_PI
-#define M_PI 3.14159265358979323846
-#pragma warning(disable : 4800)
-#endif
-
-#ifndef M_PI
-#define M_PI 3.1415926535897932384626433832795
-#endif
-
-class DL_CreationInterface;
-class DL_WriterA;
-
-
-#define DL_VERSION "2.2.0.0"
-
-#define DL_UNKNOWN 0
-#define DL_LAYER 10
-#define DL_BLOCK 11
-#define DL_ENDBLK 12
-#define DL_LINETYPE 13
-#define DL_SETTING 50
-#define DL_ENTITY_POINT 100
-#define DL_ENTITY_LINE 101
-#define DL_ENTITY_POLYLINE 102
-#define DL_ENTITY_LWPOLYLINE 103
-#define DL_ENTITY_VERTEX 104
-#define DL_ENTITY_SPLINE 105
-#define DL_ENTITY_KNOT 106
-#define DL_ENTITY_CONTROLPOINT 107
-#define DL_ENTITY_ARC 108
-#define DL_ENTITY_CIRCLE 109
-#define DL_ENTITY_ELLIPSE 110
-#define DL_ENTITY_INSERT 111
-#define DL_ENTITY_TEXT 112
-#define DL_ENTITY_MTEXT 113
-#define DL_ENTITY_DIMENSION 114
-#define DL_ENTITY_LEADER 115
-#define DL_ENTITY_HATCH 116
-#define DL_ENTITY_ATTRIB 117
-#define DL_ENTITY_IMAGE 118
-#define DL_ENTITY_IMAGEDEF 119
-#define DL_ENTITY_TRACE 120
-#define DL_ENTITY_SOLID 121
-#define DL_ENTITY_3DFACE 122
-#define DL_ENTITY_SEQEND 123
-
-
-/**
- * Reading and writing of DXF files.
- *
- * This class can read in a DXF file and calls methods from the
- * interface DL_EntityContainer to add the entities to the
- * contianer provided by the user of the library.
- *
- * It can also be used to write DXF files to a certain extent.
- *
- * When saving entities, special values for colors and linetypes
- * can be used:
- *
- * Special colors are 0 (=BYBLOCK) and 256 (=BYLAYER).
- * Special linetypes are "BYLAYER" and "BYBLOCK".
- *
- * @author Andrew Mustun
- */
-class DL_Dxf {
-public:
- DL_Dxf();
- ~DL_Dxf();
-
- bool in(const string& file,
- DL_CreationInterface* creationInterface);
- bool readDxfGroups(FILE* fp,
- DL_CreationInterface* creationInterface,
- int* errorCounter = NULL);
- static bool getChoppedLine(char* s, unsigned int size,
- FILE *stream);
-
-#ifndef __GCC2x__
- bool readDxfGroups(std::stringstream &stream,
- DL_CreationInterface* creationInterface,
- int* errorCounter = NULL);
- bool in(std::stringstream &stream,
- DL_CreationInterface* creationInterface);
- static bool getChoppedLine(char *s, unsigned int size,
- std::stringstream &stream);
-#endif
-
- static bool stripWhiteSpace(char** s);
-
- bool processDXFGroup(DL_CreationInterface* creationInterface,
- int groupCode, const char* groupValue);
- void addSetting(DL_CreationInterface* creationInterface);
- void addLayer(DL_CreationInterface* creationInterface);
- void addBlock(DL_CreationInterface* creationInterface);
- void endBlock(DL_CreationInterface* creationInterface);
-
- void addPoint(DL_CreationInterface* creationInterface);
- void addLine(DL_CreationInterface* creationInterface);
-
- void addPolyline(DL_CreationInterface* creationInterface);
- void addVertex(DL_CreationInterface* creationInterface);
-
- void addSpline(DL_CreationInterface* creationInterface);
- //void addKnot(DL_CreationInterface* creationInterface);
- //void addControlPoint(DL_CreationInterface* creationInterface);
-
- void addArc(DL_CreationInterface* creationInterface);
- void addCircle(DL_CreationInterface* creationInterface);
- void addEllipse(DL_CreationInterface* creationInterface);
- void addInsert(DL_CreationInterface* creationInterface);
-
- void addTrace(DL_CreationInterface* creationInterface);
- void add3dFace(DL_CreationInterface* creationInterface);
- void addSolid(DL_CreationInterface* creationInterface);
-
- void addMText(DL_CreationInterface* creationInterface);
- bool handleMTextData(DL_CreationInterface* creationInterface);
- bool handleLWPolylineData(DL_CreationInterface* creationInterface);
- bool handleSplineData(DL_CreationInterface* creationInterface);
- bool handleLeaderData(DL_CreationInterface* creationInterface);
- bool handleHatchData(DL_CreationInterface* creationInterface);
-
- void addText(DL_CreationInterface* creationInterface);
- void addAttrib(DL_CreationInterface* creationInterface);
- DL_DimensionData getDimData();
- void addDimLinear(DL_CreationInterface* creationInterface);
- void addDimAligned(DL_CreationInterface* creationInterface);
- void addDimRadial(DL_CreationInterface* creationInterface);
- void addDimDiametric(DL_CreationInterface* creationInterface);
- void addDimAngular(DL_CreationInterface* creationInterface);
- void addDimAngular3P(DL_CreationInterface* creationInterface);
- void addDimOrdinate(DL_CreationInterface* creationInterface);
- void addLeader(DL_CreationInterface* creationInterface);
- void addHatch(DL_CreationInterface* creationInterface);
- void addImage(DL_CreationInterface* creationInterface);
- void addImageDef(DL_CreationInterface* creationInterface);
-
- void addComment(DL_CreationInterface* creationInterface, const char* comment);
-
- void endEntity(DL_CreationInterface* creationInterface);
-
- void endSequence(DL_CreationInterface* creationInterface);
-
- int stringToInt(const char* s, bool* ok=NULL);
-
- DL_WriterA* out(const char* file,
- DL_Codes::version version=VER_2000);
-
- void writeHeader(DL_WriterA& dw);
-
- void writePoint(DL_WriterA& dw,
- const DL_PointData& data,
- const DL_Attributes& attrib);
- void writeLine(DL_WriterA& dw,
- const DL_LineData& data,
- const DL_Attributes& attrib);
- void writePolyline(DL_WriterA& dw,
- const DL_PolylineData& data,
- const DL_Attributes& attrib);
- void writeVertex(DL_WriterA& dw,
- const DL_VertexData& data);
- void writePolylineEnd(DL_WriterA& dw);
- void writeSpline(DL_WriterA& dw,
- const DL_SplineData& data,
- const DL_Attributes& attrib);
- void writeControlPoint(DL_WriterA& dw,
- const DL_ControlPointData& data);
- void writeKnot(DL_WriterA& dw,
- const DL_KnotData& data);
- void writeCircle(DL_WriterA& dw,
- const DL_CircleData& data,
- const DL_Attributes& attrib);
- void writeArc(DL_WriterA& dw,
- const DL_ArcData& data,
- const DL_Attributes& attrib);
- void writeEllipse(DL_WriterA& dw,
- const DL_EllipseData& data,
- const DL_Attributes& attrib);
- void writeSolid(DL_WriterA& dw,
- const DL_SolidData& data,
- const DL_Attributes& attrib);
- void write3dFace(DL_WriterA& dw,
- const DL_3dFaceData& data,
- const DL_Attributes& attrib);
- void writeInsert(DL_WriterA& dw,
- const DL_InsertData& data,
- const DL_Attributes& attrib);
- void writeMText(DL_WriterA& dw,
- const DL_MTextData& data,
- const DL_Attributes& attrib);
- void writeText(DL_WriterA& dw,
- const DL_TextData& data,
- const DL_Attributes& attrib);
- void writeDimAligned(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimAlignedData& edata,
- const DL_Attributes& attrib);
- void writeDimLinear(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimLinearData& edata,
- const DL_Attributes& attrib);
- void writeDimRadial(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimRadialData& edata,
- const DL_Attributes& attrib);
- void writeDimDiametric(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimDiametricData& edata,
- const DL_Attributes& attrib);
- void writeDimAngular(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimAngularData& edata,
- const DL_Attributes& attrib);
- void writeDimAngular3P(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimAngular3PData& edata,
- const DL_Attributes& attrib);
- void writeDimOrdinate(DL_WriterA& dw,
- const DL_DimensionData& data,
- const DL_DimOrdinateData& edata,
- const DL_Attributes& attrib);
- void writeLeader(DL_WriterA& dw,
- const DL_LeaderData& data,
- const DL_Attributes& attrib);
- void writeLeaderVertex(DL_WriterA& dw,
- const DL_LeaderVertexData& data);
- void writeHatch1(DL_WriterA& dw,
- const DL_HatchData& data,
- const DL_Attributes& attrib);
- void writeHatch2(DL_WriterA& dw,
- const DL_HatchData& data,
- const DL_Attributes& attrib);
- void writeHatchLoop1(DL_WriterA& dw,
- const DL_HatchLoopData& data);
- void writeHatchLoop2(DL_WriterA& dw,
- const DL_HatchLoopData& data);
- void writeHatchEdge(DL_WriterA& dw,
- const DL_HatchEdgeData& data);
-
- int writeImage(DL_WriterA& dw,
- const DL_ImageData& data,
- const DL_Attributes& attrib);
-
- void writeImageDef(DL_WriterA& dw, int handle,
- const DL_ImageData& data);
-
- void writeLayer(DL_WriterA& dw,
- const DL_LayerData& data,
- const DL_Attributes& attrib);
-
- void writeLineType(DL_WriterA& dw,
- const DL_LineTypeData& data);
-
- void writeAppid(DL_WriterA& dw, const string& name);
-
- void writeBlock(DL_WriterA& dw,
- const DL_BlockData& data);
- void writeEndBlock(DL_WriterA& dw, const string& name);
-
- void writeVPort(DL_WriterA& dw);
- void writeStyle(DL_WriterA& dw);
- void writeView(DL_WriterA& dw);
- void writeUcs(DL_WriterA& dw);
- void writeDimStyle(DL_WriterA& dw,
- double dimasz, double dimexe, double dimexo,
- double dimgap, double dimtxt);
- void writeBlockRecord(DL_WriterA& dw);
- void writeBlockRecord(DL_WriterA& dw, const string& name);
- void writeObjects(DL_WriterA& dw);
- void writeObjectsEnd(DL_WriterA& dw);
-
- void writeComment(DL_WriterA& dw, const string& comment);
-
- /**
- * Converts the given string into a double or returns the given
- * default valud (def) if value is NULL or empty.
- */
- static double toReal(const char* value, double def=0.0) {
- if (value!=NULL && value[0] != '\0') {
- double ret;
- if (strchr(value, ',') != NULL) {
- char* tmp = new char[strlen(value)+1];
- strcpy(tmp, value);
- DL_WriterA::strReplace(tmp, ',', '.');
- ret = atof(tmp);
- delete[] tmp;
- }
- else {
- ret = atof(value);
- }
- return ret;
- } else {
- return def;
- }
- }
- /**
- * Converts the given string into an int or returns the given
- * default valud (def) if value is NULL or empty.
- */
- static int toInt(const char* value, int def=0) {
- if (value!=NULL && value[0] != '\0') {
- return atoi(value);
- } else {
- return def;
- }
- }
- /**
- * Converts the given string into a string or returns the given
- * default valud (def) if value is NULL or empty.
- */
- static const char* toString(const char* value, const char* def="") {
- if (value!=NULL && value[0] != '\0') {
- return value;
- } else {
- return def;
- }
- }
-
- static bool checkVariable(const char* var, DL_Codes::version version);
-
- DL_Codes::version getVersion() {
- return version;
- }
-
- int getLibVersion(const char* str);
-
- static void test();
-
-private:
- DL_Codes::version version;
- unsigned long styleHandleStd;
-
- string polylineLayer;
- double* vertices;
- int maxVertices;
- int vertexIndex;
-
- double* knots;
- int maxKnots;
- int knotIndex;
-
- double* controlPoints;
- int maxControlPoints;
- int controlPointIndex;
-
- double* leaderVertices;
- int maxLeaderVertices;
- int leaderVertexIndex;
-
- // array of hatch loops
- DL_HatchLoopData* hatchLoops;
- int maxHatchLoops;
- int hatchLoopIndex;
- // array in format [loop#][edge#]
- DL_HatchEdgeData** hatchEdges;
- int* maxHatchEdges;
- int* hatchEdgeIndex;
- bool dropEdges;
-
- // Bulge for the next vertex.
- double bulge;
-
- // Only the useful part of the group code
- char groupCodeTmp[DL_DXF_MAXLINE+1];
- // ...same as integer
- unsigned int groupCode;
- // Only the useful part of the group value
- char groupValue[DL_DXF_MAXLINE+1];
- // Current entity type
- int currentEntity;
- // Value of the current setting
- char settingValue[DL_DXF_MAXLINE+1];
- // Key of the current setting (e.g. "$ACADVER")
- char settingKey[DL_DXF_MAXLINE+1];
- // Stores the group codes
- char values[DL_DXF_MAXGROUPCODE][DL_DXF_MAXLINE+1];
- // First call of this method. We initialize all group values in
- // the first call.
- bool firstCall;
- // Attributes of the current entity (layer, color, width, line type)
- DL_Attributes attrib;
- // library version. hex: 0x20003001 = 2.0.3.1
- int libVersion;
-};
-
-#endif
-
-// EOF
diff --git a/dxflib/src/dl_entities.h b/dxflib/src/dl_entities.h
deleted file mode 100644
index 7e64646..0000000
--- a/dxflib/src/dl_entities.h
+++ /dev/null
@@ -1,1451 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_ENTITIES_H
-#define DL_ENTITIES_H
-
-
-#include <string>
-using std::string;
-
-/**
- * Layer Data.
- *
- * @author Andrew Mustun
- */
-struct DL_LayerData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_LayerData(const string& lName,
- int lFlags) {
- name = lName;
- flags = lFlags;
- }
-
- /** Layer name. */
- string name;
- /** Layer flags. (1 = frozen, 2 = frozen by default, 4 = locked) */
- int flags;
-};
-
-
-
-/**
- * Block Data.
- *
- * @author Andrew Mustun
- */
-struct DL_BlockData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_BlockData(const string& bName,
- int bFlags,
- double bbpx, double bbpy, double bbpz) {
- name = bName;
- flags = bFlags;
- bpx = bbpx;
- bpy = bbpy;
- bpz = bbpz;
- }
-
- /** Block name. */
- string name;
- /** Block flags. (not used currently) */
- int flags;
- /** X Coordinate of base point. */
- double bpx;
- /** Y Coordinate of base point. */
- double bpy;
- /** Z Coordinate of base point. */
- double bpz;
-};
-
-
-
-/**
- * Line Type Data.
- *
- * @author Andrew Mustun
- */
-struct DL_LineTypeData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_LineTypeData(const string& lName,
- int lFlags) {
- name = lName;
- flags = lFlags;
- }
-
- /** Line type name. */
- string name;
- /** Line type flags. */
- int flags;
-};
-
-
-
-/**
- * Point Data.
- *
- * @author Andrew Mustun
- */
-struct DL_PointData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_PointData(double px=0.0, double py=0.0, double pz=0.0) {
- x = px;
- y = py;
- z = pz;
- }
-
- /*! X Coordinate of the point. */
- double x;
- /*! Y Coordinate of the point. */
- double y;
- /*! Z Coordinate of the point. */
- double z;
-};
-
-
-
-/**
- * Line Data.
- *
- * @author Andrew Mustun
- */
-struct DL_LineData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_LineData(double lx1, double ly1, double lz1,
- double lx2, double ly2, double lz2) {
- x1 = lx1;
- y1 = ly1;
- z1 = lz1;
-
- x2 = lx2;
- y2 = ly2;
- z2 = lz2;
- }
-
- /*! X Start coordinate of the point. */
- double x1;
- /*! Y Start coordinate of the point. */
- double y1;
- /*! Z Start coordinate of the point. */
- double z1;
-
- /*! X End coordinate of the point. */
- double x2;
- /*! Y End coordinate of the point. */
- double y2;
- /*! Z End coordinate of the point. */
- double z2;
-};
-
-
-
-/**
- * Arc Data.
- *
- * @author Andrew Mustun
- */
-struct DL_ArcData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_ArcData(double acx, double acy, double acz,
- double aRadius,
- double aAngle1, double aAngle2) {
-
- cx = acx;
- cy = acy;
- cz = acz;
- radius = aRadius;
- angle1 = aAngle1;
- angle2 = aAngle2;
- }
-
- /*! X Coordinate of center point. */
- double cx;
- /*! Y Coordinate of center point. */
- double cy;
- /*! Z Coordinate of center point. */
- double cz;
-
- /*! Radius of arc. */
- double radius;
- /*! Startangle of arc in degrees. */
- double angle1;
- /*! Endangle of arc in degrees. */
- double angle2;
-};
-
-
-
-/**
- * Circle Data.
- *
- * @author Andrew Mustun
- */
-struct DL_CircleData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_CircleData(double acx, double acy, double acz,
- double aRadius) {
-
- cx = acx;
- cy = acy;
- cz = acz;
- radius = aRadius;
- }
-
- /*! X Coordinate of center point. */
- double cx;
- /*! Y Coordinate of center point. */
- double cy;
- /*! Z Coordinate of center point. */
- double cz;
-
- /*! Radius of arc. */
- double radius;
-};
-
-
-
-/**
- * Polyline Data.
- *
- * @author Andrew Mustun
- */
-struct DL_PolylineData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_PolylineData(int pNumber, int pMVerteces, int pNVerteces, int pFlags) {
- number = pNumber;
- m = pMVerteces;
- n = pNVerteces;
- flags = pFlags;
- }
-
- /*! Number of vertices in this polyline. */
- unsigned int number;
-
- /*! Number of vertices in m direction if polyline is a polygon mesh. */
- unsigned int m;
-
- /*! Number of vertices in n direction if polyline is a polygon mesh. */
- unsigned int n;
-
- /*! Flags */
- int flags;
-};
-
-
-
-/**
- * Vertex Data.
- *
- * @author Andrew Mustun
- */
-struct DL_VertexData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_VertexData(double px=0.0, double py=0.0, double pz=0.0,
- double pBulge=0.0) {
- x = px;
- y = py;
- z = pz;
- bulge = pBulge;
- }
-
- /*! X Coordinate of the vertex. */
- double x;
- /*! Y Coordinate of the vertex. */
- double y;
- /*! Z Coordinate of the vertex. */
- double z;
- /*! Bulge of vertex.
- * (The tangent of 1/4 of the arc angle or 0 for lines) */
- double bulge;
-};
-
-
-/**
- * Trace Data / solid data / 3d face data.
- *
- * @author Andrew Mustun
- */
-struct DL_TraceData {
- DL_TraceData() {
- thickness = 0.0;
- for (int i=0; i<4; i++) {
- x[i] = 0.0;
- y[i] = 0.0;
- z[i] = 0.0;
- }
- }
-
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_TraceData(double sx1, double sy1, double sz1,
- double sx2, double sy2, double sz2,
- double sx3, double sy3, double sz3,
- double sx4, double sy4, double sz4,
- double sthickness=0.0) {
-
- thickness = sthickness;
-
- x[0] = sx1;
- y[0] = sy1;
- z[0] = sz1;
-
- x[1] = sx2;
- y[1] = sy2;
- z[1] = sz2;
-
- x[2] = sx3;
- y[2] = sy3;
- z[2] = sz3;
-
- x[3] = sx4;
- y[3] = sy4;
- z[3] = sz4;
- }
-
- /*! Thickness */
- double thickness;
-
- /*! Points */
- double x[4];
- double y[4];
- double z[4];
-};
-
-
-
-
-
-/**
- * Solid Data.
- *
- * @author AHM
- */
-typedef DL_TraceData DL_SolidData;
-
-
-/**
- * 3dface Data.
- */
-typedef DL_TraceData DL_3dFaceData;
-
-
-/**
- * Spline Data.
- *
- * @author Andrew Mustun
- */
-struct DL_SplineData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_SplineData(int pDegree, int pNKnots, int pNControl, int pFlags) {
- degree = pDegree;
- nKnots = pNKnots;
- nControl = pNControl;
- flags = pFlags;
- }
-
- /*! Degree of the spline curve. */
- unsigned int degree;
-
- /*! Number of knots. */
- unsigned int nKnots;
-
- /*! Number of control points. */
- unsigned int nControl;
-
- /*! Flags */
- int flags;
-};
-
-
-
-/**
- * Spline knot data.
- *
- * @author Andrew Mustun
- */
-struct DL_KnotData {
- DL_KnotData() {}
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_KnotData(double pk) {
- k = pk;
- }
-
- /*! Knot value. */
- double k;
-};
-
-
-
-/**
- * Spline control point data.
- *
- * @author Andrew Mustun
- */
-struct DL_ControlPointData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_ControlPointData(double px, double py, double pz) {
- x = px;
- y = py;
- z = pz;
- }
-
- /*! X coordinate of the control point. */
- double x;
- /*! Y coordinate of the control point. */
- double y;
- /*! Z coordinate of the control point. */
- double z;
-};
-
-
-/**
- * Ellipse Data.
- *
- * @author Andrew Mustun
- */
-struct DL_EllipseData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_EllipseData(double ecx, double ecy, double ecz,
- double emx, double emy, double emz,
- double eRatio,
- double eAngle1, double eAngle2) {
-
- cx = ecx;
- cy = ecy;
- cz = ecz;
- mx = emx;
- my = emy;
- mz = emz;
- ratio = eRatio;
- angle1 = eAngle1;
- angle2 = eAngle2;
- }
-
- /*! X Coordinate of center point. */
- double cx;
- /*! Y Coordinate of center point. */
- double cy;
- /*! Z Coordinate of center point. */
- double cz;
-
- /*! X coordinate of the endpoint of the major axis. */
- double mx;
- /*! Y coordinate of the endpoint of the major axis. */
- double my;
- /*! Z coordinate of the endpoint of the major axis. */
- double mz;
-
- /*! Ratio of minor axis to major axis.. */
- double ratio;
- /*! Startangle of ellipse in rad. */
- double angle1;
- /*! Endangle of ellipse in rad. */
- double angle2;
-};
-
-
-
-/**
- * Insert Data.
- *
- * @author Andrew Mustun
- */
-struct DL_InsertData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_InsertData(const string& iName,
- double iipx, double iipy, double iipz,
- double isx, double isy, double isz,
- double iAngle,
- int iCols, int iRows,
- double iColSp, double iRowSp) {
- name = iName;
- ipx = iipx;
- ipy = iipy;
- ipz = iipz;
- sx = isx;
- sy = isy;
- sz = isz;
- angle = iAngle;
- cols = iCols;
- rows = iRows;
- colSp = iColSp;
- rowSp = iRowSp;
- }
-
- /*! Name of the referred block. */
- string name;
- /*! X Coordinate of insertion point. */
- double ipx;
- /*! Y Coordinate of insertion point. */
- double ipy;
- /*! Z Coordinate of insertion point. */
- double ipz;
- /*! X Scale factor. */
- double sx;
- /*! Y Scale factor. */
- double sy;
- /*! Z Scale factor. */
- double sz;
- /*! Rotation angle in rad. */
- double angle;
- /*! Number of colums if we insert an array of the block or 1. */
- int cols;
- /*! Number of rows if we insert an array of the block or 1. */
- int rows;
- /*! Values for the spacing between cols. */
- double colSp;
- /*! Values for the spacing between rows. */
- double rowSp;
-};
-
-
-
-/**
- * MText Data.
- *
- * @author Andrew Mustun
- */
-struct DL_MTextData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_MTextData(double tipx, double tipy, double tipz,
- double tHeight, double tWidth,
- int tAttachmentPoint,
- int tDrawingDirection,
- int tLineSpacingStyle,
- double tLineSpacingFactor,
- const string& tText,
- const string& tStyle,
- double tAngle) {
- ipx = tipx;
- ipy = tipy;
- ipz = tipz;
-
- height = tHeight;
- width = tWidth;
- attachmentPoint = tAttachmentPoint;
- drawingDirection = tDrawingDirection;
- lineSpacingStyle = tLineSpacingStyle;
- lineSpacingFactor = tLineSpacingFactor;
- text = tText;
- style = tStyle;
- angle = tAngle;
- }
-
- /*! X Coordinate of insertion point. */
- double ipx;
- /*! Y Coordinate of insertion point. */
- double ipy;
- /*! Z Coordinate of insertion point. */
- double ipz;
- /*! Text height */
- double height;
- /*! Width of the text box. */
- double width;
- /**
- * Attachment point.
- *
- * 1 = Top left, 2 = Top center, 3 = Top right,
- * 4 = Middle left, 5 = Middle center, 6 = Middle right,
- * 7 = Bottom left, 8 = Bottom center, 9 = Bottom right
- */
- int attachmentPoint;
- /**
- * Drawing direction.
- *
- * 1 = left to right, 3 = top to bottom, 5 = by style
- */
- int drawingDirection;
- /**
- * Line spacing style.
- *
- * 1 = at least, 2 = exact
- */
- int lineSpacingStyle;
- /**
- * Line spacing factor. 0.25 .. 4.0
- */
- double lineSpacingFactor;
- /*! Text string. */
- string text;
- /*! Style string. */
- string style;
- /*! Rotation angle. */
- double angle;
-};
-
-
-
-/**
- * Text Data.
- *
- * @author Andrew Mustun
- */
-struct DL_TextData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_TextData(double tipx, double tipy, double tipz,
- double tapx, double tapy, double tapz,
- double tHeight, double tXScaleFactor,
- int tTextGenerationFlags,
- int tHJustification,
- int tVJustification,
- const string& tText,
- const string& tStyle,
- double tAngle) {
- ipx = tipx;
- ipy = tipy;
- ipz = tipz;
-
- apx = tapx;
- apy = tapy;
- apz = tapz;
-
- height = tHeight;
- xScaleFactor = tXScaleFactor;
- textGenerationFlags = tTextGenerationFlags;
- hJustification = tHJustification;
- vJustification = tVJustification;
- text = tText;
- style = tStyle;
- angle = tAngle;
- }
-
- /*! X Coordinate of insertion point. */
- double ipx;
- /*! Y Coordinate of insertion point. */
- double ipy;
- /*! Z Coordinate of insertion point. */
- double ipz;
-
- /*! X Coordinate of alignment point. */
- double apx;
- /*! Y Coordinate of alignment point. */
- double apy;
- /*! Z Coordinate of alignment point. */
- double apz;
-
- /*! Text height */
- double height;
- /*! Relative X scale factor. */
- double xScaleFactor;
- /*! 0 = default, 2 = Backwards, 4 = Upside down */
- int textGenerationFlags;
- /**
- * Horizontal justification.
- *
- * 0 = Left (default), 1 = Center, 2 = Right,
- * 3 = Aligned, 4 = Middle, 5 = Fit
- * For 3, 4, 5 the vertical alignment has to be 0.
- */
- int hJustification;
- /**
- * Vertical justification.
- *
- * 0 = Baseline (default), 1 = Bottom, 2 = Middle, 3= Top
- */
- int vJustification;
- /*! Text string. */
- string text;
- /*! Style (font). */
- string style;
- /*! Rotation angle of dimension text away from default orientation. */
- double angle;
-};
-
-
-
-/**
- * Generic Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimensionData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimensionData(double ddpx, double ddpy, double ddpz,
- double dmpx, double dmpy, double dmpz,
- int dType,
- int dAttachmentPoint,
- int dLineSpacingStyle,
- double dLineSpacingFactor,
- const string& dText,
- const string& dStyle,
- double dAngle) {
-
- dpx = ddpx;
- dpy = ddpy;
- dpz = ddpz;
-
- mpx = dmpx;
- mpy = dmpy;
- mpz = dmpz;
-
- type = dType;
-
- attachmentPoint = dAttachmentPoint;
- lineSpacingStyle = dLineSpacingStyle;
- lineSpacingFactor = dLineSpacingFactor;
- text = dText;
- style = dStyle;
- angle = dAngle;
- }
-
- /*! X Coordinate of definition point. */
- double dpx;
- /*! Y Coordinate of definition point. */
- double dpy;
- /*! Z Coordinate of definition point. */
- double dpz;
- /*! X Coordinate of middle point of the text. */
- double mpx;
- /*! Y Coordinate of middle point of the text. */
- double mpy;
- /*! Z Coordinate of middle point of the text. */
- double mpz;
- /**
- * Dimension type.
- *
- * 0 Rotated, horizontal, or vertical
- * 1 Aligned
- * 2 Angular
- * 3 Diametric
- * 4 Radius
- * 5 Angular 3-point
- * 6 Ordinate
- * 64 Ordinate type. This is a bit value (bit 7)
- * used only with integer value 6. If set,
- * ordinate is X-type; if not set, ordinate is
- * Y-type
- * 128 This is a bit value (bit 8) added to the
- * other group 70 values if the dimension text
- * has been positioned at a user-defined
- * location rather than at the default location
- */
- int type;
- /**
- * Attachment point.
- *
- * 1 = Top left, 2 = Top center, 3 = Top right,
- * 4 = Middle left, 5 = Middle center, 6 = Middle right,
- * 7 = Bottom left, 8 = Bottom center, 9 = Bottom right,
- */
- int attachmentPoint;
- /**
- * Line spacing style.
- *
- * 1 = at least, 2 = exact
- */
- int lineSpacingStyle;
- /**
- * Line spacing factor. 0.25 .. 4.0
- */
- double lineSpacingFactor;
- /**
- * Text string.
- *
- * Text string entered explicitly by user or null
- * or "<>" for the actual measurement or " " (one blank space).
- * for supressing the text.
- */
- string text;
- /*! Dimension style (font name). */
- string style;
- /**
- * Rotation angle of dimension text away from
- * default orientation.
- */
- double angle;
-};
-
-
-
-/**
- * Aligned Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimAlignedData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimAlignedData(double depx1, double depy1, double depz1,
- double depx2, double depy2, double depz2) {
-
- epx1 = depx1;
- epy1 = depy1;
- epz1 = depz1;
-
- epx2 = depx2;
- epy2 = depy2;
- epz2 = depz2;
- }
-
- /*! X Coordinate of Extension point 1. */
- double epx1;
- /*! Y Coordinate of Extension point 1. */
- double epy1;
- /*! Z Coordinate of Extension point 1. */
- double epz1;
-
- /*! X Coordinate of Extension point 2. */
- double epx2;
- /*! Y Coordinate of Extension point 2. */
- double epy2;
- /*! Z Coordinate of Extension point 2. */
- double epz2;
-};
-
-
-
-/**
- * Linear Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimLinearData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimLinearData(double ddpx1, double ddpy1, double ddpz1,
- double ddpx2, double ddpy2, double ddpz2,
- double dAngle, double dOblique) {
-
- dpx1 = ddpx1;
- dpy1 = ddpy1;
- dpz1 = ddpz1;
-
- dpx2 = ddpx2;
- dpy2 = ddpy2;
- dpz2 = ddpz2;
-
- angle = dAngle;
- oblique = dOblique;
- }
-
- /*! X Coordinate of Extension point 1. */
- double dpx1;
- /*! Y Coordinate of Extension point 1. */
- double dpy1;
- /*! Z Coordinate of Extension point 1. */
- double dpz1;
-
- /*! X Coordinate of Extension point 2. */
- double dpx2;
- /*! Y Coordinate of Extension point 2. */
- double dpy2;
- /*! Z Coordinate of Extension point 2. */
- double dpz2;
-
- /*! Rotation angle (angle of dimension line) in degrees. */
- double angle;
- /*! Oblique angle in degrees. */
- double oblique;
-};
-
-
-
-/**
- * Radial Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimRadialData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimRadialData(double ddpx, double ddpy, double ddpz, double dleader) {
- dpx = ddpx;
- dpy = ddpy;
- dpz = ddpz;
-
- leader = dleader;
- }
-
- /*! X Coordinate of definition point. */
- double dpx;
- /*! Y Coordinate of definition point. */
- double dpy;
- /*! Z Coordinate of definition point. */
- double dpz;
-
- /*! Leader length */
- double leader;
-};
-
-
-
-/**
- * Diametric Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimDiametricData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimDiametricData(double ddpx, double ddpy, double ddpz, double dleader) {
- dpx = ddpx;
- dpy = ddpy;
- dpz = ddpz;
-
- leader = dleader;
- }
-
- /*! X Coordinate of definition point. */
- double dpx;
- /*! Y Coordinate of definition point. */
- double dpy;
- /*! Z Coordinate of definition point. */
- double dpz;
-
- /*! Leader length */
- double leader;
-};
-
-
-
-/**
- * Angular Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimAngularData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimAngularData(double ddpx1, double ddpy1, double ddpz1,
- double ddpx2, double ddpy2, double ddpz2,
- double ddpx3, double ddpy3, double ddpz3,
- double ddpx4, double ddpy4, double ddpz4) {
-
- dpx1 = ddpx1;
- dpy1 = ddpy1;
- dpz1 = ddpz1;
-
- dpx2 = ddpx2;
- dpy2 = ddpy2;
- dpz2 = ddpz2;
-
- dpx3 = ddpx3;
- dpy3 = ddpy3;
- dpz3 = ddpz3;
-
- dpx4 = ddpx4;
- dpy4 = ddpy4;
- dpz4 = ddpz4;
- }
-
- /*! X Coordinate of definition point 1. */
- double dpx1;
- /*! Y Coordinate of definition point 1. */
- double dpy1;
- /*! Z Coordinate of definition point 1. */
- double dpz1;
-
- /*! X Coordinate of definition point 2. */
- double dpx2;
- /*! Y Coordinate of definition point 2. */
- double dpy2;
- /*! Z Coordinate of definition point 2. */
- double dpz2;
-
- /*! X Coordinate of definition point 3. */
- double dpx3;
- /*! Y Coordinate of definition point 3. */
- double dpy3;
- /*! Z Coordinate of definition point 3. */
- double dpz3;
-
- /*! X Coordinate of definition point 4. */
- double dpx4;
- /*! Y Coordinate of definition point 4. */
- double dpy4;
- /*! Z Coordinate of definition point 4. */
- double dpz4;
-};
-
-
-/**
- * Angular Dimension Data (3 points version).
- *
- * @author Andrew Mustun
- */
-struct DL_DimAngular3PData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimAngular3PData(double ddpx1, double ddpy1, double ddpz1,
- double ddpx2, double ddpy2, double ddpz2,
- double ddpx3, double ddpy3, double ddpz3) {
-
- dpx1 = ddpx1;
- dpy1 = ddpy1;
- dpz1 = ddpz1;
-
- dpx2 = ddpx2;
- dpy2 = ddpy2;
- dpz2 = ddpz2;
-
- dpx3 = ddpx3;
- dpy3 = ddpy3;
- dpz3 = ddpz3;
- }
-
- /*! X Coordinate of definition point 1. */
- double dpx1;
- /*! Y Coordinate of definition point 1. */
- double dpy1;
- /*! Z Coordinate of definition point 1. */
- double dpz1;
-
- /*! X Coordinate of definition point 2. */
- double dpx2;
- /*! Y Coordinate of definition point 2. */
- double dpy2;
- /*! Z Coordinate of definition point 2. */
- double dpz2;
-
- /*! X Coordinate of definition point 3. */
- double dpx3;
- /*! Y Coordinate of definition point 3. */
- double dpy3;
- /*! Z Coordinate of definition point 3. */
- double dpz3;
-};
-
-
-
-/**
- * Ordinate Dimension Data.
- *
- * @author Andrew Mustun
- */
-struct DL_DimOrdinateData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_DimOrdinateData(double ddpx1, double ddpy1, double ddpz1,
- double ddpx2, double ddpy2, double ddpz2,
- bool dxtype) {
-
- dpx1 = ddpx1;
- dpy1 = ddpy1;
- dpz1 = ddpz1;
-
- dpx2 = ddpx2;
- dpy2 = ddpy2;
- dpz2 = ddpz2;
-
- xtype = dxtype;
- }
-
- /*! X Coordinate of definition point 1. */
- double dpx1;
- /*! Y Coordinate of definition point 1. */
- double dpy1;
- /*! Z Coordinate of definition point 1. */
- double dpz1;
-
- /*! X Coordinate of definition point 2. */
- double dpx2;
- /*! Y Coordinate of definition point 2. */
- double dpy2;
- /*! Z Coordinate of definition point 2. */
- double dpz2;
-
- /*! True if the dimension indicates the X-value, false for Y-value */
- bool xtype;
-};
-
-
-
-/**
- * Leader (arrow).
- *
- * @author Andrew Mustun
- */
-struct DL_LeaderData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_LeaderData(int lArrowHeadFlag,
- int lLeaderPathType,
- int lLeaderCreationFlag,
- int lHooklineDirectionFlag,
- int lHooklineFlag,
- double lTextAnnotationHeight,
- double lTextAnnotationWidth,
- int lNumber) {
-
- arrowHeadFlag = lArrowHeadFlag;
- leaderPathType = lLeaderPathType;
- leaderCreationFlag = lLeaderCreationFlag;
- hooklineDirectionFlag = lHooklineDirectionFlag;
- hooklineFlag = lHooklineFlag;
- textAnnotationHeight = lTextAnnotationHeight;
- textAnnotationWidth = lTextAnnotationWidth;
- number = lNumber;
- }
-
- /*! Arrow head flag (71). */
- int arrowHeadFlag;
- /*! Leader path type (72). */
- int leaderPathType;
- /*! Leader creation flag (73). */
- int leaderCreationFlag;
- /*! Hookline direction flag (74). */
- int hooklineDirectionFlag;
- /*! Hookline flag (75) */
- int hooklineFlag;
- /*! Text annotation height (40). */
- double textAnnotationHeight;
- /*! Text annotation width (41) */
- double textAnnotationWidth;
- /*! Number of vertices in leader (76). */
- int number;
-};
-
-
-
-/**
- * Leader Vertex Data.
- *
- * @author Andrew Mustun
- */
-struct DL_LeaderVertexData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_LeaderVertexData(double px=0.0, double py=0.0, double pz=0.0) {
- x = px;
- y = py;
- z = pz;
- }
-
- /*! X Coordinate of the vertex. */
- double x;
- /*! Y Coordinate of the vertex. */
- double y;
- /*! Z Coordinate of the vertex. */
- double z;
-};
-
-
-
-/**
- * Hatch data.
- */
-struct DL_HatchData {
- /**
- * Default constructor.
- */
- DL_HatchData() {}
-
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_HatchData(int hNumLoops,
- bool hSolid,
- double hScale,
- double hAngle,
- const string& hPattern) {
- numLoops = hNumLoops;
- solid = hSolid;
- scale = hScale;
- angle = hAngle;
- pattern = hPattern;
- }
-
- /*! Number of boundary paths (loops). */
- int numLoops;
- /*! Solid fill flag (true=solid, false=pattern). */
- bool solid;
- /*! Pattern scale or spacing */
- double scale;
- /*! Pattern angle */
- double angle;
- /*! Pattern name. */
- string pattern;
-};
-
-
-
-/**
- * Hatch boundary path (loop) data.
- */
-struct DL_HatchLoopData {
- /**
- * Default constructor.
- */
- DL_HatchLoopData() {}
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_HatchLoopData(int hNumEdges) {
- numEdges = hNumEdges;
- }
-
- /*! Number of edges in this loop. */
- int numEdges;
-};
-
-
-
-/**
- * Hatch edge data.
- */
-struct DL_HatchEdgeData {
- /**
- * Default constructor.
- */
- DL_HatchEdgeData() {
- defined = false;
- }
-
- /**
- * Constructor for a line edge.
- * Parameters: see member variables.
- */
- DL_HatchEdgeData(double lx1, double ly1,
- double lx2, double ly2) {
- x1 = lx1;
- y1 = ly1;
- x2 = lx2;
- y2 = ly2;
- type = 1;
- defined = true;
- }
-
- /**
- * Constructor for an arc edge.
- * Parameters: see member variables.
- */
- DL_HatchEdgeData(double acx, double acy,
- double aRadius,
- double aAngle1, double aAngle2,
- bool aCcw) {
- cx = acx;
- cy = acy;
- radius = aRadius;
- angle1 = aAngle1;
- angle2 = aAngle2;
- ccw = aCcw;
- type = 2;
- defined = true;
- }
-
- /**
- * Edge type. 1=line, 2=arc.
- */
- int type;
-
- /**
- * Set to true if this edge is fully defined.
- */
- bool defined;
-
- /*! Start point (X). */
- double x1;
- /*! Start point (Y). */
- double y1;
- /*! End point (X). */
- double x2;
- /*! End point (Y). */
- double y2;
- /*! Center point of arc (X). */
- double cx;
- /*! Center point of arc (Y). */
- double cy;
- /*! Arc radius. */
- double radius;
- /*! Start angle. */
- double angle1;
- /*! End angle. */
- double angle2;
- /*! Counterclockwise flag. */
- bool ccw;
-};
-
-
-
-/**
- * Image Data.
- *
- * @author Andrew Mustun
- */
-struct DL_ImageData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_ImageData(const string& iref,
- double iipx, double iipy, double iipz,
- double iux, double iuy, double iuz,
- double ivx, double ivy, double ivz,
- int iwidth, int iheight,
- int ibrightness, int icontrast, int ifade) {
- ref = iref;
- ipx = iipx;
- ipy = iipy;
- ipz = iipz;
- ux = iux;
- uy = iuy;
- uz = iuz;
- vx = ivx;
- vy = ivy;
- vz = ivz;
- width = iwidth;
- height = iheight;
- brightness = ibrightness;
- contrast = icontrast;
- fade = ifade;
- }
-
- /*! Reference to the image file
- (unique, used to refer to the image def object). */
- string ref;
- /*! X Coordinate of insertion point. */
- double ipx;
- /*! Y Coordinate of insertion point. */
- double ipy;
- /*! Z Coordinate of insertion point. */
- double ipz;
- /*! X Coordinate of u vector along bottom of image. */
- double ux;
- /*! Y Coordinate of u vector along bottom of image. */
- double uy;
- /*! Z Coordinate of u vector along bottom of image. */
- double uz;
- /*! X Coordinate of v vector along left side of image. */
- double vx;
- /*! Y Coordinate of v vector along left side of image. */
- double vy;
- /*! Z Coordinate of v vector along left side of image. */
- double vz;
- /*! Width of image in pixel. */
- int width;
- /*! Height of image in pixel. */
- int height;
- /*! Brightness (0..100, default = 50). */
- int brightness;
- /*! Contrast (0..100, default = 50). */
- int contrast;
- /*! Fade (0..100, default = 0). */
- int fade;
-};
-
-
-
-/**
- * Image Definition Data.
- *
- * @author Andrew Mustun
- */
-struct DL_ImageDefData {
- /**
- * Constructor.
- * Parameters: see member variables.
- */
- DL_ImageDefData(const string& iref,
- const string& ifile) {
- ref = iref;
- file = ifile;
- }
-
- /*! Reference to the image file
- (unique, used to refer to the image def object). */
- string ref;
-
- /*! Image file */
- string file;
-};
-
-#endif
-
-// EOF
-
diff --git a/dxflib/src/dl_exception.h b/dxflib/src/dl_exception.h
deleted file mode 100644
index 4a7f4ae..0000000
--- a/dxflib/src/dl_exception.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_EXCEPTION_H
-#define DL_EXCEPTION_H
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-/**
- * Used for exception handling.
- */
-class DL_Exception {}
-;
-
-/**
- * Used for exception handling.
- */
-class DL_NullStrExc : public DL_Exception {}
-;
-
-/**
- * Used for exception handling.
- */
-class DL_GroupCodeExc : public DL_Exception {
- DL_GroupCodeExc(int gc=0) : groupCode(gc) {}
- int groupCode;
-};
-#endif
-
diff --git a/dxflib/src/dl_extrusion.h b/dxflib/src/dl_extrusion.h
deleted file mode 100644
index 65c28a9..0000000
--- a/dxflib/src/dl_extrusion.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_EXTRUSION_H
-#define DL_EXTRUSION_H
-
-#include <math.h>
-
-
-/**
- * Storing and passing around attributes. Attributes
- * are the layer name, color, width and line type.
- *
- * @author Andrew Mustun
- */
-class DL_Extrusion {
-
-public:
-
- /**
- * Default constructor.
- */
- DL_Extrusion() {
- direction = new double[3];
- setDirection(0.0, 0.0, 1.0);
- setElevation(0.0);
- }
-
-
- /**
- * Destructor.
- */
- ~DL_Extrusion() {
- delete direction ;
- }
-
-
- /**
- * Constructor for DXF extrusion.
- *
- * @param direction Vector of axis along which the entity shall be extruded
- * this is also the Z axis of the Entity coordinate system
- * @param elevation Distance of the entities XY plane from the origin of the
- * world coordinate system
- */
- DL_Extrusion(double dx, double dy, double dz, double elevation) {
- direction = new double[3];
- setDirection(dx, dy, dz);
- setElevation(elevation);
- }
-
-
-
- /**
- * Sets the direction vector.
- */
- void setDirection(double dx, double dy, double dz) {
- direction[0]=dx;
- direction[1]=dy;
- direction[2]=dz;
- }
-
-
-
- /**
- * @return direction vector.
- */
- double* getDirection() const {
- return direction;
- }
-
-
-
- /**
- * @return direction vector.
- */
- void getDirection(double dir[]) const {
- dir[0]=direction[0];
- dir[1]=direction[1];
- dir[2]=direction[2];
- }
-
-
-
- /**
- * Sets the elevation.
- */
- void setElevation(double elevation) {
- this->elevation = elevation;
- }
-
-
-
- /**
- * @return Elevation.
- */
- double getElevation() const {
- return elevation;
- }
-
-
-
- /**
- * Copies extrusion (deep copies) from another extrusion object.
- */
- DL_Extrusion operator = (const DL_Extrusion& extru) {
- setDirection(extru.direction[0], extru.direction[1], extru.direction[2]);
- setElevation(extru.elevation);
-
- return *this;
- }
-
-
-
-private:
- double *direction;
- double elevation;
-};
-
-#endif
-
diff --git a/dxflib/src/dl_writer.h b/dxflib/src/dl_writer.h
deleted file mode 100644
index baf1607..0000000
--- a/dxflib/src/dl_writer.h
+++ /dev/null
@@ -1,614 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_WRITER_H
-#define DL_WRITER_H
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#if defined(__OS2__)||defined(__EMX__)||defined(_WIN32)
-#define strcasecmp(s,t) stricmp(s,t)
-#endif
-
-#include <iostream>
-#include <cstring>
-
-#include "dl_attributes.h"
-#include "dl_codes.h"
-
-
-
-/**
- * Defines interface for writing low level DXF constructs to
- * a file. Implementation is defined in derived classes that write
- * to binary or ASCII files.
- *
- * Implements functions that write higher level constructs in terms of
- * the low level ones.
- *
- * @todo Add error checking for string/entry length.
- */
-class DL_Writer {
-public:
- /**
- * @para version DXF version. Defaults to VER_2002.
- */
- DL_Writer(DL_Codes::version version) : m_handle(0x30) {
- this->version = version;
- modelSpaceHandle = 0;
- paperSpaceHandle = 0;
- paperSpace0Handle = 0;
- }
-
- virtual ~DL_Writer() {}
- ;
-
- /** Generic section for section 'name'.
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * name
- * </pre>
- */
- void section(const char* name) const {
- dxfString(0, "SECTION");
- dxfString(2, name);
- }
-
- /**
- * Section HEADER
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * HEADER
- * </pre>
- */
- void sectionHeader() const {
- section("HEADER");
- }
-
- /**
- * Section TABLES
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * TABLES
- * </pre>
- */
- void sectionTables() const {
- section("TABLES");
- }
-
- /**
- * Section BLOCKS
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * BLOCKS
- * </pre>
- */
- void sectionBlocks() const {
- section("BLOCKS");
- }
-
- /**
- * Section ENTITIES
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * ENTITIES
- * </pre>
- */
- void sectionEntities() const {
- section("ENTITIES");
- }
-
- /**
- * Section CLASSES
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * CLASSES
- * </pre>
- */
- void sectionClasses() const {
- section("CLASSES");
- }
-
- /**
- * Section OBJECTS
- *
- * <pre>
- * 0
- * SECTION
- * 2
- * OBJECTS
- * </pre>
- */
- void sectionObjects() const {
- section("OBJECTS");
- }
-
- /**
- * End of a section.
- *
- * <pre>
- * 0
- * ENDSEC
- * </pre>
- */
- void sectionEnd() const {
- dxfString(0, "ENDSEC");
- }
-
- /**
- * Generic table for table 'name' with 'num' entries:
- *
- * <pre>
- * 0
- * TABLE
- * 2
- * name
- * 70
- * num
- * </pre>
- */
- void table(const char* name, int num, int handle) const {
- dxfString(0, "TABLE");
- dxfString(2, name);
- if (version>=VER_2000) {
- dxfHex(5, handle);
- dxfString(100, "AcDbSymbolTable");
- }
- dxfInt(70, num);
- }
-
- /** Table for layers.
- *
- * @param num Number of layers in total.
- *
- * <pre>
- * 0
- * TABLE
- * 2
- * LAYER
- * 70
- * num
- * </pre>
- */
- void tableLayers(int num) const {
- table("LAYER", num, 2);
- }
-
- /** Table for line types.
- *
- * @param num Number of line types in total.
- *
- * <pre>
- * 0
- * TABLE
- * 2
- * LTYPE
- * 70
- * num
- * </pre>
- */
- void tableLineTypes(int num) const {
- //lineTypeHandle = 5;
- table("LTYPE", num, 5);
- }
-
- /** Table for application id.
- *
- * @param num Number of registered applications in total.
- *
- * <pre>
- * 0
- * TABLE
- * 2
- * APPID
- * 70
- * num
- * </pre>
- */
- void tableAppid(int num) const {
- table("APPID", num, 9);
- }
-
- /**
- * End of a table.
- *
- * <pre>
- * 0
- * ENDTAB
- * </pre>
- */
- void tableEnd() const {
- dxfString(0, "ENDTAB");
- }
-
- /**
- * End of the DXF file.
- *
- * <pre>
- * 0
- * EOF
- * </pre>
- */
- void dxfEOF() const {
- dxfString(0, "EOF");
- }
-
- /**
- * Comment.
- *
- * <pre>
- * 999
- * text
- * </pre>
- */
- void comment(const char* text) const {
- dxfString(999, text);
- }
-
- /**
- * Entity.
- *
- * <pre>
- * 0
- * entTypeName
- * </pre>
- *
- * @return Unique handle or 0.
- */
- void entity(const char* entTypeName) const {
- dxfString(0, entTypeName);
- if (version>=VER_2000) {
- handle();
- }
- }
-
- /**
- * Attributes of an entity.
- *
- * <pre>
- * 8
- * layer
- * 62
- * color
- * 39
- * width
- * 6
- * linetype
- * </pre>
- */
- void entityAttributes(const DL_Attributes& attrib) const {
-
- // layer name:
- dxfString(8, attrib.getLayer());
-
- // R12 doesn't accept BYLAYER values. The value has to be missing
- // in that case.
- if (version>=VER_2000 ||
- attrib.getColor()!=256) {
- dxfInt(62, attrib.getColor());
- }
- if (version>=VER_2000) {
- dxfInt(370, attrib.getWidth());
- }
- if (version>=VER_2000 ||
- strcasecmp(attrib.getLineType().c_str(), "BYLAYER")) {
- dxfString(6, attrib.getLineType());
- }
- }
-
- /**
- * Subclass.
- */
- void subClass(const char* sub) const {
- dxfString(100, sub);
- }
-
- /**
- * Layer (must be in the TABLES section LAYER).
- *
- * <pre>
- * 0
- * LAYER
- * </pre>
- */
- void tableLayerEntry(unsigned long int h=0) const {
- dxfString(0, "LAYER");
- if (version>=VER_2000) {
- if (h==0) {
- handle();
- } else {
- dxfHex(5, h);
- }
- dxfString(100, "AcDbSymbolTableRecord");
- dxfString(100, "AcDbLayerTableRecord");
- }
- }
-
- /**
- * Line type (must be in the TABLES section LTYPE).
- *
- * <pre>
- * 0
- * LTYPE
- * </pre>
- */
- void tableLineTypeEntry(unsigned long int h=0) const {
- dxfString(0, "LTYPE");
- if (version>=VER_2000) {
- if (h==0) {
- handle();
- } else {
- dxfHex(5, h);
- }
- //dxfHex(330, 0x5);
- dxfString(100, "AcDbSymbolTableRecord");
- dxfString(100, "AcDbLinetypeTableRecord");
- }
- }
-
- /**
- * Appid (must be in the TABLES section APPID).
- *
- * <pre>
- * 0
- * APPID
- * </pre>
- */
- void tableAppidEntry(unsigned long int h=0) const {
- dxfString(0, "APPID");
- if (version>=VER_2000) {
- if (h==0) {
- handle();
- } else {
- dxfHex(5, h);
- }
- //dxfHex(330, 0x9);
- dxfString(100, "AcDbSymbolTableRecord");
- dxfString(100, "AcDbRegAppTableRecord");
- }
- }
-
- /**
- * Block (must be in the section BLOCKS).
- *
- * <pre>
- * 0
- * BLOCK
- * </pre>
- */
- void sectionBlockEntry(unsigned long int h=0) const {
- dxfString(0, "BLOCK");
- if (version>=VER_2000) {
- if (h==0) {
- handle();
- } else {
- dxfHex(5, h);
- }
- //dxfHex(330, blockHandle);
- dxfString(100, "AcDbEntity");
- if (h==0x1C) {
- dxfInt(67, 1);
- }
- dxfString(8, "0"); // TODO: Layer for block
- dxfString(100, "AcDbBlockBegin");
- }
- }
-
- /**
- * End of Block (must be in the section BLOCKS).
- *
- * <pre>
- * 0
- * ENDBLK
- * </pre>
- */
- void sectionBlockEntryEnd(unsigned long int h=0) const {
- dxfString(0, "ENDBLK");
- if (version>=VER_2000) {
- if (h==0) {
- handle();
- } else {
- dxfHex(5, h);
- }
- //dxfHex(330, blockHandle);
- dxfString(100, "AcDbEntity");
- if (h==0x1D) {
- dxfInt(67, 1);
- }
- dxfString(8, "0"); // TODO: Layer for block
- dxfString(100, "AcDbBlockEnd");
- }
- }
-
- void color(int col=256) const {
- dxfInt(62, col);
- }
- void lineType(const char *lt) const {
- dxfString(6, lt);
- }
- void lineTypeScale(double scale) const {
- dxfReal(48, scale);
- }
- void lineWeight(int lw) const {
- dxfInt(370, lw);
- }
-
- void coord(int gc, double x, double y, double z=0) const {
- dxfReal(gc, x);
- dxfReal(gc+10, y);
- dxfReal(gc+20, z);
- }
-
- void coordTriplet(int gc, const double* value) const {
- if (value) {
- dxfReal(gc, *value++);
- dxfReal(gc+10, *value++);
- dxfReal(gc+20, *value++);
- }
- }
-
- void resetHandle() const {
- m_handle = 1;
- }
-
- /**
- * Writes a unique handle and returns it.
- */
- unsigned long handle(int gc=5) const {
- // handle has to be hex
- dxfHex(gc, m_handle);
- return m_handle++;
- }
-
- /**
- * @return Next handle that will be written.
- */
- unsigned long getNextHandle() const {
- return m_handle;
- }
-
- /**
- * Increases handle, so that the handle returned remains available.
- */
- unsigned long incHandle() const {
- return m_handle++;
- }
-
- /**
- * Sets the handle of the model space. Entities refer to
- * this handle.
- */
- void setModelSpaceHandle(unsigned long h) {
- modelSpaceHandle = h;
- }
-
- unsigned long getModelSpaceHandle() {
- return modelSpaceHandle;
- }
-
- /**
- * Sets the handle of the paper space. Some special blocks refer to
- * this handle.
- */
- void setPaperSpaceHandle(unsigned long h) {
- paperSpaceHandle = h;
- }
-
- unsigned long getPaperSpaceHandle() {
- return paperSpaceHandle;
- }
-
- /**
- * Sets the handle of the paper space 0. Some special blocks refer to
- * this handle.
- */
- void setPaperSpace0Handle(unsigned long h) {
- paperSpace0Handle = h;
- }
-
- unsigned long getPaperSpace0Handle() {
- return paperSpace0Handle;
- }
-
- /**
- * Must be overwritten by the implementing class to write a
- * real value to the file.
- *
- * @param gc Group code.
- * @param value The real value.
- */
- virtual void dxfReal(int gc, double value) const = 0;
-
- /**
- * Must be overwritten by the implementing class to write an
- * int value to the file.
- *
- * @param gc Group code.
- * @param value The int value.
- */
- virtual void dxfInt(int gc, int value) const = 0;
-
- /**
- * Must be overwritten by the implementing class to write an
- * int value (hex) to the file.
- *
- * @param gc Group code.
- * @param value The int value.
- */
- virtual void dxfHex(int gc, int value) const = 0;
-
- /**
- * Must be overwritten by the implementing class to write a
- * string to the file.
- *
- * @param gc Group code.
- * @param value The string.
- */
- virtual void dxfString(int gc, const char* value) const = 0;
-
- /**
- * Must be overwritten by the implementing class to write a
- * string to the file.
- *
- * @param gc Group code.
- * @param value The string.
- */
- virtual void dxfString(int gc, const string& value) const = 0;
-
-protected:
- mutable unsigned long m_handle;
- mutable unsigned long modelSpaceHandle;
- mutable unsigned long paperSpaceHandle;
- mutable unsigned long paperSpace0Handle;
-
- /**
- * DXF version to be created.
- */
- DL_Codes::version version;
-private:
-};
-
-#endif
diff --git a/dxflib/src/dl_writer_ascii.cpp b/dxflib/src/dl_writer_ascii.cpp
deleted file mode 100644
index 5b29f2b..0000000
--- a/dxflib/src/dl_writer_ascii.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#include <stdio.h>
-
-#include "dl_writer_ascii.h"
-#include "dl_exception.h"
-
-
-/**
- * Closes the output file.
- */
-void DL_WriterA::close() const {
- m_ofile.close();
-}
-
-
-/**
- * @retval true Opening file has failed.
- * @retval false Otherwise.
- */
-bool DL_WriterA::openFailed() const {
- return m_ofile.fail();
-}
-
-
-
-/**
- * Writes a real (double) variable to the DXF file.
- *
- * @param gc Group code.
- * @param value Double value
- */
-void DL_WriterA::dxfReal(int gc, double value) const {
- char str[256];
- sprintf(str, "%.16lf", value);
-
- // fix for german locale:
- strReplace(str, ',', '.');
-
- // Cut away those zeros at the end:
- bool dot = false;
- int end = -1;
- for (unsigned int i=0; i<strlen(str); ++i) {
- if (str[i]=='.') {
- dot = true;
- end = i+2;
- continue;
- } else if (dot && str[i]!='0') {
- end = i+1;
- }
- }
- if (end>0 && end<(int)strlen(str)) {
- str[end] = '\0';
- }
-
- dxfString(gc, str);
- m_ofile.flush();
-}
-
-
-
-/**
- * Writes an int variable to the DXF file.
- *
- * @param gc Group code.
- * @param value Int value
- */
-void DL_WriterA::dxfInt(int gc, int value) const {
- m_ofile << (gc<10 ? " " : (gc<100 ? " " : "")) << gc << "\n"
- << value << "\n";
-}
-
-
-
-/**
- * Writes a hex int variable to the DXF file.
- *
- * @param gc Group code.
- * @param value Int value
- */
-void DL_WriterA::dxfHex(int gc, int value) const {
- char str[12];
- sprintf(str, "%0X", value);
- dxfString(gc, str);
-}
-
-
-
-/**
- * Writes a string variable to the DXF file.
- *
- * @param gc Group code.
- * @param value String
- */
-void DL_WriterA::dxfString(int gc, const char* value) const {
- if (value==NULL) {
-#ifndef __GCC2x__
- //throw DL_NullStrExc();
-#endif
- }
- m_ofile << (gc<10 ? " " : (gc<100 ? " " : "")) << gc << "\n"
- << value << "\n";
-}
-
-
-
-void DL_WriterA::dxfString(int gc, const string& value) const {
- m_ofile << (gc<10 ? " " : (gc<100 ? " " : "")) << gc << "\n"
- << value << "\n";
-}
-
-
-/**
- * Replaces every occurence of src with dest in the null terminated str.
- */
-void DL_WriterA::strReplace(char* str, char src, char dest) {
- size_t i;
- for (i=0; i<strlen(str); i++) {
- if (str[i]==src) {
- str[i] = dest;
- }
- }
-}
-
diff --git a/dxflib/src/dl_writer_ascii.h b/dxflib/src/dl_writer_ascii.h
deleted file mode 100644
index bdedc29..0000000
--- a/dxflib/src/dl_writer_ascii.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-#ifndef DL_WRITER_ASCII_H
-#define DL_WRITER_ASCII_H
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#include "dl_writer.h"
-#include <fstream>
-#include <string>
-using std::string;
-
-/**
- * Implements functions defined in DL_Writer for writing low
- * level DXF constructs to an ASCII format DXF file.
- *
- * @para fname File name of the file to be created.
- * @para version DXF version. Defaults to VER_2002.
- *
- * @todo What if \c fname is NULL? Or \c fname can't be opened for
- * another reason?
- */
-class DL_WriterA : public DL_Writer {
-public:
- DL_WriterA(const char* fname, DL_Codes::version version=VER_2000)
- : DL_Writer(version), m_ofile(fname) {}
- virtual ~DL_WriterA() {}
-
- bool openFailed() const;
- void close() const;
- void dxfReal(int gc, double value) const;
- void dxfInt(int gc, int value) const;
- void dxfHex(int gc, int value) const;
- void dxfString(int gc, const char* value) const;
- void dxfString(int gc, const string& value) const;
-
- static void strReplace(char* str, char src, char dest);
-
-private:
- /**
- * DXF file to be created.
- */
- mutable std::ofstream m_ofile;
-
-};
-
-#endif
-
diff --git a/dxflib/test/3dface.dxf b/dxflib/test/3dface.dxf
deleted file mode 100644
index 64f8080..0000000
--- a/dxflib/test/3dface.dxf
+++ /dev/null
@@ -1,4530 +0,0 @@
- 0
-SECTION
- 2
-HEADER
- 9
-$ACADVER
- 1
-AC1021
- 9
-$ACADMAINTVER
- 70
- 1
- 9
-$DWGCODEPAGE
- 3
-ANSI_1252
- 9
-$LASTSAVEDBY
- 1
-andrew
- 9
-$INSBASE
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$EXTMIN
- 10
--36.59419456832821
- 20
--17.88991718957403
- 30
-0.0
- 9
-$EXTMAX
- 10
-40.80478795905428
- 20
-46.80141047493238
- 30
-0.0
- 9
-$LIMMIN
- 10
-0.0
- 20
-0.0
- 9
-$LIMMAX
- 10
-12.0
- 20
-9.0
- 9
-$ORTHOMODE
- 70
- 0
- 9
-$REGENMODE
- 70
- 1
- 9
-$FILLMODE
- 70
- 1
- 9
-$QTEXTMODE
- 70
- 0
- 9
-$MIRRTEXT
- 70
- 0
- 9
-$LTSCALE
- 40
-1.0
- 9
-$ATTMODE
- 70
- 1
- 9
-$TEXTSIZE
- 40
-0.2
- 9
-$TRACEWID
- 40
-0.05
- 9
-$TEXTSTYLE
- 7
-Standard
- 9
-$CLAYER
- 8
-0
- 9
-$CELTYPE
- 6
-ByLayer
- 9
-$CECOLOR
- 62
- 256
- 9
-$CELTSCALE
- 40
-1.0
- 9
-$DISPSILH
- 70
- 0
- 9
-$DIMSCALE
- 40
-1.0
- 9
-$DIMASZ
- 40
-0.18
- 9
-$DIMEXO
- 40
-0.0625
- 9
-$DIMDLI
- 40
-0.38
- 9
-$DIMRND
- 40
-0.0
- 9
-$DIMDLE
- 40
-0.0
- 9
-$DIMEXE
- 40
-0.18
- 9
-$DIMTP
- 40
-0.0
- 9
-$DIMTM
- 40
-0.0
- 9
-$DIMTXT
- 40
-0.18
- 9
-$DIMCEN
- 40
-0.09
- 9
-$DIMTSZ
- 40
-0.0
- 9
-$DIMTOL
- 70
- 0
- 9
-$DIMLIM
- 70
- 0
- 9
-$DIMTIH
- 70
- 1
- 9
-$DIMTOH
- 70
- 1
- 9
-$DIMSE1
- 70
- 0
- 9
-$DIMSE2
- 70
- 0
- 9
-$DIMTAD
- 70
- 0
- 9
-$DIMZIN
- 70
- 0
- 9
-$DIMBLK
- 1
-
- 9
-$DIMASO
- 70
- 1
- 9
-$DIMSHO
- 70
- 1
- 9
-$DIMPOST
- 1
-
- 9
-$DIMAPOST
- 1
-
- 9
-$DIMALT
- 70
- 0
- 9
-$DIMALTD
- 70
- 2
- 9
-$DIMALTF
- 40
-25.4
- 9
-$DIMLFAC
- 40
-1.0
- 9
-$DIMTOFL
- 70
- 0
- 9
-$DIMTVP
- 40
-0.0
- 9
-$DIMTIX
- 70
- 0
- 9
-$DIMSOXD
- 70
- 0
- 9
-$DIMSAH
- 70
- 0
- 9
-$DIMBLK1
- 1
-
- 9
-$DIMBLK2
- 1
-
- 9
-$DIMSTYLE
- 2
-Standard
- 9
-$DIMCLRD
- 70
- 0
- 9
-$DIMCLRE
- 70
- 0
- 9
-$DIMCLRT
- 70
- 0
- 9
-$DIMTFAC
- 40
-1.0
- 9
-$DIMGAP
- 40
-0.09
- 9
-$DIMJUST
- 70
- 0
- 9
-$DIMSD1
- 70
- 0
- 9
-$DIMSD2
- 70
- 0
- 9
-$DIMTOLJ
- 70
- 1
- 9
-$DIMTZIN
- 70
- 0
- 9
-$DIMALTZ
- 70
- 0
- 9
-$DIMALTTZ
- 70
- 0
- 9
-$DIMUPT
- 70
- 0
- 9
-$DIMDEC
- 70
- 4
- 9
-$DIMTDEC
- 70
- 4
- 9
-$DIMALTU
- 70
- 2
- 9
-$DIMALTTD
- 70
- 2
- 9
-$DIMTXSTY
- 7
-Standard
- 9
-$DIMAUNIT
- 70
- 0
- 9
-$DIMADEC
- 70
- 0
- 9
-$DIMALTRND
- 40
-0.0
- 9
-$DIMAZIN
- 70
- 0
- 9
-$DIMDSEP
- 70
- 46
- 9
-$DIMATFIT
- 70
- 3
- 9
-$DIMFRAC
- 70
- 0
- 9
-$DIMLDRBLK
- 1
-
- 9
-$DIMLUNIT
- 70
- 2
- 9
-$DIMLWD
- 70
- -2
- 9
-$DIMLWE
- 70
- -2
- 9
-$DIMTMOVE
- 70
- 0
- 9
-$DIMFXL
- 40
-1.0
- 9
-$DIMFXLON
- 70
- 0
- 9
-$DIMJOGANG
- 40
-0.7853981633974483
- 9
-$DIMTFILL
- 70
- 0
- 9
-$DIMTFILLCLR
- 70
- 0
- 9
-$DIMARCSYM
- 70
- 0
- 9
-$DIMLTYPE
- 6
-
- 9
-$DIMLTEX1
- 6
-
- 9
-$DIMLTEX2
- 6
-
- 9
-$LUNITS
- 70
- 2
- 9
-$LUPREC
- 70
- 4
- 9
-$SKETCHINC
- 40
-0.1
- 9
-$FILLETRAD
- 40
-0.0
- 9
-$AUNITS
- 70
- 0
- 9
-$AUPREC
- 70
- 0
- 9
-$MENU
- 1
-.
- 9
-$ELEVATION
- 40
-0.0
- 9
-$PELEVATION
- 40
-0.0
- 9
-$THICKNESS
- 40
-0.0
- 9
-$LIMCHECK
- 70
- 0
- 9
-$CHAMFERA
- 40
-0.0
- 9
-$CHAMFERB
- 40
-0.0
- 9
-$CHAMFERC
- 40
-0.0
- 9
-$CHAMFERD
- 40
-0.0
- 9
-$SKPOLY
- 70
- 0
- 9
-$TDCREATE
- 40
-2454501.822612246
- 9
-$TDUCREATE
- 40
-2454501.780945579
- 9
-$TDUPDATE
- 40
-2454501.823706713
- 9
-$TDUUPDATE
- 40
-2454501.782040046
- 9
-$TDINDWG
- 40
-0.0010966435
- 9
-$TDUSRTIMER
- 40
-0.0010964583
- 9
-$USRTIMER
- 70
- 1
- 9
-$ANGBASE
- 50
-0.0
- 9
-$ANGDIR
- 70
- 0
- 9
-$PDMODE
- 70
- 0
- 9
-$PDSIZE
- 40
-0.0
- 9
-$PLINEWID
- 40
-0.0
- 9
-$SPLFRAME
- 70
- 0
- 9
-$SPLINETYPE
- 70
- 6
- 9
-$SPLINESEGS
- 70
- 8
- 9
-$HANDSEED
- 5
-12F
- 9
-$SURFTAB1
- 70
- 6
- 9
-$SURFTAB2
- 70
- 6
- 9
-$SURFTYPE
- 70
- 6
- 9
-$SURFU
- 70
- 6
- 9
-$SURFV
- 70
- 6
- 9
-$UCSBASE
- 2
-
- 9
-$UCSNAME
- 2
-
- 9
-$UCSORG
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSXDIR
- 10
-1.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSYDIR
- 10
-0.0
- 20
-1.0
- 30
-0.0
- 9
-$UCSORTHOREF
- 2
-
- 9
-$UCSORTHOVIEW
- 70
- 0
- 9
-$UCSORGTOP
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSORGBOTTOM
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSORGLEFT
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSORGRIGHT
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSORGFRONT
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSORGBACK
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSBASE
- 2
-
- 9
-$PUCSNAME
- 2
-
- 9
-$PUCSORG
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSXDIR
- 10
-1.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSYDIR
- 10
-0.0
- 20
-1.0
- 30
-0.0
- 9
-$PUCSORTHOREF
- 2
-
- 9
-$PUCSORTHOVIEW
- 70
- 0
- 9
-$PUCSORGTOP
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSORGBOTTOM
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSORGLEFT
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSORGRIGHT
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSORGFRONT
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSORGBACK
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$USERI1
- 70
- 0
- 9
-$USERI2
- 70
- 0
- 9
-$USERI3
- 70
- 0
- 9
-$USERI4
- 70
- 0
- 9
-$USERI5
- 70
- 0
- 9
-$USERR1
- 40
-0.0
- 9
-$USERR2
- 40
-0.0
- 9
-$USERR3
- 40
-0.0
- 9
-$USERR4
- 40
-0.0
- 9
-$USERR5
- 40
-0.0
- 9
-$WORLDVIEW
- 70
- 1
- 9
-$SHADEDGE
- 70
- 3
- 9
-$SHADEDIF
- 70
- 70
- 9
-$TILEMODE
- 70
- 1
- 9
-$MAXACTVP
- 70
- 64
- 9
-$PINSBASE
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PLIMCHECK
- 70
- 0
- 9
-$PEXTMIN
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PEXTMAX
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PLIMMIN
- 10
-0.0
- 20
-0.0
- 9
-$PLIMMAX
- 10
-12.0
- 20
-9.0
- 9
-$UNITMODE
- 70
- 0
- 9
-$VISRETAIN
- 70
- 1
- 9
-$PLINEGEN
- 70
- 0
- 9
-$PSLTSCALE
- 70
- 1
- 9
-$TREEDEPTH
- 70
- 3020
- 9
-$CMLSTYLE
- 2
-Standard
- 9
-$CMLJUST
- 70
- 0
- 9
-$CMLSCALE
- 40
-1.0
- 9
-$PROXYGRAPHICS
- 70
- 1
- 9
-$MEASUREMENT
- 70
- 0
- 9
-$CELWEIGHT
-370
- -1
- 9
-$ENDCAPS
-280
- 0
- 9
-$JOINSTYLE
-280
- 0
- 9
-$LWDISPLAY
-290
- 0
- 9
-$INSUNITS
- 70
- 1
- 9
-$HYPERLINKBASE
- 1
-
- 9
-$STYLESHEET
- 1
-
- 9
-$XEDIT
-290
- 1
- 9
-$CEPSNTYPE
-380
- 0
- 9
-$PSTYLEMODE
-290
- 1
- 9
-$FINGERPRINTGUID
- 2
-{76F4A6BE-A89B-4090-8317-DCCF119D6529}
- 9
-$VERSIONGUID
- 2
-{62B51296-D9AD-44CA-89AE-3BE005C1EDEE}
- 9
-$EXTNAMES
-290
- 1
- 9
-$PSVPSCALE
- 40
-0.0
- 9
-$OLESTARTUP
-290
- 0
- 9
-$SORTENTS
-280
- 127
- 9
-$INDEXCTL
-280
- 0
- 9
-$HIDETEXT
-280
- 1
- 9
-$XCLIPFRAME
-290
- 0
- 9
-$HALOGAP
-280
- 0
- 9
-$OBSCOLOR
- 70
- 257
- 9
-$OBSLTYPE
-280
- 0
- 9
-$INTERSECTIONDISPLAY
-280
- 0
- 9
-$INTERSECTIONCOLOR
- 70
- 257
- 9
-$DIMASSOC
-280
- 2
- 9
-$PROJECTNAME
- 1
-
- 9
-$CAMERADISPLAY
-290
- 0
- 9
-$LENSLENGTH
- 40
-50.0
- 9
-$CAMERAHEIGHT
- 40
-0.0
- 9
-$STEPSPERSEC
- 40
-2.0
- 9
-$STEPSIZE
- 40
-6.0
- 9
-$3DDWFPREC
- 40
-2.0
- 9
-$PSOLWIDTH
- 40
-0.25
- 9
-$PSOLHEIGHT
- 40
-4.0
- 9
-$LOFTANG1
- 40
-1.570796326794896
- 9
-$LOFTANG2
- 40
-1.570796326794896
- 9
-$LOFTMAG1
- 40
-0.0
- 9
-$LOFTMAG2
- 40
-0.0
- 9
-$LOFTPARAM
- 70
- 7
- 9
-$LOFTNORMALS
-280
- 1
- 9
-$LATITUDE
- 40
-37.795
- 9
-$LONGITUDE
- 40
--122.394
- 9
-$NORTHDIRECTION
- 40
-0.0
- 9
-$TIMEZONE
- 70
- -8000
- 9
-$LIGHTGLYPHDISPLAY
-280
- 1
- 9
-$TILEMODELIGHTSYNCH
-280
- 1
- 9
-$CMATERIAL
-347
-96
- 9
-$SOLIDHIST
-280
- 1
- 9
-$SHOWHIST
-280
- 1
- 9
-$DWFFRAME
-280
- 2
- 9
-$DGNFRAME
-280
- 0
- 9
-$REALWORLDSCALE
-290
- 1
- 9
-$INTERFERECOLOR
- 62
- 1
- 9
-$INTERFEREOBJVS
-345
-A3
- 9
-$INTERFEREVPVS
-346
-A0
- 9
-$CSHADOW
-280
- 0
- 9
-$SHADOWPLANELOCATION
- 40
-0.0
- 0
-ENDSEC
- 0
-SECTION
- 2
-CLASSES
- 0
-CLASS
- 1
-ACDBDICTIONARYWDFLT
- 2
-AcDbDictionaryWithDefault
- 3
-ObjectDBX Classes
- 90
- 0
- 91
- 1
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-DICTIONARYVAR
- 2
-AcDbDictionaryVar
- 3
-ObjectDBX Classes
- 90
- 0
- 91
- 3
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-TABLESTYLE
- 2
-AcDbTableStyle
- 3
-ObjectDBX Classes
- 90
- 4095
- 91
- 1
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-MATERIAL
- 2
-AcDbMaterial
- 3
-ObjectDBX Classes
- 90
- 1024
- 91
- 3
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-VISUALSTYLE
- 2
-AcDbVisualStyle
- 3
-ObjectDBX Classes
- 90
- 4095
- 91
- 17
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-GRADIENT_BACKGROUND
- 2
-AcDbGroundPlaneBackground
- 3
-SCENEOE
- 90
- 4095
- 91
- 1
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-NPOCOLLECTION
- 2
-AcDbImpNonPersistentObjectsCollection
- 3
-ObjectDBX Classes
- 90
- 1153
- 91
- 1
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-ACSH_CONE_CLASS
- 2
-AcDbShCone
- 3
-ObjectDBX Classes
- 90
- 1153
- 91
- 0
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-ACAD_EVALUATION_GRAPH
- 2
-AcDbEvalGraph
- 3
-ObjectDBX Classes
- 90
- 1153
- 91
- 0
-280
- 0
-281
- 0
- 0
-CLASS
- 1
-ACSH_HISTORY_CLASS
- 2
-AcDbShHistory
- 3
-ObjectDBX Classes
- 90
- 1153
- 91
- 0
-280
- 0
-281
- 0
- 0
-ENDSEC
- 0
-SECTION
- 2
-TABLES
- 0
-TABLE
- 2
-VPORT
- 5
-8
-330
-0
-100
-AcDbSymbolTable
- 70
- 1
- 0
-VPORT
- 5
-94
-330
-8
-100
-AcDbSymbolTableRecord
-100
-AcDbViewportTableRecord
- 2
-*Active
- 70
- 0
- 10
-0.0
- 20
-0.0
- 11
-1.0
- 21
-1.0
- 12
-0.0
- 22
-0.0
- 13
-0.0
- 23
-0.0
- 14
-0.5
- 24
-0.5
- 15
-0.5
- 25
-0.5
- 16
-100.4213819927291
- 26
--66.94758799515259
- 36
-46.86331159660684
- 17
-4.195187165775401
- 27
-5.703208556149733
- 37
--0.8422459893048126
- 40
-47.29246003833438
- 41
-2.070821529745042
- 42
-50.0
- 43
-0.0
- 44
-0.0
- 50
-0.0
- 51
-0.0000000000000386
- 71
- 1
- 72
- 1000
- 73
- 1
- 74
- 3
- 75
- 0
- 76
- 1
- 77
- 0
- 78
- 0
-281
- 6
- 65
- 1
-110
-0.0
-120
-0.0
-130
-0.0
-111
-1.0
-121
-0.0
-131
-0.0
-112
-0.0
-122
-1.0
-132
-0.0
- 79
- 0
-146
-0.0
-348
-A3
- 60
- 3
- 61
- 5
-292
- 1
-282
- 1
-141
-0.0
-142
-0.0
- 63
- 250
-421
- 3355443
- 0
-ENDTAB
- 0
-TABLE
- 2
-LTYPE
- 5
-5
-330
-0
-100
-AcDbSymbolTable
- 70
- 1
- 0
-LTYPE
- 5
-14
-330
-5
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-ByBlock
- 70
- 0
- 3
-
- 72
- 65
- 73
- 0
- 40
-0.0
- 0
-LTYPE
- 5
-15
-330
-5
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-ByLayer
- 70
- 0
- 3
-
- 72
- 65
- 73
- 0
- 40
-0.0
- 0
-LTYPE
- 5
-16
-330
-5
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-Continuous
- 70
- 0
- 3
-Solid line
- 72
- 65
- 73
- 0
- 40
-0.0
- 0
-ENDTAB
- 0
-TABLE
- 2
-LAYER
- 5
-2
-102
-{ACAD_XDICTIONARY
-360
-D5
-102
-}
-330
-0
-100
-AcDbSymbolTable
- 70
- 1
- 0
-LAYER
- 5
-10
-330
-2
-100
-AcDbSymbolTableRecord
-100
-AcDbLayerTableRecord
- 2
-0
- 70
- 0
- 62
- 7
-420
- 15200511
- 6
-Continuous
-370
- -3
-390
-F
-347
-98
- 0
-ENDTAB
- 0
-TABLE
- 2
-STYLE
- 5
-3
-330
-0
-100
-AcDbSymbolTable
- 70
- 1
- 0
-STYLE
- 5
-11
-330
-3
-100
-AcDbSymbolTableRecord
-100
-AcDbTextStyleTableRecord
- 2
-Standard
- 70
- 0
- 40
-0.0
- 41
-1.0
- 50
-0.0
- 71
- 0
- 42
-0.2
- 3
-txt
- 4
-
- 0
-ENDTAB
- 0
-TABLE
- 2
-VIEW
- 5
-6
-330
-0
-100
-AcDbSymbolTable
- 70
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-UCS
- 5
-7
-330
-0
-100
-AcDbSymbolTable
- 70
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-APPID
- 5
-9
-330
-0
-100
-AcDbSymbolTable
- 70
- 2
- 0
-APPID
- 5
-12
-330
-9
-100
-AcDbSymbolTableRecord
-100
-AcDbRegAppTableRecord
- 2
-ACAD
- 70
- 0
- 0
-APPID
- 5
-F8
-330
-9
-100
-AcDbSymbolTableRecord
-100
-AcDbRegAppTableRecord
- 2
-ACAD_EXEMPT_FROM_CAD_STANDARDS
- 70
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-DIMSTYLE
- 5
-A
-330
-0
-100
-AcDbSymbolTable
- 70
- 1
-100
-AcDbDimStyleTable
- 71
- 1
-340
-27
- 0
-DIMSTYLE
-105
-27
-330
-A
-100
-AcDbSymbolTableRecord
-100
-AcDbDimStyleTableRecord
- 2
-Standard
- 70
- 0
-340
-11
- 0
-ENDTAB
- 0
-TABLE
- 2
-BLOCK_RECORD
- 5
-1
-330
-0
-100
-AcDbSymbolTable
- 70
- 1
- 0
-BLOCK_RECORD
- 5
-1F
-330
-1
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-*Model_Space
-340
-22
- 70
- 0
-280
- 1
-281
- 0
- 0
-BLOCK_RECORD
- 5
-58
-330
-1
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-*Paper_Space
-340
-59
- 70
- 0
-280
- 1
-281
- 0
- 0
-BLOCK_RECORD
- 5
-5D
-330
-1
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-*Paper_Space0
-340
-5E
- 70
- 0
-280
- 1
-281
- 0
- 0
-ENDTAB
- 0
-ENDSEC
- 0
-SECTION
- 2
-BLOCKS
- 0
-BLOCK
- 5
-20
-330
-1F
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockBegin
- 2
-*Model_Space
- 70
- 0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-*Model_Space
- 1
-
- 0
-ENDBLK
- 5
-21
-330
-1F
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockEnd
- 0
-BLOCK
- 5
-5A
-330
-58
-100
-AcDbEntity
- 67
- 1
- 8
-0
-100
-AcDbBlockBegin
- 2
-*Paper_Space
- 70
- 0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-*Paper_Space
- 1
-
- 0
-ENDBLK
- 5
-5B
-330
-58
-100
-AcDbEntity
- 67
- 1
- 8
-0
-100
-AcDbBlockEnd
- 0
-BLOCK
- 5
-5F
-330
-5D
-100
-AcDbEntity
- 67
- 1
- 8
-0
-100
-AcDbBlockBegin
- 2
-*Paper_Space0
- 70
- 0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-*Paper_Space0
- 1
-
- 0
-ENDBLK
- 5
-60
-330
-5D
-100
-AcDbEntity
- 67
- 1
- 8
-0
-100
-AcDbBlockEnd
- 0
-ENDSEC
- 0
-SECTION
- 2
-ENTITIES
- 0
-3DFACE
- 5
-12E
-330
-1F
-100
-AcDbEntity
- 8
-0
-100
-AcDbFace
- 10
-12.88182795043413
- 20
-8.768113668259417
- 30
-0.0
- 11
-0.4111909167120445
- 21
-26.59490246309473
- 31
-0.0
- 12
-25.40456150899317
- 22
-20.31760922556123
- 32
-0.0
- 13
-28.44512372656983
- 23
-3.145761660981492
- 33
-0.0
- 0
-ENDSEC
- 0
-SECTION
- 2
-OBJECTS
- 0
-DICTIONARY
- 5
-C
-330
-0
-100
-AcDbDictionary
-281
- 1
- 3
-ACAD_BACKGROUND
-350
-AE
- 3
-ACAD_COLOR
-350
-73
- 3
-ACAD_GROUP
-350
-D
- 3
-ACAD_LAYOUT
-350
-1A
- 3
-ACAD_MATERIAL
-350
-72
- 3
-ACAD_MLINESTYLE
-350
-17
- 3
-ACAD_PLOTSETTINGS
-350
-19
- 3
-ACAD_PLOTSTYLENAME
-350
-E
- 3
-ACAD_TABLESTYLE
-350
-86
- 3
-ACAD_VISUALSTYLE
-350
-99
- 3
-AcDbVariableDictionary
-350
-66
- 0
-DICTIONARY
- 5
-D5
-330
-2
-100
-AcDbDictionary
-280
- 1
-281
- 1
- 3
-ACAD_LAYERFILTERS
-360
-EE
- 3
-ACLYDICTIONARY
-360
-ED
- 0
-DICTIONARY
- 5
-AE
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 0
-DICTIONARY
- 5
-73
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 0
-DICTIONARY
- 5
-D
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 0
-DICTIONARY
- 5
-1A
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-Layout1
-350
-59
- 3
-Layout2
-350
-5E
- 3
-Model
-350
-22
- 0
-DICTIONARY
- 5
-72
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-ByBlock
-350
-97
- 3
-ByLayer
-350
-96
- 3
-Global
-350
-98
- 0
-DICTIONARY
- 5
-17
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-Standard
-350
-18
- 0
-DICTIONARY
- 5
-19
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 0
-ACDBDICTIONARYWDFLT
- 5
-E
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-Normal
-350
-F
-100
-AcDbDictionaryWithDefault
-340
-F
- 0
-DICTIONARY
- 5
-86
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-Standard
-350
-87
- 0
-DICTIONARY
- 5
-99
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-2dWireframe
-350
-9F
- 3
-3D Hidden
-350
-A1
- 3
-3dWireframe
-350
-A0
- 3
-Basic
-350
-9E
- 3
-Brighten
-350
-A5
- 3
-ColorChange
-350
-AA
- 3
-Conceptual
-350
-A2
- 3
-Dim
-350
-A4
- 3
-Facepattern
-350
-A9
- 3
-Flat
-350
-9A
- 3
-FlatWithEdges
-350
-9B
- 3
-Gouraud
-350
-9C
- 3
-GouraudWithEdges
-350
-9D
- 3
-Linepattern
-350
-A8
- 3
-Realistic
-350
-A3
- 3
-Thicken
-350
-A6
- 3
-Transparent
-350
-A7
- 0
-DICTIONARY
- 5
-66
-102
-{ACAD_REACTORS
-330
-C
-102
-}
-330
-C
-100
-AcDbDictionary
-281
- 1
- 3
-CTABLESTYLE
-350
-89
- 3
-DIMASSOC
-350
-67
- 3
-HIDETEXT
-350
-6B
- 0
-DICTIONARY
- 5
-EE
-102
-{ACAD_REACTORS
-330
-D5
-102
-}
-330
-D5
-100
-AcDbDictionary
-281
- 1
- 0
-DICTIONARY
- 5
-ED
-102
-{ACAD_REACTORS
-330
-D5
-102
-}
-330
-D5
-100
-AcDbDictionary
-281
- 1
-1001
-ACAD
-1000
-<All
- 0
-LAYOUT
- 5
-59
-102
-{ACAD_REACTORS
-330
-1A
-102
-}
-330
-1A
-100
-AcDbPlotSettings
- 1
-
- 2
-None
- 4
-
- 6
-
- 40
-0.0
- 41
-0.0
- 42
-0.0
- 43
-0.0
- 44
-0.0
- 45
-0.0
- 46
-0.0
- 47
-0.0
- 48
-0.0
- 49
-0.0
-140
-0.0
-141
-0.0
-142
-1.0
-143
-1.0
- 70
- 688
- 72
- 0
- 73
- 0
- 74
- 5
- 7
-
- 75
- 16
-147
-1.0
- 76
- 0
- 77
- 2
- 78
- 300
-148
-0.0
-149
-0.0
-100
-AcDbLayout
- 1
-Layout1
- 70
- 1
- 71
- 1
- 10
-0.0
- 20
-0.0
- 11
-12.0
- 21
-9.0
- 12
-0.0
- 22
-0.0
- 32
-0.0
- 14
-0.0
- 24
-0.0
- 34
-0.0
- 15
-0.0
- 25
-0.0
- 35
-0.0
-146
-0.0
- 13
-0.0
- 23
-0.0
- 33
-0.0
- 16
-1.0
- 26
-0.0
- 36
-0.0
- 17
-0.0
- 27
-1.0
- 37
-0.0
- 76
- 0
-330
-58
- 0
-LAYOUT
- 5
-5E
-102
-{ACAD_REACTORS
-330
-1A
-102
-}
-330
-1A
-100
-AcDbPlotSettings
- 1
-
- 2
-None
- 4
-
- 6
-
- 40
-0.0
- 41
-0.0
- 42
-0.0
- 43
-0.0
- 44
-0.0
- 45
-0.0
- 46
-0.0
- 47
-0.0
- 48
-0.0
- 49
-0.0
-140
-0.0
-141
-0.0
-142
-1.0
-143
-1.0
- 70
- 688
- 72
- 0
- 73
- 0
- 74
- 5
- 7
-
- 75
- 16
-147
-1.0
- 76
- 0
- 77
- 2
- 78
- 300
-148
-0.0
-149
-0.0
-100
-AcDbLayout
- 1
-Layout2
- 70
- 1
- 71
- 2
- 10
-0.0
- 20
-0.0
- 11
-12.0
- 21
-9.0
- 12
-0.0
- 22
-0.0
- 32
-0.0
- 14
-0.0
- 24
-0.0
- 34
-0.0
- 15
-0.0
- 25
-0.0
- 35
-0.0
-146
-0.0
- 13
-0.0
- 23
-0.0
- 33
-0.0
- 16
-1.0
- 26
-0.0
- 36
-0.0
- 17
-0.0
- 27
-1.0
- 37
-0.0
- 76
- 0
-330
-5D
- 0
-LAYOUT
- 5
-22
-102
-{ACAD_REACTORS
-330
-1A
-102
-}
-330
-1A
-100
-AcDbPlotSettings
- 1
-
- 2
-none_device
- 4
-ANSI_A_(8.50_x_11.00_Inches)
- 6
-
- 40
-6.349999904632568
- 41
-19.04999923706055
- 42
-6.350006103515625
- 43
-19.04998779296875
- 44
-215.8999938964844
- 45
-279.3999938964844
- 46
-0.0
- 47
-0.0
- 48
-0.0
- 49
-0.0
-140
-0.0
-141
-0.0
-142
-1.0
-143
-2.584895464708373
- 70
- 11952
- 72
- 0
- 73
- 1
- 74
- 0
- 7
-
- 75
- 0
-147
-0.3868628397755418
- 76
- 0
- 77
- 2
- 78
- 300
-148
-0.0
-149
-0.0
-100
-AcDbLayout
- 1
-Model
- 70
- 1
- 71
- 0
- 10
-0.0
- 20
-0.0
- 11
-12.0
- 21
-9.0
- 12
-0.0
- 22
-0.0
- 32
-0.0
- 14
-0.0
- 24
-0.0
- 34
-0.0
- 15
-0.0
- 25
-0.0
- 35
-0.0
-146
-0.0
- 13
-0.0
- 23
-0.0
- 33
-0.0
- 16
-1.0
- 26
-0.0
- 36
-0.0
- 17
-0.0
- 27
-1.0
- 37
-0.0
- 76
- 0
-330
-1F
-331
-94
- 0
-MATERIAL
- 5
-97
-102
-{ACAD_REACTORS
-330
-72
-102
-}
-330
-72
-100
-AcDbMaterial
- 1
-ByBlock
- 0
-MATERIAL
- 5
-96
-102
-{ACAD_REACTORS
-330
-72
-102
-}
-330
-72
-100
-AcDbMaterial
- 1
-ByLayer
- 0
-MATERIAL
- 5
-98
-102
-{ACAD_REACTORS
-330
-72
-102
-}
-330
-72
-100
-AcDbMaterial
- 1
-Global
- 0
-MLINESTYLE
- 5
-18
-102
-{ACAD_REACTORS
-330
-17
-102
-}
-330
-17
-100
-AcDbMlineStyle
- 2
-STANDARD
- 70
- 0
- 3
-
- 62
- 256
- 51
-90.0
- 52
-90.0
- 71
- 2
- 49
-0.5
- 62
- 256
- 6
-BYLAYER
- 49
--0.5
- 62
- 256
- 6
-BYLAYER
- 0
-ACDBPLACEHOLDER
- 5
-F
-102
-{ACAD_REACTORS
-330
-E
-102
-}
-330
-E
- 0
-TABLESTYLE
- 5
-87
-102
-{ACAD_REACTORS
-330
-86
-102
-}
-330
-86
-100
-AcDbTableStyle
- 3
-Standard
- 70
- 0
- 71
- 0
- 40
-0.06
- 41
-0.06
-280
- 0
-281
- 0
- 7
-Standard
-140
-0.18
-170
- 2
- 62
- 0
- 63
- 7
-283
- 0
- 90
- 512
- 91
- 0
- 1
-
-274
- -2
-284
- 1
- 64
- 0
-275
- -2
-285
- 1
- 65
- 0
-276
- -2
-286
- 1
- 66
- 0
-277
- -2
-287
- 1
- 67
- 0
-278
- -2
-288
- 1
- 68
- 0
-279
- -2
-289
- 1
- 69
- 0
- 7
-Standard
-140
-0.25
-170
- 5
- 62
- 0
- 63
- 7
-283
- 0
- 90
- 512
- 91
- 0
- 1
-
-274
- -2
-284
- 1
- 64
- 0
-275
- -2
-285
- 1
- 65
- 0
-276
- -2
-286
- 1
- 66
- 0
-277
- -2
-287
- 1
- 67
- 0
-278
- -2
-288
- 1
- 68
- 0
-279
- -2
-289
- 1
- 69
- 0
- 7
-Standard
-140
-0.18
-170
- 5
- 62
- 0
- 63
- 7
-283
- 0
- 90
- 512
- 91
- 0
- 1
-
-274
- -2
-284
- 1
- 64
- 0
-275
- -2
-285
- 1
- 65
- 0
-276
- -2
-286
- 1
- 66
- 0
-277
- -2
-287
- 1
- 67
- 0
-278
- -2
-288
- 1
- 68
- 0
-279
- -2
-289
- 1
- 69
- 0
- 0
-VISUALSTYLE
- 5
-9F
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-2dWireframe
- 70
- 4
- 71
- 0
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 0
- 66
- 257
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 0
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A1
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-3D Hidden
- 70
- 6
- 71
- 1
- 72
- 2
- 73
- 2
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 2
- 91
- 2
- 64
- 7
- 65
- 257
- 75
- 2
-175
- 1
- 42
-40.0
- 92
- 0
- 66
- 257
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 3
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 0
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A0
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-3dWireframe
- 70
- 5
- 71
- 0
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 0
- 66
- 257
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 0
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-9E
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Basic
- 70
- 7
- 71
- 1
- 72
- 0
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 0
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A5
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Brighten
- 70
- 12
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-50.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-AA
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-ColorChange
- 70
- 17
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A2
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Conceptual
- 70
- 9
- 71
- 3
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 2
- 91
- 2
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-40.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 3
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 0
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A4
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Dim
- 70
- 11
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
--50.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A9
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Facepattern
- 70
- 16
- 71
- 2
- 72
- 2
- 73
- 3
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 8
-421
- 8421504
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 8
-424
- 8421504
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-9A
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Flat
- 70
- 0
- 71
- 2
- 72
- 1
- 73
- 1
- 90
- 2
- 40
--0.6
- 41
-30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 0
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-9B
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-FlatWithEdges
- 70
- 1
- 71
- 2
- 72
- 1
- 73
- 1
- 90
- 2
- 40
--0.6
- 41
-30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 0
- 66
- 257
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-9C
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Gouraud
- 70
- 2
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 2
- 40
--0.6
- 41
-30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 0
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 0
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-9D
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-GouraudWithEdges
- 70
- 3
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 2
- 40
--0.6
- 41
-30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 0
- 66
- 257
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A8
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Linepattern
- 70
- 15
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A3
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Realistic
- 70
- 8
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 0
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 8
- 66
- 8
-424
- 7895160
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 13
- 44
-0.0
-173
- 0
-291
- 0
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A6
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Thicken
- 70
- 13
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 1
-175
- 1
- 42
-1.0
- 92
- 12
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-VISUALSTYLE
- 5
-A7
-102
-{ACAD_REACTORS
-330
-99
-102
-}
-330
-99
-100
-AcDbVisualStyle
- 2
-Transparent
- 70
- 14
- 71
- 2
- 72
- 2
- 73
- 1
- 90
- 0
- 40
--0.6
- 41
--30.0
- 62
- 5
- 63
- 7
-421
- 16777215
- 74
- 1
- 91
- 4
- 64
- 7
- 65
- 257
- 75
- 7
-175
- 7
- 42
-1.0
- 92
- 8
- 66
- 7
- 43
-1.0
- 76
- 1
- 77
- 6
- 78
- 2
- 67
- 7
- 79
- 5
-170
- 0
-171
- 0
-290
- 0
-174
- 0
- 93
- 1
- 44
-0.0
-173
- 0
-291
- 1
- 45
-0.0
- 0
-DICTIONARYVAR
- 5
-89
-102
-{ACAD_REACTORS
-330
-66
-102
-}
-330
-66
-100
-DictionaryVariables
-280
- 0
- 1
-STANDARD
- 0
-DICTIONARYVAR
- 5
-67
-102
-{ACAD_REACTORS
-330
-66
-102
-}
-330
-66
-100
-DictionaryVariables
-280
- 0
- 1
-2
- 0
-DICTIONARYVAR
- 5
-6B
-102
-{ACAD_REACTORS
-330
-66
-102
-}
-330
-66
-100
-DictionaryVariables
-280
- 0
- 1
-1
- 0
-ENDSEC
- 0
-EOF
diff --git a/dxflib/test/Makefile b/dxflib/test/Makefile
deleted file mode 100644
index fcd4b05..0000000
--- a/dxflib/test/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-
-prefix = /usr/local
-exec_prefix = ${prefix}
-bindir = ${exec_prefix}/bin
-
-OBJF = main.o \
- test_creationclass.o
-EXTERN_LIBS = -L../lib -ldxflib -L/usr/X11R6/lib -lX11
-INCLUDES = -I../src
-
-all: main
-
-clean:
- @echo "Cleaning project..."
- @find . -name '*.o' -exec rm "{}" \;
- @if [ -f test ]; then rm -f test; fi
-
-distclean: clean
- rm -f config.log config.cache Makefile config.status
-
-main: $(OBJF)
- c++ -o test $(OBJF) $(EXTERN_LIBS)
-
-%.o : %.cpp
- $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -O3 -Wall $< -o $@
-
-doc :
- @echo "Building documentation"
- @doxygen doxy.cfg
diff --git a/dxflib/test/Makefile.in b/dxflib/test/Makefile.in
deleted file mode 100644
index d4bca6f..0000000
--- a/dxflib/test/Makefile.in
+++ /dev/null
@@ -1,29 +0,0 @@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-
-OBJF = main.o \
- test_creationclass.o
-EXTERN_LIBS = -L../lib -ldxflib -L/usr/X11R6/lib -lX11
-INCLUDES = -I../src
-
-all: main
-
-clean:
- @echo "Cleaning project..."
- @find . -name '*.o' -exec rm "{}" \;
- @if [ -f test ]; then rm -f test; fi
-
-distclean: clean
- rm -f config.log config.cache Makefile config.status
-
-main: $(OBJF)
- c++ -o test $(OBJF) $(EXTERN_LIBS)
-
-%.o : %.cpp
- $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(INCLUDES) -O3 -Wall $< -o $@
-
-doc :
- @echo "Building documentation"
- @doxygen doxy.cfg
diff --git a/dxflib/test/demo.dxf b/dxflib/test/demo.dxf
deleted file mode 100644
index ed3398f..0000000
--- a/dxflib/test/demo.dxf
+++ /dev/null
@@ -1,18696 +0,0 @@
- 0
-SECTION
- 2
-HEADER
- 9
-$ACADVER
- 1
-AC1009
- 9
-$INSBASE
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$EXTMIN
- 10
-0.3313683463181007
- 20
-0.75635853773111
- 30
-0.0
- 9
-$EXTMAX
- 10
-241.86108504018389
- 20
-179.54317761806359
- 30
-0.0
- 9
-$LIMMIN
- 10
-0.0
- 20
-0.0
- 9
-$LIMMAX
- 10
-240.0
- 20
-180.0
- 9
-$ORTHOMODE
- 70
- 0
- 9
-$REGENMODE
- 70
- 1
- 9
-$FILLMODE
- 70
- 1
- 9
-$QTEXTMODE
- 70
- 0
- 9
-$MIRRTEXT
- 70
- 1
- 9
-$DRAGMODE
- 70
- 2
- 9
-$LTSCALE
- 40
-1.0
- 9
-$OSMODE
- 70
- 37
- 9
-$ATTMODE
- 70
- 1
- 9
-$TEXTSIZE
- 40
-0.2
- 9
-$TRACEWID
- 40
-0.05
- 9
-$TEXTSTYLE
- 7
-STANDARD
- 9
-$CLAYER
- 8
-0
- 9
-$CELTYPE
- 6
-BYLAYER
- 9
-$CECOLOR
- 62
- 256
- 9
-$DIMSCALE
- 40
-1.0
- 9
-$DIMASZ
- 40
-0.18
- 9
-$DIMEXO
- 40
-0.0625
- 9
-$DIMDLI
- 40
-0.38
- 9
-$DIMRND
- 40
-0.0
- 9
-$DIMDLE
- 40
-0.0
- 9
-$DIMEXE
- 40
-0.18
- 9
-$DIMTP
- 40
-0.0
- 9
-$DIMTM
- 40
-0.0
- 9
-$DIMTXT
- 40
-0.18
- 9
-$DIMCEN
- 40
-0.09
- 9
-$DIMTSZ
- 40
-0.0
- 9
-$DIMTOL
- 70
- 0
- 9
-$DIMLIM
- 70
- 0
- 9
-$DIMTIH
- 70
- 1
- 9
-$DIMTOH
- 70
- 1
- 9
-$DIMSE1
- 70
- 0
- 9
-$DIMSE2
- 70
- 0
- 9
-$DIMTAD
- 70
- 0
- 9
-$DIMZIN
- 70
- 0
- 9
-$DIMBLK
- 1
-
- 9
-$DIMASO
- 70
- 1
- 9
-$DIMSHO
- 70
- 1
- 9
-$DIMPOST
- 1
-
- 9
-$DIMAPOST
- 1
-
- 9
-$DIMALT
- 70
- 0
- 9
-$DIMALTD
- 70
- 2
- 9
-$DIMALTF
- 40
-25.399999999999999
- 9
-$DIMLFAC
- 40
-1.0
- 9
-$DIMTOFL
- 70
- 0
- 9
-$DIMTVP
- 40
-0.0
- 9
-$DIMTIX
- 70
- 0
- 9
-$DIMSOXD
- 70
- 0
- 9
-$DIMSAH
- 70
- 0
- 9
-$DIMBLK1
- 1
-
- 9
-$DIMBLK2
- 1
-
- 9
-$DIMSTYLE
- 2
-STANDARD
- 9
-$DIMCLRD
- 70
- 0
- 9
-$DIMCLRE
- 70
- 0
- 9
-$DIMCLRT
- 70
- 0
- 9
-$DIMTFAC
- 40
-1.0
- 9
-$DIMGAP
- 40
-0.09
- 9
-$LUNITS
- 70
- 2
- 9
-$LUPREC
- 70
- 4
- 9
-$SKETCHINC
- 40
-0.1
- 9
-$FILLETRAD
- 40
-0.5
- 9
-$AUNITS
- 70
- 0
- 9
-$AUPREC
- 70
- 0
- 9
-$MENU
- 1
-.
- 9
-$ELEVATION
- 40
-0.0
- 9
-$PELEVATION
- 40
-0.0
- 9
-$THICKNESS
- 40
-0.0
- 9
-$LIMCHECK
- 70
- 0
- 9
-$BLIPMODE
- 70
- 0
- 9
-$CHAMFERA
- 40
-0.5
- 9
-$CHAMFERB
- 40
-0.5
- 9
-$SKPOLY
- 70
- 0
- 9
-$TDCREATE
- 40
-2451192.901182164
- 9
-$TDUPDATE
- 40
-2452556.8396023032
- 9
-$TDINDWG
- 40
-0.3019879282
- 9
-$TDUSRTIMER
- 40
-0.301987581
- 9
-$USRTIMER
- 70
- 1
- 9
-$ANGBASE
- 50
-0.0
- 9
-$ANGDIR
- 70
- 0
- 9
-$PDMODE
- 70
- 0
- 9
-$PDSIZE
- 40
-0.0
- 9
-$PLINEWID
- 40
-0.0
- 9
-$COORDS
- 70
- 1
- 9
-$SPLFRAME
- 70
- 0
- 9
-$SPLINETYPE
- 70
- 6
- 9
-$SPLINESEGS
- 70
- 8
- 9
-$ATTDIA
- 70
- 0
- 9
-$ATTREQ
- 70
- 1
- 9
-$HANDLING
- 70
- 22529
- 9
-$HANDSEED
- 5
-A9D
- 9
-$SURFTAB1
- 70
- 6
- 9
-$SURFTAB2
- 70
- 6
- 9
-$SURFTYPE
- 70
- 6
- 9
-$SURFU
- 70
- 6
- 9
-$SURFV
- 70
- 6
- 9
-$UCSNAME
- 2
-
- 9
-$UCSORG
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSXDIR
- 10
-1.0
- 20
-0.0
- 30
-0.0
- 9
-$UCSYDIR
- 10
-0.0
- 20
-1.0
- 30
-0.0
- 9
-$PUCSNAME
- 2
-
- 9
-$PUCSORG
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSXDIR
- 10
-1.0
- 20
-0.0
- 30
-0.0
- 9
-$PUCSYDIR
- 10
-0.0
- 20
-1.0
- 30
-0.0
- 9
-$USERI1
- 70
- 0
- 9
-$USERI2
- 70
- 0
- 9
-$USERI3
- 70
- 0
- 9
-$USERI4
- 70
- 0
- 9
-$USERI5
- 70
- 0
- 9
-$USERR1
- 40
-0.0
- 9
-$USERR2
- 40
-0.0
- 9
-$USERR3
- 40
-0.0
- 9
-$USERR4
- 40
-0.0
- 9
-$USERR5
- 40
-0.0
- 9
-$WORLDVIEW
- 70
- 1
- 9
-$SHADEDGE
- 70
- 3
- 9
-$SHADEDIF
- 70
- 70
- 9
-$TILEMODE
- 70
- 1
- 9
-$MAXACTVP
- 70
- 64
- 9
-$PLIMCHECK
- 70
- 0
- 9
-$PEXTMIN
- 10
-1.0000000000000000E+020
- 20
-1.0000000000000000E+020
- 30
-1.0000000000000000E+020
- 9
-$PEXTMAX
- 10
--1.0000000000000000E+020
- 20
--1.0000000000000000E+020
- 30
--1.0000000000000000E+020
- 9
-$PLIMMIN
- 10
-0.0
- 20
-0.0
- 9
-$PLIMMAX
- 10
-12.0
- 20
-9.0
- 9
-$UNITMODE
- 70
- 0
- 9
-$VISRETAIN
- 70
- 1
- 9
-$PLINEGEN
- 70
- 0
- 9
-$PSLTSCALE
- 70
- 1
- 0
-ENDSEC
- 0
-SECTION
- 2
-TABLES
- 0
-TABLE
- 2
-VPORT
- 70
- 2
- 0
-VPORT
- 2
-*ACTIVE
- 70
- 0
- 10
-0.0
- 20
-0.0
- 11
-1.0
- 21
-1.0
- 12
-171.1001742006836
- 22
-93.871468638243499
- 13
-0.0
- 23
-0.0
- 14
-0.5
- 24
-0.5
- 15
-12.0
- 25
-12.0
- 16
-0.0
- 26
-0.0
- 36
-1.0
- 17
-0.0
- 27
-0.0
- 37
-0.0
- 40
-197.73420228825569
- 41
-1.7416356877323409
- 42
-50.0
- 43
-0.0
- 44
-0.0
- 50
-0.0
- 51
-0.0
- 71
- 0
- 72
- 100
- 73
- 1
- 74
- 3
- 75
- 0
- 76
- 1
- 77
- 0
- 78
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-LTYPE
- 70
- 1
- 0
-LTYPE
- 2
-CONTINUOUS
- 70
- 0
- 3
-Solid line
- 72
- 65
- 73
- 0
- 40
-0.0
- 0
-ENDTAB
- 0
-TABLE
- 2
-LAYER
- 70
- 1
- 0
-LAYER
- 2
-0
- 70
- 0
- 62
- 7
- 6
-CONTINUOUS
- 0
-ENDTAB
- 0
-TABLE
- 2
-STYLE
- 70
- 1
- 0
-STYLE
- 2
-STANDARD
- 70
- 0
- 40
-0.0
- 41
-1.0
- 50
-0.0
- 71
- 0
- 42
-0.2
- 3
-txt
- 4
-
- 0
-ENDTAB
- 0
-TABLE
- 2
-VIEW
- 70
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-UCS
- 70
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-APPID
- 70
- 3
- 0
-APPID
- 2
-ACAD
- 70
- 0
- 0
-APPID
- 2
-CONTENTBLOCKDESCRIPTION
- 70
- 0
- 0
-APPID
- 2
-CONTENTBLOCKICON
- 70
- 0
- 0
-ENDTAB
- 0
-TABLE
- 2
-DIMSTYLE
- 70
- 1
- 0
-DIMSTYLE
- 2
-STANDARD
- 70
- 0
- 3
-
- 4
-
- 5
-
- 6
-
- 7
-
- 40
-1.0
- 41
-0.18
- 42
-0.0625
- 43
-0.38
- 44
-0.18
- 45
-0.0
- 46
-0.0
- 47
-0.0
- 48
-0.0
-140
-0.18
-141
-0.09
-142
-0.0
-143
-25.399999999999999
-144
-1.0
-145
-0.0
-146
-1.0
-147
-0.09
- 71
- 0
- 72
- 0
- 73
- 1
- 74
- 1
- 75
- 0
- 76
- 0
- 77
- 0
- 78
- 0
-170
- 0
-171
- 2
-172
- 0
-173
- 0
-174
- 0
-175
- 0
-176
- 0
-177
- 0
-178
- 0
- 0
-ENDTAB
- 0
-ENDSEC
- 0
-SECTION
- 2
-BLOCKS
- 0
-BLOCK
- 8
-0
- 2
-$MODEL_SPACE
- 70
- 0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-$MODEL_SPACE
- 1
-
- 0
-ENDBLK
- 5
-21
- 8
-0
- 0
-BLOCK
- 67
- 1
- 8
-0
- 2
-$PAPER_SPACE
- 70
- 0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-$PAPER_SPACE
- 1
-
- 0
-ENDBLK
- 5
-1D
- 67
- 1
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-SCHRANK_-_SCHRANKTÜR_1_IN_
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-SCHRANK_-_SCHRANKTÜR_1_IN_
- 1
-BASE_CABINET_1_DRAWER_SIDE
- 0
-LINE
- 5
-2C
- 8
-0
- 10
--24.0
- 20
-6.0
- 30
-0.0
- 11
--24.0
- 21
-28.500000000000028
- 31
-0.0
- 0
-LINE
- 5
-2D
- 8
-0
- 10
--23.5
- 20
-28.500000000000028
- 30
-0.0
- 11
--23.5
- 21
-6.0
- 31
-0.0
- 0
-POLYLINE
- 5
-2E
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-90F
- 8
-0
- 10
--23.0
- 20
-5.0
- 30
-0.0
- 0
-VERTEX
- 5
-910
- 8
-0
- 10
--23.0
- 20
-34.500000000000021
- 30
-0.0
- 0
-VERTEX
- 5
-911
- 8
-0
- 10
-0.0
- 20
-34.500000000000021
- 30
-0.0
- 0
-VERTEX
- 5
-912
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-913
- 8
-0
- 10
--20.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-914
- 8
-0
- 0
-LINE
- 5
-2F
- 8
-0
- 10
--20.0
- 20
-0.0
- 30
-0.0
- 11
--20.0
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-30
- 8
-0
- 10
--20.0
- 20
-5.0
- 30
-0.0
- 11
--23.0
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-31
- 8
-0
- 10
--23.5
- 20
-6.0
- 30
-0.0
- 11
--24.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-32
- 8
-0
- 10
--24.0
- 20
-33.500000000000028
- 30
-0.0
- 11
--23.5
- 21
-33.500000000000028
- 31
-0.0
- 0
-LINE
- 5
-33
- 8
-0
- 10
--23.5
- 20
-29.500000000000011
- 30
-0.0
- 11
--24.0
- 21
-29.500000000000011
- 31
-0.0
- 0
-LINE
- 5
-34
- 8
-0
- 10
--24.0
- 20
-28.500000000000028
- 30
-0.0
- 11
--23.5
- 21
-28.500000000000028
- 31
-0.0
- 0
-LINE
- 5
-35
- 8
-0
- 10
--23.5
- 20
-33.500000000000028
- 30
-0.0
- 11
--23.5
- 21
-29.500000000000011
- 31
-0.0
- 0
-LINE
- 5
-36
- 8
-0
- 10
--24.0
- 20
-29.500000000000011
- 30
-0.0
- 11
--24.0
- 21
-33.500000000000028
- 31
-0.0
- 0
-ENDBLK
- 5
-38
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-SCHRANK_-_SCHRANKTÜR_1_MIT
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-SCHRANK_-_SCHRANKTÜR_1_MIT
- 1
-BASE_CABINET_1_DRWR_24IN_FRONT
- 0
-LINE
- 5
-4F
- 8
-0
- 10
-0.0
- 20
-5.0
- 30
-0.0
- 11
-24.0
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-50
- 8
-0
- 10
-23.0
- 20
-28.499999999999989
- 30
-0.0
- 11
-1.0
- 21
-28.499999999999989
- 31
-0.0
- 0
-LINE
- 5
-51
- 8
-0
- 10
-1.0
- 20
-29.499999999999989
- 30
-0.0
- 11
-23.0
- 21
-29.499999999999989
- 31
-0.0
- 0
-LINE
- 5
-52
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 11
-0.0
- 21
-34.5
- 31
-0.0
- 0
-LINE
- 5
-53
- 8
-0
- 10
-0.0
- 20
-34.5
- 30
-0.0
- 11
-24.0
- 21
-34.5
- 31
-0.0
- 0
-LINE
- 5
-54
- 8
-0
- 10
-24.0
- 20
-34.5
- 30
-0.0
- 11
-24.0
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-55
- 8
-0
- 10
-24.0
- 20
-0.0
- 30
-0.0
- 11
-0.0
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-56
- 8
-0
- 10
-23.0
- 20
-28.499999999999989
- 30
-0.0
- 11
-23.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-57
- 8
-0
- 10
-23.0
- 20
-6.0
- 30
-0.0
- 11
-1.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-58
- 8
-0
- 10
-1.0
- 20
-6.0
- 30
-0.0
- 11
-1.0
- 21
-28.499999999999989
- 31
-0.0
- 0
-LINE
- 5
-59
- 8
-0
- 10
-1.0
- 20
-29.499999999999989
- 30
-0.0
- 11
-1.0
- 21
-33.5
- 31
-0.0
- 0
-LINE
- 5
-5A
- 8
-0
- 10
-1.0
- 20
-33.5
- 30
-0.0
- 11
-23.0
- 21
-33.5
- 31
-0.0
- 0
-LINE
- 5
-5B
- 8
-0
- 10
-23.0
- 20
-33.5
- 30
-0.0
- 11
-23.0
- 21
-29.499999999999989
- 31
-0.0
- 0
-ENDBLK
- 5
-5D
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-GESCHIRRSPÜLMASCHINE
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-GESCHIRRSPÜLMASCHINE
- 1
-DISHWASHER
- 0
-LINE
- 5
-70
- 8
-0
- 10
-19.315600000000011
- 20
-33.184299999999958
- 30
-0.0
- 11
-19.5
- 21
-32.999999999999957
- 31
-0.0
- 0
-LINE
- 5
-71
- 8
-0
- 10
-20.5
- 20
-32.999999999999957
- 30
-0.0
- 11
-20.69380000000001
- 21
-33.193799999999982
- 31
-0.0
- 0
-LINE
- 5
-72
- 8
-0
- 10
-20.706100000000049
- 20
-31.793899999999962
- 30
-0.0
- 11
-20.5
- 21
-31.999999999999972
- 31
-0.0
- 0
-LINE
- 5
-73
- 8
-0
- 10
-19.5
- 20
-31.999999999999972
- 30
-0.0
- 11
-19.294200000000028
- 21
-31.794199999999989
- 31
-0.0
- 0
-LINE
- 5
-74
- 8
-0
- 10
-20.0
- 20
-32.249999999999957
- 30
-0.0
- 11
-20.0
- 21
-31.499999999999961
- 31
-0.0
- 0
-LINE
- 5
-75
- 8
-0
- 10
-20.0
- 20
-32.749999999999957
- 30
-0.0
- 11
-20.0
- 21
-33.499999999999957
- 31
-0.0
- 0
-LINE
- 5
-76
- 8
-0
- 10
-19.0
- 20
-32.499999999999957
- 30
-0.0
- 11
-19.75
- 21
-32.499999999999957
- 31
-0.0
- 0
-LINE
- 5
-77
- 8
-0
- 10
-21.0
- 20
-32.499999999999957
- 30
-0.0
- 11
-20.249999999999989
- 21
-32.499999999999957
- 31
-0.0
- 0
-CIRCLE
- 5
-78
- 8
-0
- 10
-20.0
- 20
-32.499999999999957
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-79
- 8
-0
- 10
-16.315600000000011
- 20
-33.184299999999958
- 30
-0.0
- 11
-16.5
- 21
-32.999999999999957
- 31
-0.0
- 0
-LINE
- 5
-7A
- 8
-0
- 10
-17.5
- 20
-32.999999999999957
- 30
-0.0
- 11
-17.69380000000001
- 21
-33.193799999999982
- 31
-0.0
- 0
-LINE
- 5
-7B
- 8
-0
- 10
-17.706100000000038
- 20
-31.793899999999962
- 30
-0.0
- 11
-17.5
- 21
-31.999999999999972
- 31
-0.0
- 0
-LINE
- 5
-7C
- 8
-0
- 10
-16.5
- 20
-31.999999999999972
- 30
-0.0
- 11
-16.294200000000039
- 21
-31.794199999999989
- 31
-0.0
- 0
-LINE
- 5
-7D
- 8
-0
- 10
-17.0
- 20
-32.249999999999957
- 30
-0.0
- 11
-17.0
- 21
-31.499999999999961
- 31
-0.0
- 0
-LINE
- 5
-7E
- 8
-0
- 10
-17.0
- 20
-32.749999999999957
- 30
-0.0
- 11
-17.0
- 21
-33.499999999999957
- 31
-0.0
- 0
-LINE
- 5
-7F
- 8
-0
- 10
-16.0
- 20
-32.499999999999957
- 30
-0.0
- 11
-16.75
- 21
-32.499999999999957
- 31
-0.0
- 0
-LINE
- 5
-80
- 8
-0
- 10
-18.0
- 20
-32.499999999999957
- 30
-0.0
- 11
-17.25
- 21
-32.499999999999957
- 31
-0.0
- 0
-CIRCLE
- 5
-81
- 8
-0
- 10
-17.0
- 20
-32.499999999999957
- 30
-0.0
- 40
-1.0
- 0
-POLYLINE
- 5
-82
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-919
- 8
-0
- 10
-15.0
- 20
-30.999999999999961
- 30
-0.0
- 0
-VERTEX
- 5
-91A
- 8
-0
- 10
-15.0
- 20
-33.999999999999957
- 30
-0.0
- 0
-VERTEX
- 5
-91B
- 8
-0
- 10
-22.0
- 20
-33.999999999999957
- 30
-0.0
- 0
-VERTEX
- 5
-91C
- 8
-0
- 10
-22.0
- 20
-30.999999999999961
- 30
-0.0
- 0
-SEQEND
- 5
-91D
- 8
-0
- 0
-CIRCLE
- 5
-83
- 8
-0
- 10
-7.5
- 20
-32.499999999999957
- 30
-0.0
- 40
-0.75
- 0
-CIRCLE
- 5
-84
- 8
-0
- 10
-5.0
- 20
-32.499999999999957
- 30
-0.0
- 40
-0.75
- 0
-CIRCLE
- 5
-85
- 8
-0
- 10
-2.5
- 20
-32.499999999999957
- 30
-0.0
- 40
-0.75
- 0
-CIRCLE
- 5
-86
- 8
-0
- 10
-10.0
- 20
-32.499999999999957
- 30
-0.0
- 40
-0.75
- 0
-POLYLINE
- 5
-87
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-91E
- 8
-0
- 10
-0.5
- 20
-30.999999999999961
- 30
-0.0
- 0
-VERTEX
- 5
-91F
- 8
-0
- 10
-0.5
- 20
-33.999999999999957
- 30
-0.0
- 0
-VERTEX
- 5
-920
- 8
-0
- 10
-12.0
- 20
-33.999999999999957
- 30
-0.0
- 0
-VERTEX
- 5
-921
- 8
-0
- 10
-12.0
- 20
-30.999999999999961
- 30
-0.0
- 0
-SEQEND
- 5
-922
- 8
-0
- 0
-LINE
- 5
-88
- 8
-0
- 10
-24.0
- 20
-30.499999999999972
- 30
-0.0
- 11
-0.0
- 21
-30.499999999999972
- 31
-0.0
- 0
-POLYLINE
- 5
-89
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-923
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-924
- 8
-0
- 10
-0.0
- 20
-34.499999999999957
- 30
-0.0
- 0
-VERTEX
- 5
-925
- 8
-0
- 10
-24.0
- 20
-34.499999999999957
- 30
-0.0
- 0
-VERTEX
- 5
-926
- 8
-0
- 10
-24.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-927
- 8
-0
- 0
-LINE
- 5
-8A
- 8
-0
- 10
-0.0
- 20
-5.0
- 30
-0.0
- 11
-24.0
- 21
-5.0
- 31
-0.0
- 0
-ENDBLK
- 5
-8C
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-ARMATUR_-_KÜCHENARMATUR_IN
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-ARMATUR_-_KÜCHENARMATUR_IN
- 1
-FAUCET_STANDARD_FRONT
- 0
-POLYLINE
- 5
-AD
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-92A
- 8
-0
- 10
-5.0
- 20
-3.251299999999957
- 30
-0.0
- 0
-VERTEX
- 5
-92B
- 8
-0
- 10
-5.0
- 20
-3.5
- 30
-0.0
- 0
-VERTEX
- 5
-92C
- 8
-0
- 10
-3.0
- 20
-3.5
- 30
-0.0
- 0
-VERTEX
- 5
-92D
- 8
-0
- 10
-3.0
- 20
-1.5
- 30
-0.0
- 0
-VERTEX
- 5
-92E
- 8
-0
- 10
-5.0
- 20
-1.5
- 30
-0.0
- 0
-VERTEX
- 5
-92F
- 8
-0
- 10
-5.0
- 20
-2.5
- 30
-0.0
- 0
-SEQEND
- 5
-930
- 8
-0
- 0
-POLYLINE
- 5
-AE
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-931
- 8
-0
- 10
-5.5
- 20
-2.5
- 30
-0.0
- 0
-VERTEX
- 5
-932
- 8
-0
- 10
-5.5
- 20
-3.25
- 30
-0.0
- 0
-VERTEX
- 5
-933
- 8
-0
- 10
-4.5
- 20
-3.25
- 30
-0.0
- 0
-VERTEX
- 5
-934
- 8
-0
- 10
-4.5
- 20
-2.5
- 30
-0.0
- 0
-SEQEND
- 5
-935
- 8
-0
- 0
-LINE
- 5
-AF
- 8
-0
- 10
-3.5
- 20
-1.5
- 30
-0.0
- 11
-3.5
- 21
-1.0
- 31
-0.0
- 0
-LINE
- 5
-B0
- 8
-0
- 10
-4.5
- 20
-1.0
- 30
-0.0
- 11
-4.5
- 21
-1.5
- 31
-0.0
- 0
-LINE
- 5
-B1
- 8
-0
- 10
--0.75
- 20
-3.5
- 30
-0.0
- 11
-0.319199999999995
- 21
-3.5
- 31
-0.0
- 0
-LINE
- 5
-B2
- 8
-0
- 10
-0.75
- 20
-2.5
- 30
-0.0
- 11
-0.75
- 21
-1.0
- 31
-0.0
- 0
-LINE
- 5
-B3
- 8
-0
- 10
--0.25
- 20
-2.5
- 30
-0.0
- 11
--0.25
- 21
-3.0
- 31
-0.0
- 0
-LINE
- 5
-B4
- 8
-0
- 10
-0.75
- 20
-2.5
- 30
-0.0
- 11
--0.25
- 21
-2.5
- 31
-0.0
- 0
-LINE
- 5
-B5
- 8
-0
- 10
-4.1921099999999853
- 20
-5.5040999999999931
- 30
-0.0
- 11
-0.75
- 21
-2.5
- 31
-0.0
- 0
-LINE
- 5
-B6
- 8
-0
- 10
-3.75
- 20
-5.5
- 30
-0.0
- 11
-3.75
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-B7
- 8
-0
- 10
-4.75
- 20
-5.5
- 30
-0.0
- 11
-3.75
- 21
-5.5
- 31
-0.0
- 0
-LINE
- 5
-B8
- 8
-0
- 10
-4.75
- 20
-6.0
- 30
-0.0
- 11
-4.75
- 21
-5.5
- 31
-0.0
- 0
-LINE
- 5
-B9
- 8
-0
- 10
-3.75
- 20
-6.0
- 30
-0.0
- 11
--0.25
- 21
-2.5
- 31
-0.0
- 0
-LINE
- 5
-BA
- 8
-0
- 10
-3.75
- 20
-6.0
- 30
-0.0
- 11
-3.75
- 21
-6.5
- 31
-0.0
- 0
-LINE
- 5
-BB
- 8
-0
- 10
-4.75
- 20
-6.0
- 30
-0.0
- 11
-3.75
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-BC
- 8
-0
- 10
-4.75
- 20
-6.5
- 30
-0.0
- 11
-4.75
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-BD
- 8
-0
- 10
-3.75
- 20
-6.5
- 30
-0.0
- 11
-4.75
- 21
-6.5
- 31
-0.0
- 0
-LINE
- 5
-BE
- 8
-0
- 10
--0.25
- 20
-3.0
- 30
-0.0
- 11
-3.75
- 21
-6.5
- 31
-0.0
- 0
-LINE
- 5
-BF
- 8
-0
- 10
--0.75
- 20
-1.0
- 30
-0.0
- 11
--0.75
- 21
-3.5
- 31
-0.0
- 0
-POLYLINE
- 5
-C0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-936
- 8
-0
- 10
--5.0
- 20
-3.251299999999957
- 30
-0.0
- 0
-VERTEX
- 5
-937
- 8
-0
- 10
--5.0
- 20
-3.5
- 30
-0.0
- 0
-VERTEX
- 5
-938
- 8
-0
- 10
--3.0
- 20
-3.5
- 30
-0.0
- 0
-VERTEX
- 5
-939
- 8
-0
- 10
--3.0
- 20
-1.5
- 30
-0.0
- 0
-VERTEX
- 5
-93A
- 8
-0
- 10
--5.0
- 20
-1.5
- 30
-0.0
- 0
-VERTEX
- 5
-93B
- 8
-0
- 10
--5.0
- 20
-2.5
- 30
-0.0
- 0
-SEQEND
- 5
-93C
- 8
-0
- 0
-POLYLINE
- 5
-C1
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-93D
- 8
-0
- 10
--5.5
- 20
-2.5
- 30
-0.0
- 0
-VERTEX
- 5
-93E
- 8
-0
- 10
--5.5
- 20
-3.25
- 30
-0.0
- 0
-VERTEX
- 5
-93F
- 8
-0
- 10
--4.5
- 20
-3.25
- 30
-0.0
- 0
-VERTEX
- 5
-940
- 8
-0
- 10
--4.5
- 20
-2.5
- 30
-0.0
- 0
-SEQEND
- 5
-941
- 8
-0
- 0
-LINE
- 5
-C2
- 8
-0
- 10
--3.5
- 20
-1.5
- 30
-0.0
- 11
--3.5
- 21
-1.0
- 31
-0.0
- 0
-LINE
- 5
-C3
- 8
-0
- 10
--4.5
- 20
-1.0
- 30
-0.0
- 11
--4.5
- 21
-1.5
- 31
-0.0
- 0
-POLYLINE
- 5
-C4
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-942
- 8
-0
- 10
--6.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-943
- 8
-0
- 10
--6.0
- 20
-1.0
- 30
-0.0
- 0
-VERTEX
- 5
-944
- 8
-0
- 10
-6.0
- 20
-1.0
- 30
-0.0
- 0
-VERTEX
- 5
-945
- 8
-0
- 10
-6.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-946
- 8
-0
- 0
-ENDBLK
- 5
-C6
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-ARMATUR_-_KÜCHENARMATUR_I0
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-ARMATUR_-_KÜCHENARMATUR_I0
- 1
-FAUCET_STANDARD_TOP
- 0
-POLYLINE
- 5
-E4
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-949
- 8
-0
- 10
--0.0058699999999945
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-94A
- 8
-0
- 10
--6.0
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-94B
- 8
-0
- 10
--6.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-94C
- 8
-0
- 10
-6.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-94D
- 8
-0
- 10
-6.0
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-94E
- 8
-0
- 10
-1.151949999999998
- 20
--2.0
- 30
-0.0
- 0
-SEQEND
- 5
-94F
- 8
-0
- 0
-CIRCLE
- 5
-E5
- 8
-0
- 10
--4.0
- 20
--1.0
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-E6
- 8
-0
- 10
-5.5
- 20
--1.25
- 30
-0.0
- 11
-4.9427800000000062
- 21
--1.25
- 31
-0.0
- 0
-LINE
- 5
-E7
- 8
-0
- 10
-4.9427800000000062
- 20
--0.75
- 30
-0.0
- 11
-5.5
- 21
--0.75
- 31
-0.0
- 0
-LINE
- 5
-E8
- 8
-0
- 10
-5.5
- 20
--0.75
- 30
-0.0
- 11
-5.5
- 21
--1.25
- 31
-0.0
- 0
-CIRCLE
- 5
-E9
- 8
-0
- 10
-4.0
- 20
--1.0
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-EA
- 8
-0
- 10
-0.0
- 20
--1.0
- 30
-0.0
- 40
-0.75
- 0
-LINE
- 5
-EB
- 8
-0
- 10
--5.5
- 20
--0.75
- 30
-0.0
- 11
--5.5
- 21
--1.25
- 31
-0.0
- 0
-LINE
- 5
-EC
- 8
-0
- 10
--5.5
- 20
--1.25
- 30
-0.0
- 11
--4.9427799999999991
- 21
--1.25
- 31
-0.0
- 0
-LINE
- 5
-ED
- 8
-0
- 10
--4.9427799999999991
- 20
--0.75
- 30
-0.0
- 11
--5.5
- 21
--0.75
- 31
-0.0
- 0
-ARC
- 5
-EE
- 8
-0
- 10
-4.0
- 20
--7.9282000000000021
- 30
-0.0
- 40
-0.5
- 50
-209.99999999999989
- 51
-30.0
- 0
-LINE
- 5
-EF
- 8
-0
- 10
--0.147750000000002
- 20
--1.7441000000000031
- 30
-0.0
- 11
-3.566980000000008
- 21
--8.1782000000000021
- 31
-0.0
- 0
-LINE
- 5
-F0
- 8
-0
- 10
-4.433010000000003
- 20
--7.6782000000000021
- 30
-0.0
- 11
-0.7182800000000073
- 21
--1.244100000000002
- 31
-0.0
- 0
-ENDBLK
- 5
-F2
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-ARMATUR_-_EINHEBELMISCHER_
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-ARMATUR_-_EINHEBELMISCHER_
- 1
-FAUCET_WASHERLESS_FRONT
- 0
-LINE
- 5
-105
- 8
-0
- 10
--0.75
- 20
-1.0
- 30
-0.0
- 11
-0.75
- 21
-1.0
- 31
-0.0
- 0
-LINE
- 5
-106
- 8
-0
- 10
--0.5
- 20
-4.0
- 30
-0.0
- 11
-0.5
- 21
-4.0
- 31
-0.0
- 0
-LINE
- 5
-107
- 8
-0
- 10
--0.5
- 20
-4.0
- 30
-0.0
- 11
--2.0
- 21
-5.5
- 31
-0.0
- 0
-LINE
- 5
-108
- 8
-0
- 10
--1.0
- 20
-5.5
- 30
-0.0
- 11
-0.5
- 21
-4.0
- 31
-0.0
- 0
-LINE
- 5
-109
- 8
-0
- 10
--1.0
- 20
-5.5
- 30
-0.0
- 11
--1.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-10A
- 8
-0
- 10
--2.0
- 20
-5.5
- 30
-0.0
- 11
--1.0
- 21
-5.5
- 31
-0.0
- 0
-LINE
- 5
-10B
- 8
-0
- 10
--2.0
- 20
-6.0
- 30
-0.0
- 11
--2.0
- 21
-5.5
- 31
-0.0
- 0
-LINE
- 5
-10C
- 8
-0
- 10
--1.0
- 20
-6.0
- 30
-0.0
- 11
--2.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-10D
- 8
-0
- 10
-0.5
- 20
-4.0
- 30
-0.0
- 11
--1.0
- 21
-6.0
- 31
-0.0
- 0
-ARC
- 5
-10E
- 8
-0
- 10
-1.254260000000001
- 20
-3.030199999999978
- 30
-0.0
- 40
-2.0044819999999981
- 50
-151.06460000000001
- 51
-180.86289999999991
- 0
-ARC
- 5
-10F
- 8
-0
- 10
--1.254260000000001
- 20
-3.030199999999978
- 30
-0.0
- 40
-2.0044819999999981
- 50
-359.1370999999998
- 51
-28.935359999999999
- 0
-LINE
- 5
-110
- 8
-0
- 10
-0.75
- 20
-1.5
- 30
-0.0
- 11
-0.75
- 21
-0.5
- 31
-0.0
- 0
-LINE
- 5
-111
- 8
-0
- 10
-0.75
- 20
-3.0
- 30
-0.0
- 11
-0.75
- 21
-2.738600000000019
- 31
-0.0
- 0
-LINE
- 5
-112
- 8
-0
- 10
--0.25
- 20
-1.5
- 30
-0.0
- 11
--0.25
- 21
-2.0
- 31
-0.0
- 0
-LINE
- 5
-113
- 8
-0
- 10
-0.75
- 20
-1.5
- 30
-0.0
- 11
--0.25
- 21
-1.5
- 31
-0.0
- 0
-LINE
- 5
-114
- 8
-0
- 10
-0.75
- 20
-1.5
- 30
-0.0
- 11
-4.0874200000000078
- 21
-4.002999999999985
- 31
-0.0
- 0
-LINE
- 5
-115
- 8
-0
- 10
--0.75
- 20
-3.0
- 30
-0.0
- 11
-0.75
- 21
-3.0
- 31
-0.0
- 0
-LINE
- 5
-116
- 8
-0
- 10
--0.75
- 20
-0.5
- 30
-0.0
- 11
--0.75
- 21
-3.0
- 31
-0.0
- 0
-LINE
- 5
-117
- 8
-0
- 10
-3.75
- 20
-4.0
- 30
-0.0
- 11
-3.75
- 21
-4.5
- 31
-0.0
- 0
-LINE
- 5
-118
- 8
-0
- 10
-4.75
- 20
-4.0
- 30
-0.0
- 11
-3.75
- 21
-4.0
- 31
-0.0
- 0
-LINE
- 5
-119
- 8
-0
- 10
-4.75
- 20
-4.5
- 30
-0.0
- 11
-4.75
- 21
-4.0
- 31
-0.0
- 0
-LINE
- 5
-11A
- 8
-0
- 10
-3.75
- 20
-4.5
- 30
-0.0
- 11
--0.25
- 21
-1.5
- 31
-0.0
- 0
-LINE
- 5
-11B
- 8
-0
- 10
-3.75
- 20
-4.5
- 30
-0.0
- 11
-3.75
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-11C
- 8
-0
- 10
-4.75
- 20
-4.5
- 30
-0.0
- 11
-3.75
- 21
-4.5
- 31
-0.0
- 0
-LINE
- 5
-11D
- 8
-0
- 10
-4.75
- 20
-5.0
- 30
-0.0
- 11
-4.75
- 21
-4.5
- 31
-0.0
- 0
-LINE
- 5
-11E
- 8
-0
- 10
-3.75
- 20
-5.0
- 30
-0.0
- 11
-4.75
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-11F
- 8
-0
- 10
--0.25
- 20
-2.0
- 30
-0.0
- 11
-3.75
- 21
-5.0
- 31
-0.0
- 0
-POLYLINE
- 5
-120
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-952
- 8
-0
- 10
--6.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-953
- 8
-0
- 10
--6.0
- 20
-0.5
- 30
-0.0
- 0
-VERTEX
- 5
-954
- 8
-0
- 10
-6.0
- 20
-0.5
- 30
-0.0
- 0
-VERTEX
- 5
-955
- 8
-0
- 10
-6.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-956
- 8
-0
- 0
-ENDBLK
- 5
-122
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-ARMATUR_-_EINHEBELMISCHER0
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-ARMATUR_-_EINHEBELMISCHER0
- 1
-FAUCET_WASHERLESS_TOP
- 0
-POLYLINE
- 5
-12B
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-959
- 8
-0
- 10
--0.0067515000000018
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-95A
- 8
-0
- 10
--0.1165915000000002
- 20
--2.0
- 30
-0.0
- 0
-SEQEND
- 5
-95B
- 8
-0
- 0
-ARC
- 5
-12C
- 8
-0
- 10
--0.0000015000000015
- 20
--1.0
- 30
-0.0
- 40
-0.75
- 50
-269.22460000000001
- 51
-216.2304
- 0
-LINE
- 5
-12D
- 8
-0
- 10
--2.261461499999998
- 20
--4.3369999999999891
- 30
-0.0
- 11
--1.3704615
- 21
--4.790999999999995
- 31
-0.0
- 0
-ARC
- 5
-12E
- 8
-0
- 10
-3.9999984999999998
- 20
--7.9282000000000021
- 30
-0.0
- 40
-0.5
- 50
-209.99999999999989
- 51
-30.0
- 0
-LINE
- 5
-12F
- 8
-0
- 10
-0.0793784999999989
- 20
--0.2599999999999909
- 30
-0.0
- 11
--2.261461499999998
- 21
--4.3369999999999891
- 31
-0.0
- 0
-LINE
- 5
-130
- 8
-0
- 10
--1.3704615
- 20
--4.790999999999995
- 30
-0.0
- 11
-0.5507084999999991
- 21
--0.5036999999999808
- 31
-0.0
- 0
-LINE
- 5
-131
- 8
-0
- 10
--0.0600815000000008
- 20
--1.895899999999983
- 30
-0.0
- 11
-3.5669884999999968
- 21
--8.1782000000000021
- 31
-0.0
- 0
-LINE
- 5
-132
- 8
-0
- 10
-4.4330184999999984
- 20
--7.6782000000000021
- 30
-0.0
- 11
-0.7182785000000003
- 21
--1.244100000000002
- 31
-0.0
- 0
-POLYLINE
- 5
-133
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-95C
- 8
-0
- 10
--0.9178414999999995
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-95D
- 8
-0
- 10
--5.9999985000000011
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-95E
- 8
-0
- 10
--5.9999985000000011
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-95F
- 8
-0
- 10
-5.9999985000000002
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-960
- 8
-0
- 10
-5.9999985000000002
- 20
--2.0
- 30
-0.0
- 0
-VERTEX
- 5
-961
- 8
-0
- 10
-1.1565984999999981
- 20
--2.0
- 30
-0.0
- 0
-SEQEND
- 5
-962
- 8
-0
- 0
-ENDBLK
- 5
-135
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-EIS-_UND_WASSERSPENDER
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-EIS-_UND_WASSERSPENDER
- 1
-ICE_AND_WATER_MAKER
- 0
-LINE
- 5
-13D
- 8
-0
- 10
-6.5
- 20
-8.0
- 30
-0.0
- 11
-7.0
- 21
-8.0
- 31
-0.0
- 0
-LINE
- 5
-13E
- 8
-0
- 10
-7.0
- 20
-8.5
- 30
-0.0
- 11
-6.5
- 21
-8.5
- 31
-0.0
- 0
-LINE
- 5
-13F
- 8
-0
- 10
-6.75
- 20
-10.25
- 30
-0.0
- 11
-5.75
- 21
-10.25
- 31
-0.0
- 0
-LINE
- 5
-140
- 8
-0
- 10
-7.0
- 20
-9.5
- 30
-0.0
- 11
-6.75
- 21
-10.25
- 31
-0.0
- 0
-LINE
- 5
-141
- 8
-0
- 10
-5.75
- 20
-10.25
- 30
-0.0
- 11
-5.5
- 21
-9.5
- 31
-0.0
- 0
-LINE
- 5
-142
- 8
-0
- 10
-5.5
- 20
-9.5
- 30
-0.0
- 11
-7.0
- 21
-9.5
- 31
-0.0
- 0
-LINE
- 5
-143
- 8
-0
- 10
-6.5
- 20
-9.0
- 30
-0.0
- 11
-6.0
- 21
-9.0
- 31
-0.0
- 0
-LINE
- 5
-144
- 8
-0
- 10
-6.5
- 20
-7.5
- 30
-0.0
- 11
-6.5
- 21
-9.0
- 31
-0.0
- 0
-LINE
- 5
-145
- 8
-0
- 10
-7.0
- 20
-7.0
- 30
-0.0
- 11
-6.5
- 21
-7.5
- 31
-0.0
- 0
-LINE
- 5
-146
- 8
-0
- 10
-5.5
- 20
-7.0
- 30
-0.0
- 11
-7.0
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-147
- 8
-0
- 10
-6.0
- 20
-7.5
- 30
-0.0
- 11
-5.5
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-148
- 8
-0
- 10
-6.0
- 20
-9.0
- 30
-0.0
- 11
-6.0
- 21
-7.5
- 31
-0.0
- 0
-LINE
- 5
-149
- 8
-0
- 10
-7.5
- 20
-2.25
- 30
-0.0
- 11
-7.0
- 21
-2.75
- 31
-0.0
- 0
-LINE
- 5
-14A
- 8
-0
- 10
-7.0
- 20
-3.0
- 30
-0.0
- 11
-8.0
- 21
-2.0
- 31
-0.0
- 0
-LINE
- 5
-14B
- 8
-0
- 10
-7.0
- 20
-3.0
- 30
-0.0
- 11
-7.0
- 21
-11.0
- 31
-0.0
- 0
-LINE
- 5
-14C
- 8
-0
- 10
-3.5636000000000081
- 20
-9.0
- 30
-0.0
- 11
-3.5
- 21
-9.0
- 31
-0.0
- 0
-LINE
- 5
-14D
- 8
-0
- 10
-4.0
- 20
-9.0
- 30
-0.0
- 11
-3.941600000000022
- 21
-9.0
- 31
-0.0
- 0
-POLYLINE
- 5
-14E
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-965
- 8
-0
- 10
-3.5625
- 20
-8.0
- 30
-0.0
- 0
-VERTEX
- 5
-966
- 8
-0
- 10
-3.5625
- 20
-9.5
- 30
-0.0
- 0
-VERTEX
- 5
-967
- 8
-0
- 10
-3.9375
- 20
-9.5
- 30
-0.0
- 0
-VERTEX
- 5
-968
- 8
-0
- 10
-3.9375
- 20
-8.0
- 30
-0.0
- 0
-SEQEND
- 5
-969
- 8
-0
- 0
-LINE
- 5
-14F
- 8
-0
- 10
-3.5
- 20
-8.5
- 30
-0.0
- 11
-3.0
- 21
-8.5
- 31
-0.0
- 0
-LINE
- 5
-150
- 8
-0
- 10
-3.0
- 20
-8.0
- 30
-0.0
- 11
-3.5
- 21
-8.0
- 31
-0.0
- 0
-LINE
- 5
-151
- 8
-0
- 10
-4.0
- 20
-7.5
- 30
-0.0
- 11
-4.0
- 21
-9.0
- 31
-0.0
- 0
-LINE
- 5
-152
- 8
-0
- 10
-4.5
- 20
-7.0
- 30
-0.0
- 11
-4.0
- 21
-7.5
- 31
-0.0
- 0
-LINE
- 5
-153
- 8
-0
- 10
-3.0
- 20
-7.0
- 30
-0.0
- 11
-4.5
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-154
- 8
-0
- 10
-3.5
- 20
-7.5
- 30
-0.0
- 11
-3.0
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-155
- 8
-0
- 10
-3.5
- 20
-9.0
- 30
-0.0
- 11
-3.5
- 21
-7.5
- 31
-0.0
- 0
-LINE
- 5
-156
- 8
-0
- 10
-3.0
- 20
-2.75
- 30
-0.0
- 11
-2.5
- 21
-2.25
- 31
-0.0
- 0
-LINE
- 5
-157
- 8
-0
- 10
-2.0
- 20
-2.0
- 30
-0.0
- 11
-3.0
- 21
-3.0
- 31
-0.0
- 0
-LINE
- 5
-158
- 8
-0
- 10
-3.0
- 20
-11.0
- 30
-0.0
- 11
-3.0
- 21
-3.0
- 31
-0.0
- 0
-LINE
- 5
-159
- 8
-0
- 10
-2.990200000000014
- 20
-2.7400000000000091
- 30
-0.0
- 11
-7.0100000000000193
- 21
-2.7400000000000091
- 31
-0.0
- 0
-LINE
- 5
-15A
- 8
-0
- 10
-2.9817000000000169
- 20
-2.7300000000000169
- 30
-0.0
- 11
-7.0203999999999951
- 21
-2.7300000000000169
- 31
-0.0
- 0
-LINE
- 5
-15B
- 8
-0
- 10
-2.970899999999999
- 20
-2.719999999999998
- 30
-0.0
- 11
-7.0302000000000078
- 21
-2.719999999999998
- 31
-0.0
- 0
-LINE
- 5
-15C
- 8
-0
- 10
-2.9602000000000128
- 20
-2.7100000000000062
- 30
-0.0
- 11
-7.0400999999999954
- 21
-2.7100000000000062
- 31
-0.0
- 0
-LINE
- 5
-15D
- 8
-0
- 10
-2.9505000000000039
- 20
-2.7000000000000171
- 30
-0.0
- 11
-7.0500000000000123
- 21
-2.7000000000000171
- 31
-0.0
- 0
-LINE
- 5
-15E
- 8
-0
- 10
-2.938700000000011
- 20
-2.6899999999999959
- 30
-0.0
- 11
-7.0598999999999972
- 21
-2.6899999999999959
- 31
-0.0
- 0
-LINE
- 5
-15F
- 8
-0
- 10
-2.9312000000000169
- 20
-2.680000000000005
- 30
-0.0
- 11
-7.0703000000000022
- 21
-2.680000000000005
- 31
-0.0
- 0
-LINE
- 5
-160
- 8
-0
- 10
-2.9205000000000041
- 20
-2.670000000000015
- 30
-0.0
- 11
-7.080600000000004
- 21
-2.670000000000015
- 31
-0.0
- 0
-LINE
- 5
-161
- 8
-0
- 10
-2.9107999999999929
- 20
-2.6599999999999961
- 30
-0.0
- 11
-7.0904999999999907
- 21
-2.6599999999999961
- 31
-0.0
- 0
-LINE
- 5
-162
- 8
-0
- 10
-2.900100000000009
- 20
-2.6500000000000039
- 30
-0.0
- 11
-7.1004000000000076
- 21
-2.6500000000000039
- 31
-0.0
- 0
-LINE
- 5
-163
- 8
-0
- 10
-2.891500000000006
- 20
-2.6400000000000139
- 30
-0.0
- 11
-7.1098000000000079
- 21
-2.6400000000000139
- 31
-0.0
- 0
-LINE
- 5
-164
- 8
-0
- 10
-2.879700000000013
- 20
-2.629999999999995
- 30
-0.0
- 11
-7.1202000000000121
- 21
-2.629999999999995
- 31
-0.0
- 0
-LINE
- 5
-165
- 8
-0
- 10
-2.8701000000000061
- 20
-2.6200000000000032
- 30
-0.0
- 11
-7.1299999999999946
- 21
-2.6200000000000032
- 31
-0.0
- 0
-LINE
- 5
-166
- 8
-0
- 10
-2.8603999999999981
- 20
-2.6100000000000132
- 30
-0.0
- 11
-7.1399000000000123
- 21
-2.6100000000000132
- 31
-0.0
- 0
-LINE
- 5
-167
- 8
-0
- 10
-2.8517999999999968
- 20
-2.599999999999993
- 30
-0.0
- 11
-7.149799999999999
- 21
-2.599999999999993
- 31
-0.0
- 0
-LINE
- 5
-168
- 8
-0
- 10
-2.8425000000000011
- 20
-2.5900000000000021
- 30
-0.0
- 11
-7.1603000000000048
- 21
-2.5900000000000021
- 31
-0.0
- 0
-LINE
- 5
-169
- 8
-0
- 10
-2.8320999999999952
- 20
-2.5800000000000112
- 30
-0.0
- 11
-7.1699000000000126
- 21
-2.5800000000000112
- 31
-0.0
- 0
-LINE
- 5
-16A
- 8
-0
- 10
-2.8226999999999971
- 20
-2.5699999999999932
- 30
-0.0
- 11
-7.1804999999999941
- 21
-2.5699999999999932
- 31
-0.0
- 0
-LINE
- 5
-16B
- 8
-0
- 10
-2.8112000000000128
- 20
-2.5600000000000018
- 30
-0.0
- 11
-7.190100000000001
- 21
-2.5600000000000018
- 31
-0.0
- 0
-LINE
- 5
-16C
- 8
-0
- 10
-2.8019000000000172
- 20
-2.55000000000001
- 30
-0.0
- 11
-7.1997000000000071
- 21
-2.55000000000001
- 31
-0.0
- 0
-LINE
- 5
-16D
- 8
-0
- 10
-2.790400000000004
- 20
-2.5399999999999912
- 30
-0.0
- 11
-7.2104000000000212
- 21
-2.5399999999999912
- 31
-0.0
- 0
-LINE
- 5
-16E
- 8
-0
- 10
-2.782100000000014
- 20
-2.5299999999999998
- 30
-0.0
- 11
-7.2210000000000019
- 21
-2.5299999999999998
- 31
-0.0
- 0
-LINE
- 5
-16F
- 8
-0
- 10
-2.7707000000000042
- 20
-2.5200000000000089
- 30
-0.0
- 11
-7.2296000000000031
- 21
-2.5200000000000089
- 31
-0.0
- 0
-LINE
- 5
-170
- 8
-0
- 10
-2.7623000000000091
- 20
-2.510000000000018
- 30
-0.0
- 11
-7.2412999999999954
- 21
-2.510000000000018
- 31
-0.0
- 0
-LINE
- 5
-171
- 8
-0
- 10
-2.750900000000001
- 20
-2.5
- 30
-0.0
- 11
-7.2509000000000006
- 21
-2.5
- 31
-0.0
- 0
-LINE
- 5
-172
- 8
-0
- 10
-2.7426000000000088
- 20
-2.4900000000000091
- 30
-0.0
- 11
-7.2605000000000084
- 21
-2.4900000000000091
- 31
-0.0
- 0
-LINE
- 5
-173
- 8
-0
- 10
-2.7301000000000211
- 20
-2.4800000000000182
- 30
-0.0
- 11
-7.2701000000000127
- 21
-2.4800000000000182
- 31
-0.0
- 0
-LINE
- 5
-174
- 8
-0
- 10
-2.7218000000000009
- 20
-2.4699999999999971
- 30
-0.0
- 11
-7.2797000000000178
- 21
-2.4699999999999971
- 31
-0.0
- 0
-LINE
- 5
-175
- 8
-0
- 10
-2.7113999999999971
- 20
-2.4600000000000071
- 30
-0.0
- 11
-7.2914000000000092
- 21
-2.4600000000000071
- 31
-0.0
- 0
-LINE
- 5
-176
- 8
-0
- 10
-2.7009000000000181
- 20
-2.4500000000000171
- 30
-0.0
- 11
-7.299900000000008
- 21
-2.4500000000000171
- 31
-0.0
- 0
-LINE
- 5
-177
- 8
-0
- 10
-2.6895000000000091
- 20
-2.4399999999999959
- 30
-0.0
- 11
-7.3095000000000132
- 21
-2.4399999999999959
- 31
-0.0
- 0
-LINE
- 5
-178
- 8
-0
- 10
-2.6812000000000178
- 20
-2.430000000000005
- 30
-0.0
- 11
-7.321300000000007
- 21
-2.430000000000005
- 31
-0.0
- 0
-LINE
- 5
-179
- 8
-0
- 10
-2.6708000000000141
- 20
-2.420000000000015
- 30
-0.0
- 11
-7.3309000000000131
- 21
-2.420000000000015
- 31
-0.0
- 0
-LINE
- 5
-17A
- 8
-0
- 10
-2.660400000000009
- 20
-2.4099999999999961
- 30
-0.0
- 11
-7.3404999999999907
- 21
-2.4099999999999961
- 31
-0.0
- 0
-LINE
- 5
-17B
- 8
-0
- 10
-2.6500000000000039
- 20
-2.4000000000000039
- 30
-0.0
- 11
-7.3500999999999967
- 21
-2.4000000000000039
- 31
-0.0
- 0
-LINE
- 5
-17C
- 8
-0
- 10
-2.6406000000000049
- 20
-2.3900000000000139
- 30
-0.0
- 11
-7.3607000000000076
- 21
-2.3900000000000139
- 31
-0.0
- 0
-LINE
- 5
-17D
- 8
-0
- 10
-2.6302000000000021
- 20
-2.379999999999995
- 30
-0.0
- 11
-7.3703000000000118
- 21
-2.379999999999995
- 31
-0.0
- 0
-LINE
- 5
-17E
- 8
-0
- 10
-2.621900000000009
- 20
-2.3700000000000032
- 30
-0.0
- 11
-7.3810000000000002
- 21
-2.3700000000000032
- 31
-0.0
- 0
-LINE
- 5
-17F
- 8
-0
- 10
-2.6094000000000221
- 20
-2.3600000000000132
- 30
-0.0
- 11
-7.3916000000000111
- 21
-2.3600000000000132
- 31
-0.0
- 0
-LINE
- 5
-180
- 8
-0
- 10
-2.6011000000000011
- 20
-2.349999999999993
- 30
-0.0
- 11
-7.4002000000000132
- 21
-2.349999999999993
- 31
-0.0
- 0
-LINE
- 5
-181
- 8
-0
- 10
-2.5896000000000181
- 20
-2.3400000000000021
- 30
-0.0
- 11
-7.4119000000000019
- 21
-2.3400000000000021
- 31
-0.0
- 0
-LINE
- 5
-182
- 8
-0
- 10
-2.581299999999997
- 20
-2.3300000000000112
- 30
-0.0
- 11
-7.4215000000000071
- 21
-2.3300000000000112
- 31
-0.0
- 0
-LINE
- 5
-183
- 8
-0
- 10
-2.5698000000000141
- 20
-2.3199999999999932
- 30
-0.0
- 11
-7.4311000000000131
- 21
-2.3199999999999932
- 31
-0.0
- 0
-LINE
- 5
-184
- 8
-0
- 10
-2.5614999999999948
- 20
-2.3100000000000018
- 30
-0.0
- 11
-7.4416999999999973
- 21
-2.3100000000000018
- 31
-0.0
- 0
-LINE
- 5
-185
- 8
-0
- 10
-2.5501000000000138
- 20
-2.30000000000001
- 30
-0.0
- 11
-7.4524000000000123
- 21
-2.30000000000001
- 31
-0.0
- 0
-LINE
- 5
-186
- 8
-0
- 10
-2.5407000000000148
- 20
-2.2899999999999912
- 30
-0.0
- 11
-7.4609000000000076
- 21
-2.2899999999999912
- 31
-0.0
- 0
-LINE
- 5
-187
- 8
-0
- 10
-2.529300000000005
- 20
-2.2799999999999998
- 30
-0.0
- 11
-7.4705000000000137
- 21
-2.2799999999999998
- 31
-0.0
- 0
-LINE
- 5
-188
- 8
-0
- 10
-2.519900000000006
- 20
-2.2700000000000089
- 30
-0.0
- 11
-7.4812000000000012
- 21
-2.2700000000000089
- 31
-0.0
- 0
-LINE
- 5
-189
- 8
-0
- 10
-2.5095000000000018
- 20
-2.260000000000018
- 30
-0.0
- 11
-7.4908000000000081
- 21
-2.260000000000018
- 31
-0.0
- 0
-LINE
- 5
-18A
- 8
-0
- 10
-7.0
- 20
-2.75
- 30
-0.0
- 11
-3.0
- 21
-2.75
- 31
-0.0
- 0
-LINE
- 5
-18B
- 8
-0
- 10
-2.5
- 20
-2.25
- 30
-0.0
- 11
-7.5
- 21
-2.25
- 31
-0.0
- 0
-LINE
- 5
-18C
- 8
-0
- 10
-4.0
- 20
-8.0
- 30
-0.0
- 11
-6.0
- 21
-8.0
- 31
-0.0
- 0
-LINE
- 5
-18D
- 8
-0
- 10
-6.0
- 20
-8.5
- 30
-0.0
- 11
-4.0
- 21
-8.5
- 31
-0.0
- 0
-LINE
- 5
-18E
- 8
-0
- 10
-3.0
- 20
-3.0
- 30
-0.0
- 11
-7.0
- 21
-3.0
- 31
-0.0
- 0
-POLYLINE
- 5
-18F
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-96A
- 8
-0
- 10
-2.0
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-96B
- 8
-0
- 10
-2.0
- 20
-11.0
- 30
-0.0
- 0
-VERTEX
- 5
-96C
- 8
-0
- 10
-8.0
- 20
-11.0
- 30
-0.0
- 0
-VERTEX
- 5
-96D
- 8
-0
- 10
-8.0
- 20
-2.0
- 30
-0.0
- 0
-SEQEND
- 5
-96E
- 8
-0
- 0
-POLYLINE
- 5
-190
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-96F
- 8
-0
- 10
-2.0
- 20
-12.0
- 30
-0.0
- 0
-VERTEX
- 5
-970
- 8
-0
- 10
-2.0
- 20
-16.0
- 30
-0.0
- 0
-VERTEX
- 5
-971
- 8
-0
- 10
-8.0
- 20
-16.0
- 30
-0.0
- 0
-VERTEX
- 5
-972
- 8
-0
- 10
-8.0
- 20
-12.0
- 30
-0.0
- 0
-SEQEND
- 5
-973
- 8
-0
- 0
-POLYLINE
- 5
-191
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-974
- 8
-0
- 10
-1.0
- 20
-1.0
- 30
-0.0
- 0
-VERTEX
- 5
-975
- 8
-0
- 10
-1.0
- 20
-17.0
- 30
-0.0
- 0
-VERTEX
- 5
-976
- 8
-0
- 10
-9.0
- 20
-17.0
- 30
-0.0
- 0
-VERTEX
- 5
-977
- 8
-0
- 10
-9.0
- 20
-1.0
- 30
-0.0
- 0
-SEQEND
- 5
-978
- 8
-0
- 0
-POLYLINE
- 5
-192
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-979
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-97A
- 8
-0
- 10
-0.0
- 20
-18.0
- 30
-0.0
- 0
-VERTEX
- 5
-97B
- 8
-0
- 10
-10.0
- 20
-18.0
- 30
-0.0
- 0
-VERTEX
- 5
-97C
- 8
-0
- 10
-10.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-97D
- 8
-0
- 0
-ENDBLK
- 5
-194
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-KÜCHENBLOCK_-_2100_X_2400_
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-KÜCHENBLOCK_-_2100_X_2400_
- 1
-KITCHEN_LAYOUT_7X8_PARTIAL_WALL
- 0
-LINE
- 5
-19E
- 8
-0
- 10
-0.0
- 20
-24.0
- 30
-0.0
- 11
-96.0
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-19F
- 8
-0
- 10
-96.0
- 20
-0.0
- 30
-0.0
- 11
-0.0
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-1A0
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 11
-0.0
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-1A1
- 8
-0
- 10
-96.0
- 20
-24.0
- 30
-0.0
- 11
-96.0
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-1A4
- 8
-0
- 10
-96.0
- 20
-60.0
- 30
-0.0
- 11
-34.0
- 21
-60.0
- 31
-0.0
- 0
-LINE
- 5
-1A5
- 8
-0
- 10
-34.0
- 20
-84.0
- 30
-0.0
- 11
-96.0
- 21
-84.0
- 31
-0.0
- 0
-LINE
- 5
-1A6
- 8
-0
- 10
-34.0
- 20
-60.0
- 30
-0.0
- 11
-34.0
- 21
-84.0
- 31
-0.0
- 0
-LINE
- 5
-1A7
- 8
-0
- 10
-96.0
- 20
-84.0
- 30
-0.0
- 11
-96.0
- 21
-60.0
- 31
-0.0
- 0
-ARC
- 5
-1A8
- 8
-0
- 10
-34.5
- 20
-6.5
- 30
-0.0
- 40
-1.0
- 50
-180.0
- 51
-270.0
- 0
-ARC
- 5
-1A9
- 8
-0
- 10
-33.5
- 20
-1.5
- 30
-0.0
- 40
-1.5
- 50
-180.0
- 51
-270.0
- 0
-CIRCLE
- 5
-1AA
- 8
-0
- 10
-40.499999999999993
- 20
-12.5
- 30
-0.0
- 40
-0.5
- 0
-CIRCLE
- 5
-1AB
- 8
-0
- 10
-40.499999999999993
- 20
-12.5
- 30
-0.0
- 40
-1.0
- 0
-ARC
- 5
-1AC
- 8
-0
- 10
-34.5
- 20
-18.5
- 30
-0.0
- 40
-1.0
- 50
-90.0
- 51
-180.0
- 0
-ARC
- 5
-1AD
- 8
-0
- 10
-33.5
- 20
-19.5
- 30
-0.0
- 40
-1.5
- 50
-90.0
- 51
-180.0
- 0
-POLYLINE
- 5
-1AE
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-980
- 8
-0
- 10
-33.5
- 20
-6.5
- 30
-0.0
- 0
-VERTEX
- 5
-981
- 8
-0
- 10
-33.5
- 20
-18.5
- 30
-0.0
- 0
-SEQEND
- 5
-982
- 8
-0
- 0
-POLYLINE
- 5
-1AF
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-983
- 8
-0
- 10
-32.0
- 20
-1.5
- 30
-0.0
- 0
-VERTEX
- 5
-984
- 8
-0
- 10
-32.0
- 20
-19.5
- 30
-0.0
- 0
-SEQEND
- 5
-985
- 8
-0
- 0
-ARC
- 5
-1B0
- 8
-0
- 10
-46.250000000000021
- 20
-6.5
- 30
-0.0
- 40
-1.0
- 50
-270.0
- 51
-0.0
- 0
-ARC
- 5
-1B1
- 8
-0
- 10
-49.750000000000028
- 20
-6.5
- 30
-0.0
- 40
-1.0
- 50
-180.0
- 51
-270.0
- 0
-ARC
- 5
-1B2
- 8
-0
- 10
-61.500000000000028
- 20
-6.5
- 30
-0.0
- 40
-1.0
- 50
-270.0
- 51
-0.0
- 0
-ARC
- 5
-1B3
- 8
-0
- 10
-62.500000000000028
- 20
-1.5
- 30
-0.0
- 40
-1.5
- 50
-270.0
- 51
-0.0
- 0
-POLYLINE
- 5
-1B4
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-986
- 8
-0
- 10
-61.500000000000028
- 20
-5.5
- 30
-0.0
- 0
-VERTEX
- 5
-987
- 8
-0
- 10
-49.750000000000028
- 20
-5.5
- 30
-0.0
- 0
-SEQEND
- 5
-988
- 8
-0
- 0
-ARC
- 5
-1B5
- 8
-0
- 10
-46.250000000000021
- 20
-18.5
- 30
-0.0
- 40
-1.0
- 50
-0.0
- 51
-90.0
- 0
-ARC
- 5
-1B6
- 8
-0
- 10
-49.750000000000028
- 20
-18.5
- 30
-0.0
- 40
-1.0
- 50
-90.0
- 51
-180.0
- 0
-ARC
- 5
-1B7
- 8
-0
- 10
-61.500000000000028
- 20
-18.5
- 30
-0.0
- 40
-1.0
- 50
-0.0
- 51
-90.0
- 0
-ARC
- 5
-1B8
- 8
-0
- 10
-62.500000000000028
- 20
-19.5
- 30
-0.0
- 40
-1.5
- 50
-0.0
- 51
-90.0
- 0
-CIRCLE
- 5
-1B9
- 8
-0
- 10
-55.500000000000028
- 20
-12.5
- 30
-0.0
- 40
-0.5
- 0
-CIRCLE
- 5
-1BA
- 8
-0
- 10
-55.500000000000028
- 20
-12.5
- 30
-0.0
- 40
-1.0
- 0
-POLYLINE
- 5
-1BB
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-989
- 8
-0
- 10
-49.750000000000028
- 20
-19.5
- 30
-0.0
- 0
-VERTEX
- 5
-98A
- 8
-0
- 10
-61.500000000000028
- 20
-19.5
- 30
-0.0
- 0
-SEQEND
- 5
-98B
- 8
-0
- 0
-LINE
- 5
-1BC
- 8
-0
- 10
-47.250000000000028
- 20
-6.5
- 30
-0.0
- 11
-47.250000000000028
- 21
-18.5
- 31
-0.0
- 0
-LINE
- 5
-1BD
- 8
-0
- 10
-48.750000000000028
- 20
-18.5
- 30
-0.0
- 11
-48.750000000000028
- 21
-6.5
- 31
-0.0
- 0
-POLYLINE
- 5
-1BE
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-98C
- 8
-0
- 10
-62.500000000000028
- 20
-18.5
- 30
-0.0
- 0
-VERTEX
- 5
-98D
- 8
-0
- 10
-62.500000000000028
- 20
-6.5
- 30
-0.0
- 0
-SEQEND
- 5
-98E
- 8
-0
- 0
-POLYLINE
- 5
-1BF
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-98F
- 8
-0
- 10
-64.000000000000028
- 20
-19.5
- 30
-0.0
- 0
-VERTEX
- 5
-990
- 8
-0
- 10
-64.000000000000028
- 20
-1.5
- 30
-0.0
- 0
-SEQEND
- 5
-991
- 8
-0
- 0
-POLYLINE
- 5
-1C0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-992
- 8
-0
- 10
-46.250000000000021
- 20
-5.5
- 30
-0.0
- 0
-VERTEX
- 5
-993
- 8
-0
- 10
-34.5
- 20
-5.5
- 30
-0.0
- 0
-SEQEND
- 5
-994
- 8
-0
- 0
-POLYLINE
- 5
-1C1
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-995
- 8
-0
- 10
-34.5
- 20
-19.5
- 30
-0.0
- 0
-VERTEX
- 5
-996
- 8
-0
- 10
-46.250000000000021
- 20
-19.5
- 30
-0.0
- 0
-SEQEND
- 5
-997
- 8
-0
- 0
-POLYLINE
- 5
-1C2
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-998
- 8
-0
- 10
-33.5
- 20
-21.0
- 30
-0.0
- 0
-VERTEX
- 5
-999
- 8
-0
- 10
-62.500000000000028
- 20
-21.0
- 30
-0.0
- 0
-SEQEND
- 5
-99A
- 8
-0
- 0
-POLYLINE
- 5
-1C3
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-99B
- 8
-0
- 10
-62.500000000000028
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-99C
- 8
-0
- 10
-33.5
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-99D
- 8
-0
- 0
-LINE
- 5
-1C4
- 8
-0
- 10
-64.000000000000028
- 20
-4.0
- 30
-0.0
- 11
-32.0
- 21
-4.0
- 31
-0.0
- 0
-LINE
- 5
-1C5
- 8
-0
- 10
-30.999999999999989
- 20
-54.999959999999987
- 30
-0.0
- 11
-30.999999999999989
- 21
-55.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1C6
- 8
-0
- 10
-31.999999999999989
- 20
-54.999959999999987
- 30
-0.0
- 11
-30.999999999999989
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1C7
- 8
-0
- 10
-31.999999999999989
- 20
-55.999959999999987
- 30
-0.0
- 11
-31.999999999999989
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1C8
- 8
-0
- 10
--0.0000000000000071
- 20
-56.999959999999987
- 30
-0.0
- 11
-32.999999999999993
- 21
-56.999959999999987
- 31
-0.0
- 0
-POLYLINE
- 5
-1C9
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-99E
- 8
-0
- 10
--0.0000000000000071
- 20
-55.999959999999987
- 30
-0.0
- 0
-VERTEX
- 5
-99F
- 8
-0
- 10
--0.0000000000000071
- 20
-84.0
- 30
-0.0
- 0
-VERTEX
- 5
-9A0
- 8
-0
- 10
-32.999999999999993
- 20
-84.0
- 30
-0.0
- 0
-VERTEX
- 5
-9A1
- 8
-0
- 10
-32.999999999999993
- 20
-55.999959999999987
- 30
-0.0
- 0
-SEQEND
- 5
-9A2
- 8
-0
- 0
-CIRCLE
- 5
-1CA
- 8
-0
- 10
-89.0
- 20
-74.999999700000004
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-1CB
- 8
-0
- 10
-89.0
- 20
-74.999999700000004
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-1CC
- 8
-0
- 10
-89.0
- 20
-74.999999700000004
- 30
-0.0
- 40
-2.0
- 0
-LINE
- 5
-1CD
- 8
-0
- 10
-89.0
- 20
-59.999995999999982
- 30
-0.0
- 11
-89.0
- 21
-58.999996000000003
- 31
-0.0
- 0
-LINE
- 5
-1CE
- 8
-0
- 10
-87.0
- 20
-58.999996000000003
- 30
-0.0
- 11
-87.0
- 21
-59.999995999999982
- 31
-0.0
- 0
-CIRCLE
- 5
-1CF
- 8
-0
- 10
-89.0
- 20
-66.0
- 30
-0.0
- 40
-2.0
- 0
-CIRCLE
- 5
-1D0
- 8
-0
- 10
-89.0
- 20
-66.0
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-1D1
- 8
-0
- 10
-89.0
- 20
-66.0
- 30
-0.0
- 40
-4.0
- 0
-CIRCLE
- 5
-1D2
- 8
-0
- 10
-89.0
- 20
-66.0
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-1D3
- 8
-0
- 10
-80.000002999999978
- 20
-74.999999700000004
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-1D4
- 8
-0
- 10
-80.000002999999978
- 20
-74.999999700000004
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-1D5
- 8
-0
- 10
-80.000002999999978
- 20
-74.999999700000004
- 30
-0.0
- 40
-2.0
- 0
-CIRCLE
- 5
-1D6
- 8
-0
- 10
-80.000002999999978
- 20
-66.0
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-1D7
- 8
-0
- 10
-82.000003999999976
- 20
-58.999996000000003
- 30
-0.0
- 11
-82.000003999999976
- 21
-59.999995999999982
- 31
-0.0
- 0
-LINE
- 5
-1D8
- 8
-0
- 10
-80.000002999999978
- 20
-59.999995999999982
- 30
-0.0
- 11
-80.000002999999978
- 21
-58.999996000000003
- 31
-0.0
- 0
-CIRCLE
- 5
-1D9
- 8
-0
- 10
-80.000002999999978
- 20
-66.0
- 30
-0.0
- 40
-2.0
- 0
-CIRCLE
- 5
-1DA
- 8
-0
- 10
-80.000002999999978
- 20
-66.0
- 30
-0.0
- 40
-3.0
- 0
-LINE
- 5
-1DB
- 8
-0
- 10
-74.000003400000011
- 20
-81.0
- 30
-0.0
- 11
-95.0
- 21
-81.0
- 31
-0.0
- 0
-POLYLINE
- 5
-1DC
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9A3
- 8
-0
- 10
-76.000002999999964
- 20
-57.999995999999989
- 30
-0.0
- 0
-VERTEX
- 5
-9A4
- 8
-0
- 10
-76.000002999999964
- 20
-58.999996000000003
- 30
-0.0
- 0
-VERTEX
- 5
-9A5
- 8
-0
- 10
-93.0
- 20
-58.999996000000003
- 30
-0.0
- 0
-VERTEX
- 5
-9A6
- 8
-0
- 10
-93.0
- 20
-57.999995999999989
- 30
-0.0
- 0
-SEQEND
- 5
-9A7
- 8
-0
- 0
-CIRCLE
- 5
-1DD
- 8
-0
- 10
-80.000002999999978
- 20
-74.999999700000004
- 30
-0.0
- 40
-4.0
- 0
-POLYLINE
- 5
-1DE
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9A8
- 8
-0
- 10
-74.000003400000011
- 20
-59.999995999999982
- 30
-0.0
- 0
-VERTEX
- 5
-9A9
- 8
-0
- 10
-74.000003400000011
- 20
-84.0
- 30
-0.0
- 0
-VERTEX
- 5
-9AA
- 8
-0
- 10
-95.0
- 20
-84.0
- 30
-0.0
- 0
-VERTEX
- 5
-9AB
- 8
-0
- 10
-95.0
- 20
-59.999995999999982
- 30
-0.0
- 0
-SEQEND
- 5
-9AC
- 8
-0
- 0
-LINE
- 5
-1DF
- 8
-0
- 10
-27.367520651087769
- 20
-24.0
- 30
-0.0
- 11
-62.867517764336242
- 21
-59.499997113248469
- 31
-0.0
- 0
-LINE
- 5
-1E0
- 8
-0
- 10
-18.882239276849191
- 20
-24.0
- 30
-0.0
- 11
-54.382237238625642
- 21
-59.49999796177643
- 31
-0.0
- 0
-LINE
- 5
-1E1
- 8
-0
- 10
-10.39695790261063
- 20
-24.0
- 30
-0.0
- 11
-45.896956712915042
- 21
-59.499998810304433
- 31
-0.0
- 0
-LINE
- 5
-1E2
- 8
-0
- 10
-1.911676528372058
- 20
-24.0
- 30
-0.0
- 11
-32.91163652837205
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1E3
- 8
-0
- 10
-33.025246417648908
- 20
-55.11356988927686
- 30
-0.0
- 11
-37.411676187204463
- 21
-59.499999658832401
- 31
-0.0
- 0
-LINE
- 5
-1E4
- 8
-0
- 10
--0.0000000000000107
- 20
-30.573604845866509
- 30
-0.0
- 11
-24.426355154133478
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1E5
- 8
-0
- 10
--0.0000000000000107
- 20
-39.058886220105073
- 30
-0.0
- 11
-15.94107377989492
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1E6
- 8
-0
- 10
--0.0000000000000071
- 20
-47.544167594343662
- 30
-0.0
- 11
-7.4557924056563474
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1E7
- 8
-0
- 10
-35.852802025326319
- 20
-24.0
- 30
-0.0
- 11
-71.35279829004682
- 21
-59.499996264720487
- 31
-0.0
- 0
-LINE
- 5
-1E8
- 8
-0
- 10
-44.338083399564887
- 20
-24.0
- 30
-0.0
- 11
-77.83807939956489
- 21
-57.499995999999982
- 31
-0.0
- 0
-LINE
- 5
-1E9
- 8
-0
- 10
-52.823364773803469
- 20
-24.0
- 30
-0.0
- 11
-86.323360773803458
- 21
-57.499995999999982
- 31
-0.0
- 0
-LINE
- 5
-1EA
- 8
-0
- 10
-61.30864614804203
- 20
-24.0
- 30
-0.0
- 11
-96.000000000000043
- 21
-58.69135385195797
- 31
-0.0
- 0
-LINE
- 5
-1EB
- 8
-0
- 10
-69.793927522280612
- 20
-24.0
- 30
-0.0
- 11
-96.0
- 21
-50.206072477719388
- 31
-0.0
- 0
-LINE
- 5
-1EC
- 8
-0
- 10
-78.279208896519179
- 20
-24.0
- 30
-0.0
- 11
-96.0
- 21
-41.720791103480813
- 31
-0.0
- 0
-LINE
- 5
-1ED
- 8
-0
- 10
-86.764490270757776
- 20
-24.0
- 30
-0.0
- 11
-96.0
- 21
-33.235509729242231
- 31
-0.0
- 0
-LINE
- 5
-1EE
- 8
-0
- 10
-95.249771644996358
- 20
-24.0
- 30
-0.0
- 11
-96.0
- 21
-24.750228355003639
- 31
-0.0
- 0
-LINE
- 5
-1EF
- 8
-0
- 10
-59.228316995509317
- 20
-24.0
- 30
-0.0
- 11
-28.228356995509301
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1F0
- 8
-0
- 10
-50.743035621270742
- 20
-24.0
- 30
-0.0
- 11
-19.74307562127073
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1F1
- 8
-0
- 10
-42.257754247032167
- 20
-24.0
- 30
-0.0
- 11
-11.257794247032161
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1F2
- 8
-0
- 10
-33.772472872793593
- 20
-24.0
- 30
-0.0
- 11
-2.7725128727936008
- 21
-54.999959999999987
- 31
-0.0
- 0
-LINE
- 5
-1F3
- 8
-0
- 10
-25.287191498555039
- 20
-24.0
- 30
-0.0
- 11
--0.0000000000000071
- 21
-49.287191498555039
- 31
-0.0
- 0
-LINE
- 5
-1F4
- 8
-0
- 10
-16.801910124316461
- 20
-24.0
- 30
-0.0
- 11
--0.0000000000000071
- 21
-40.801910124316457
- 31
-0.0
- 0
-LINE
- 5
-1F5
- 8
-0
- 10
-8.3166287500778964
- 20
-24.0
- 30
-0.0
- 11
--0.0000000000000071
- 21
-32.316628750077911
- 31
-0.0
- 0
-LINE
- 5
-1F6
- 8
-0
- 10
-67.713598369747899
- 20
-24.0
- 30
-0.0
- 11
-33.675202065757311
- 21
-58.038396303990567
- 31
-0.0
- 0
-LINE
- 5
-1F7
- 8
-0
- 10
-76.198879743986453
- 20
-24.0
- 30
-0.0
- 11
-40.698880413874427
- 21
-59.499999330112018
- 31
-0.0
- 0
-LINE
- 5
-1F8
- 8
-0
- 10
-84.684161118225035
- 20
-24.0
- 30
-0.0
- 11
-49.184162636641162
- 21
-59.49999848158388
- 31
-0.0
- 0
-LINE
- 5
-1F9
- 8
-0
- 10
-93.169442492463588
- 20
-24.0
- 30
-0.0
- 11
-57.669444859407882
- 21
-59.499997633055713
- 31
-0.0
- 0
-LINE
- 5
-1FA
- 8
-0
- 10
-95.999999999999957
- 20
-29.65472386670217
- 30
-0.0
- 11
-66.154727082174603
- 21
-59.499996784527568
- 31
-0.0
- 0
-LINE
- 5
-1FB
- 8
-0
- 10
-96.0
- 20
-38.140005240940731
- 30
-0.0
- 11
-76.640009240940714
- 21
-57.499995999999982
- 31
-0.0
- 0
-LINE
- 5
-1FC
- 8
-0
- 10
-96.0
- 20
-46.625286615179313
- 30
-0.0
- 11
-85.125290615179296
- 21
-57.499995999999982
- 31
-0.0
- 0
-LINE
- 5
-1FD
- 8
-0
- 10
-96.0
- 20
-55.110567989417859
- 30
-0.0
- 11
-93.569107424278741
- 21
-57.541460565139111
- 31
-0.0
- 0
-LINE
- 5
-1FE
- 8
-0
- 10
--0.098894018957985
- 20
--5.0
- 30
-0.0
- 11
-3.9011059810420221
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-1FF
- 8
-0
- 10
-89.901105981041994
- 20
-85.0
- 30
-0.0
- 11
-93.901105981041994
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-200
- 8
-0
- 10
--2.22021436251763
- 20
--5.0
- 30
-0.0
- 11
-1.7797856374823759
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-201
- 8
-0
- 10
-87.779785637482377
- 20
-85.0
- 30
-0.0
- 11
-91.779785637482377
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-202
- 8
-0
- 10
--4.3415347060772671
- 20
--5.0
- 30
-0.0
- 11
--0.3415347060772618
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-203
- 8
-0
- 10
-85.658465293922717
- 20
-85.0
- 30
-0.0
- 11
-89.658465293922717
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-204
- 8
-0
- 10
--5.0
- 20
--3.5371449503630839
- 30
-0.0
- 11
--1.0000000000000071
- 21
-0.4628550496369144
- 31
-0.0
- 0
-LINE
- 5
-205
- 8
-0
- 10
-83.537144950363086
- 20
-85.0
- 30
-0.0
- 11
-87.537144950363114
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-206
- 8
-0
- 10
--5.0
- 20
--1.4158246068034539
- 30
-0.0
- 11
--1.0000000000000071
- 21
-2.5841753931965439
- 31
-0.0
- 0
-LINE
- 5
-207
- 8
-0
- 10
-81.415824606803454
- 20
-85.0
- 30
-0.0
- 11
-85.415824606803454
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-208
- 8
-0
- 10
--5.0
- 20
-0.7054957367561912
- 30
-0.0
- 11
--1.0000000000000071
- 21
-4.7054957367561983
- 31
-0.0
- 0
-LINE
- 5
-209
- 8
-0
- 10
-79.294504263243795
- 20
-85.0
- 30
-0.0
- 11
-83.294504263243795
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-20A
- 8
-0
- 10
--5.0
- 20
-2.8268160803158362
- 30
-0.0
- 11
--1.0000000000000071
- 21
-6.8268160803158349
- 31
-0.0
- 0
-LINE
- 5
-20B
- 8
-0
- 10
-77.173183919684149
- 20
-85.0
- 30
-0.0
- 11
-81.173183919684149
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-20C
- 8
-0
- 10
--5.0
- 20
-4.9481364238754741
- 30
-0.0
- 11
--1.0000000000000071
- 21
-8.9481364238754821
- 31
-0.0
- 0
-LINE
- 5
-20D
- 8
-0
- 10
-75.051863576124504
- 20
-85.0
- 30
-0.0
- 11
-79.051863576124489
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-20E
- 8
-0
- 10
--5.0
- 20
-7.0694567674351196
- 30
-0.0
- 11
--1.0
- 21
-11.06945676743511
- 31
-0.0
- 0
-LINE
- 5
-20F
- 8
-0
- 10
-72.930543232564872
- 20
-85.0
- 30
-0.0
- 11
-76.930543232564872
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-210
- 8
-0
- 10
--5.0
- 20
-9.190777110994766
- 30
-0.0
- 11
--1.0
- 21
-13.190777110994761
- 31
-0.0
- 0
-LINE
- 5
-211
- 8
-0
- 10
-70.809222889005227
- 20
-85.0
- 30
-0.0
- 11
-74.809222889005227
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-212
- 8
-0
- 10
--5.0
- 20
-11.312097454554401
- 30
-0.0
- 11
--1.0
- 21
-15.312097454554401
- 31
-0.0
- 0
-LINE
- 5
-213
- 8
-0
- 10
-68.687902545445581
- 20
-85.0
- 30
-0.0
- 11
-72.687902545445581
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-214
- 8
-0
- 10
--5.0000000000000062
- 20
-13.43341779811405
- 30
-0.0
- 11
--1.0
- 21
-17.43341779811405
- 31
-0.0
- 0
-LINE
- 5
-215
- 8
-0
- 10
-66.566582201885936
- 20
-85.0
- 30
-0.0
- 11
-70.566582201885964
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-216
- 8
-0
- 10
--5.0000000000000062
- 20
-15.55473814167369
- 30
-0.0
- 11
--1.0
- 21
-19.554738141673688
- 31
-0.0
- 0
-LINE
- 5
-217
- 8
-0
- 10
-64.445261858326305
- 20
-85.0
- 30
-0.0
- 11
-68.445261858326305
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-218
- 8
-0
- 10
--5.0000000000000062
- 20
-17.67605848523332
- 30
-0.0
- 11
--1.0
- 21
-21.676058485233341
- 31
-0.0
- 0
-LINE
- 5
-219
- 8
-0
- 10
-62.323941514766652
- 20
-85.0
- 30
-0.0
- 11
-66.323941514766659
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-21A
- 8
-0
- 10
--5.0000000000000062
- 20
-19.797378828792962
- 30
-0.0
- 11
--1.0
- 21
-23.797378828792979
- 31
-0.0
- 0
-LINE
- 5
-21B
- 8
-0
- 10
-60.202621171207007
- 20
-85.0
- 30
-0.0
- 11
-64.202621171207014
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-21C
- 8
-0
- 10
--5.0000000000000062
- 20
-21.918699172352621
- 30
-0.0
- 11
--2.918699172352623
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-21D
- 8
-0
- 10
-58.081300827647368
- 20
-85.0
- 30
-0.0
- 11
-62.081300827647361
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-21E
- 8
-0
- 10
-55.959980484087708
- 20
-85.0
- 30
-0.0
- 11
-59.959980484087737
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-21F
- 8
-0
- 10
-53.838660140528091
- 20
-85.0
- 30
-0.0
- 11
-57.838660140528098
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-220
- 8
-0
- 10
-51.71733979696846
- 20
-85.0
- 30
-0.0
- 11
-55.71733979696846
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-221
- 8
-0
- 10
-49.596019453408822
- 20
-85.0
- 30
-0.0
- 11
-53.596019453408807
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-222
- 8
-0
- 10
-47.474699109849169
- 20
-85.0
- 30
-0.0
- 11
-51.474699109849162
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-223
- 8
-0
- 10
-45.353378766289516
- 20
-85.0
- 30
-0.0
- 11
-49.353378766289531
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-224
- 8
-0
- 10
-43.232058422729857
- 20
-85.0
- 30
-0.0
- 11
-47.232058422729878
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-225
- 8
-0
- 10
-41.110738079170218
- 20
-85.0
- 30
-0.0
- 11
-45.11073807917024
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-226
- 8
-0
- 10
-38.989417735610601
- 20
-85.0
- 30
-0.0
- 11
-42.989417735610601
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-227
- 8
-0
- 10
-36.868097392050949
- 20
-85.0
- 30
-0.0
- 11
-40.868097392050949
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-228
- 8
-0
- 10
-34.746777048491303
- 20
-85.0
- 30
-0.0
- 11
-38.74677704849131
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-229
- 8
-0
- 10
-32.625456704931658
- 20
-85.0
- 30
-0.0
- 11
-36.625456704931658
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-22A
- 8
-0
- 10
-30.504136361372019
- 20
-85.0
- 30
-0.0
- 11
-34.504136361372034
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-22B
- 8
-0
- 10
-28.382816017812381
- 20
-85.0
- 30
-0.0
- 11
-32.382816017812381
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-22C
- 8
-0
- 10
--2.738544325747255
- 20
-55.999959999999987
- 30
-0.0
- 11
--1.0000000000000071
- 21
-57.73850432574725
- 31
-0.0
- 0
-LINE
- 5
-22D
- 8
-0
- 10
-26.261495674252739
- 20
-85.0
- 30
-0.0
- 11
-30.261495674252739
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-22E
- 8
-0
- 10
--4.8598646693069014
- 20
-55.999959999999987
- 30
-0.0
- 11
--1.0000000000000071
- 21
-59.859824669306889
- 31
-0.0
- 0
-LINE
- 5
-22F
- 8
-0
- 10
-24.140175330693079
- 20
-85.0
- 30
-0.0
- 11
-28.140175330693079
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-230
- 8
-0
- 10
--5.0000000000000062
- 20
-57.981145012866527
- 30
-0.0
- 11
--1.0000000000000071
- 21
-61.981145012866527
- 31
-0.0
- 0
-LINE
- 5
-231
- 8
-0
- 10
-22.018854987133452
- 20
-85.0
- 30
-0.0
- 11
-26.018854987133452
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-232
- 8
-0
- 10
--5.0000000000000062
- 20
-60.10246535642618
- 30
-0.0
- 11
--1.0000000000000071
- 21
-64.10246535642618
- 31
-0.0
- 0
-LINE
- 5
-233
- 8
-0
- 10
-19.897534643573799
- 20
-85.0
- 30
-0.0
- 11
-23.89753464357381
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-234
- 8
-0
- 10
--5.0000000000000062
- 20
-62.223785699985818
- 30
-0.0
- 11
--1.0000000000000071
- 21
-66.223785699985825
- 31
-0.0
- 0
-LINE
- 5
-235
- 8
-0
- 10
-17.776214300014161
- 20
-85.0
- 30
-0.0
- 11
-21.776214300014171
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-236
- 8
-0
- 10
--5.0000000000000062
- 20
-64.345106043545471
- 30
-0.0
- 11
--1.0000000000000071
- 21
-68.345106043545471
- 31
-0.0
- 0
-LINE
- 5
-237
- 8
-0
- 10
-15.65489395645452
- 20
-85.0
- 30
-0.0
- 11
-19.654893956454529
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-238
- 8
-0
- 10
--5.0000000000000062
- 20
-66.466426387105116
- 30
-0.0
- 11
--1.0000000000000071
- 21
-70.466426387105116
- 31
-0.0
- 0
-LINE
- 5
-239
- 8
-0
- 10
-13.53357361289488
- 20
-85.0
- 30
-0.0
- 11
-17.53357361289488
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-23A
- 8
-0
- 10
--5.0000000000000062
- 20
-68.587746730664733
- 30
-0.0
- 11
--1.0000000000000071
- 21
-72.587746730664747
- 31
-0.0
- 0
-LINE
- 5
-23B
- 8
-0
- 10
-11.412253269335229
- 20
-85.0
- 30
-0.0
- 11
-15.412253269335221
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-23C
- 8
-0
- 10
--5.0000000000000062
- 20
-70.709067074224393
- 30
-0.0
- 11
--1.0000000000000071
- 21
-74.709067074224393
- 31
-0.0
- 0
-LINE
- 5
-23D
- 8
-0
- 10
-9.2909329257755982
- 20
-85.0
- 30
-0.0
- 11
-13.2909329257756
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-23E
- 8
-0
- 10
--5.0000000000000062
- 20
-72.830387417784038
- 30
-0.0
- 11
--1.0000000000000071
- 21
-76.830387417784024
- 31
-0.0
- 0
-LINE
- 5
-23F
- 8
-0
- 10
-7.1696125822159606
- 20
-85.0
- 30
-0.0
- 11
-11.169612582215951
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-240
- 8
-0
- 10
--5.0000000000000062
- 20
-74.95170776134367
- 30
-0.0
- 11
--1.0000000000000071
- 21
-78.95170776134367
- 31
-0.0
- 0
-LINE
- 5
-241
- 8
-0
- 10
-5.048292238656316
- 20
-85.0
- 30
-0.0
- 11
-9.0482922386563231
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-242
- 8
-0
- 10
--5.0000000000000062
- 20
-77.073028104903315
- 30
-0.0
- 11
--1.0000000000000071
- 21
-81.073028104903315
- 31
-0.0
- 0
-LINE
- 5
-243
- 8
-0
- 10
-2.9269718950966692
- 20
-85.0
- 30
-0.0
- 11
-6.9269718950966768
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-244
- 8
-0
- 10
--5.0000000000000062
- 20
-79.194348448462947
- 30
-0.0
- 11
--1.0000000000000071
- 21
-83.194348448462975
- 31
-0.0
- 0
-LINE
- 5
-245
- 8
-0
- 10
-0.8056515515370319
- 20
-85.0
- 30
-0.0
- 11
-4.8056515515370322
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-246
- 8
-0
- 10
--5.0000000000000062
- 20
-81.315668792022578
- 30
-0.0
- 11
-2.684331207977392
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-247
- 8
-0
- 10
--5.0000000000000062
- 20
-83.436989135582266
- 30
-0.0
- 11
-0.5630108644177483
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-248
- 8
-0
- 10
--5.0000000000000062
- 20
-85.558309479141855
- 30
-0.0
- 11
--1.558309479141889
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-249
- 8
-0
- 10
--5.0000000000000062
- 20
-87.679629822701528
- 30
-0.0
- 11
--3.6796298227015352
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-24A
- 8
-0
- 10
-2.0224263246016592
- 20
--5.0
- 30
-0.0
- 11
-6.0224263246016587
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-24B
- 8
-0
- 10
-92.022426324601668
- 20
-85.0
- 30
-0.0
- 11
-96.022426324601682
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-24C
- 8
-0
- 10
-4.143746668161298
- 20
--5.0
- 30
-0.0
- 11
-8.1437466681613042
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-24D
- 8
-0
- 10
-94.143746668161285
- 20
-85.0
- 30
-0.0
- 11
-98.143746668161299
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-24E
- 8
-0
- 10
-6.2650670117209426
- 20
--5.0
- 30
-0.0
- 11
-10.265067011720941
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-24F
- 8
-0
- 10
-96.26506701172093
- 20
-85.0
- 30
-0.0
- 11
-100.2650670117209
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-250
- 8
-0
- 10
-8.3863873552805792
- 20
--5.0
- 30
-0.0
- 11
-12.38638735528059
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-251
- 8
-0
- 10
-97.0
- 20
-83.61361264471941
- 30
-0.0
- 11
-101.0
- 21
-87.613612644719424
- 31
-0.0
- 0
-LINE
- 5
-252
- 8
-0
- 10
-10.507707698840219
- 20
--5.0
- 30
-0.0
- 11
-14.50770769884023
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-253
- 8
-0
- 10
-97.0
- 20
-81.492292301159765
- 30
-0.0
- 11
-101.0
- 21
-85.492292301159779
- 31
-0.0
- 0
-LINE
- 5
-254
- 8
-0
- 10
-12.62902804239987
- 20
--5.0
- 30
-0.0
- 11
-16.629028042399881
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-255
- 8
-0
- 10
-97.0
- 20
-79.370971957600133
- 30
-0.0
- 11
-101.0
- 21
-83.370971957600133
- 31
-0.0
- 0
-LINE
- 5
-256
- 8
-0
- 10
-14.75034838595951
- 20
--5.0
- 30
-0.0
- 11
-18.750348385959519
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-257
- 8
-0
- 10
-97.0
- 20
-77.249651614040474
- 30
-0.0
- 11
-101.0
- 21
-81.249651614040502
- 31
-0.0
- 0
-LINE
- 5
-258
- 8
-0
- 10
-16.871668729519151
- 20
--5.0
- 30
-0.0
- 11
-20.87166872951914
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-259
- 8
-0
- 10
-97.0
- 20
-75.128331270480842
- 30
-0.0
- 11
-101.0
- 21
-79.128331270480842
- 31
-0.0
- 0
-LINE
- 5
-25A
- 8
-0
- 10
-18.9929890730788
- 20
--5.0
- 30
-0.0
- 11
-22.9929890730788
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-25B
- 8
-0
- 10
-97.0
- 20
-73.007010926921183
- 30
-0.0
- 11
-101.0
- 21
-77.007010926921211
- 31
-0.0
- 0
-LINE
- 5
-25C
- 8
-0
- 10
-21.114309416638449
- 20
--5.0
- 30
-0.0
- 11
-25.114309416638442
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-25D
- 8
-0
- 10
-97.0
- 20
-70.885690583361551
- 30
-0.0
- 11
-101.0
- 21
-74.885690583361566
- 31
-0.0
- 0
-LINE
- 5
-25E
- 8
-0
- 10
-23.235629760198069
- 20
--5.0
- 30
-0.0
- 11
-27.23562976019808
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-25F
- 8
-0
- 10
-97.0
- 20
-68.764370239801906
- 30
-0.0
- 11
-101.0
- 21
-72.764370239801934
- 31
-0.0
- 0
-LINE
- 5
-260
- 8
-0
- 10
-25.356950103757711
- 20
--5.0
- 30
-0.0
- 11
-29.356950103757729
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-261
- 8
-0
- 10
-97.0
- 20
-66.643049896242275
- 30
-0.0
- 11
-101.0
- 21
-70.643049896242289
- 31
-0.0
- 0
-LINE
- 5
-262
- 8
-0
- 10
-27.478270447317371
- 20
--5.0
- 30
-0.0
- 11
-30.0
- 21
--2.47827044731737
- 31
-0.0
- 0
-LINE
- 5
-263
- 8
-0
- 10
-97.0
- 20
-64.521729552682629
- 30
-0.0
- 11
-101.0
- 21
-68.521729552682643
- 31
-0.0
- 0
-LINE
- 5
-264
- 8
-0
- 10
-29.599590790877009
- 20
--5.0
- 30
-0.0
- 11
-30.0
- 21
--4.5995907908770164
- 31
-0.0
- 0
-LINE
- 5
-265
- 8
-0
- 10
-97.0
- 20
-62.400409209122969
- 30
-0.0
- 11
-101.0
- 21
-66.400409209122998
- 31
-0.0
- 0
-LINE
- 5
-266
- 8
-0
- 10
-97.0
- 20
-60.279088865563352
- 30
-0.0
- 11
-101.0
- 21
-64.279088865563352
- 31
-0.0
- 0
-LINE
- 5
-267
- 8
-0
- 10
-98.842231477996293
- 20
-60.0
- 30
-0.0
- 11
-101.0
- 21
-62.157768522003707
- 31
-0.0
- 0
-LINE
- 5
-268
- 8
-0
- 10
-100.9635518215558
- 20
-60.0
- 30
-0.0
- 11
-101.0
- 21
-60.036448178444061
- 31
-0.0
- 0
-LINE
- 5
-269
- 8
-0
- 10
-66.0
- 20
--2.5407162878312728
- 30
-0.0
- 11
-67.540716287831273
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-26A
- 8
-0
- 10
-66.0
- 20
--4.662036631390917
- 30
-0.0
- 11
-69.662036631390919
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-26B
- 8
-0
- 10
-67.783356974950564
- 20
--5.0
- 30
-0.0
- 11
-71.783356974950564
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-26C
- 8
-0
- 10
-69.90467731851021
- 20
--5.0
- 30
-0.0
- 11
-73.904677318510196
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-26D
- 8
-0
- 10
-97.0
- 20
-22.09532268148978
- 30
-0.0
- 11
-98.90467731851021
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-26E
- 8
-0
- 10
-72.025997662069855
- 20
--5.0
- 30
-0.0
- 11
-76.025997662069841
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-26F
- 8
-0
- 10
-97.0
- 20
-19.974002337930141
- 30
-0.0
- 11
-101.0
- 21
-23.974002337930141
- 31
-0.0
- 0
-LINE
- 5
-270
- 8
-0
- 10
-74.147318005629486
- 20
--5.0
- 30
-0.0
- 11
-78.147318005629501
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-271
- 8
-0
- 10
-97.0
- 20
-17.852681994370499
- 30
-0.0
- 11
-101.0
- 21
-21.852681994370499
- 31
-0.0
- 0
-LINE
- 5
-272
- 8
-0
- 10
-76.268638349189132
- 20
--5.0
- 30
-0.0
- 11
-80.268638349189132
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-273
- 8
-0
- 10
-97.0
- 20
-15.731361650810859
- 30
-0.0
- 11
-101.0
- 21
-19.731361650810861
- 31
-0.0
- 0
-LINE
- 5
-274
- 8
-0
- 10
-78.389958692748792
- 20
--5.0
- 30
-0.0
- 11
-82.389958692748763
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-275
- 8
-0
- 10
-97.0
- 20
-13.61004130725121
- 30
-0.0
- 11
-101.0
- 21
-17.610041307251219
- 31
-0.0
- 0
-LINE
- 5
-276
- 8
-0
- 10
-80.511279036308423
- 20
--5.0
- 30
-0.0
- 11
-84.511279036308423
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-277
- 8
-0
- 10
-97.0
- 20
-11.488720963691559
- 30
-0.0
- 11
-101.0
- 21
-15.48872096369157
- 31
-0.0
- 0
-LINE
- 5
-278
- 8
-0
- 10
-82.632599379868054
- 20
--5.0
- 30
-0.0
- 11
-86.632599379868054
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-279
- 8
-0
- 10
-97.0
- 20
-9.3674006201319315
- 30
-0.0
- 11
-101.0
- 21
-13.36740062013193
- 31
-0.0
- 0
-LINE
- 5
-27A
- 8
-0
- 10
-84.753919723427686
- 20
--5.0
- 30
-0.0
- 11
-88.753919723427714
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-27B
- 8
-0
- 10
-97.0
- 20
-7.246080276572286
- 30
-0.0
- 11
-101.0
- 21
-11.24608027657229
- 31
-0.0
- 0
-LINE
- 5
-27C
- 8
-0
- 10
-86.875240066987345
- 20
--5.0
- 30
-0.0
- 11
-90.875240066987345
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-27D
- 8
-0
- 10
-97.0
- 20
-5.1247599330126388
- 30
-0.0
- 11
-101.0
- 21
-9.1247599330126494
- 31
-0.0
- 0
-LINE
- 5
-27E
- 8
-0
- 10
-88.996560410547005
- 20
--5.0
- 30
-0.0
- 11
-92.996560410546991
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-27F
- 8
-0
- 10
-97.0
- 20
-3.0034395894529951
- 30
-0.0
- 11
-101.0
- 21
-7.0034395894530093
- 31
-0.0
- 0
-LINE
- 5
-280
- 8
-0
- 10
-91.117880754106636
- 20
--5.0
- 30
-0.0
- 11
-95.117880754106636
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-281
- 8
-0
- 10
-97.0
- 20
-0.8821192458933636
- 30
-0.0
- 11
-101.0
- 21
-4.8821192458933629
- 31
-0.0
- 0
-LINE
- 5
-282
- 8
-0
- 10
-93.239201097666282
- 20
--5.0
- 30
-0.0
- 11
-101.0
- 21
-2.7607989023337178
- 31
-0.0
- 0
-LINE
- 5
-283
- 8
-0
- 10
-95.360521441225913
- 20
--5.0
- 30
-0.0
- 11
-101.0
- 21
-0.6394785587740728
- 31
-0.0
- 0
-LINE
- 5
-284
- 8
-0
- 10
-97.481841784785559
- 20
--5.0
- 30
-0.0
- 11
-101.0
- 21
--1.4818417847855581
- 31
-0.0
- 0
-LINE
- 5
-285
- 8
-0
- 10
-99.603162128345218
- 20
--5.0
- 30
-0.0
- 11
-101.0
- 21
--3.6031621283452031
- 31
-0.0
- 0
-LINE
- 5
-286
- 8
-0
- 10
-93.214035251664157
- 20
--5.0
- 30
-0.0
- 11
-89.214035251664143
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-287
- 8
-0
- 10
-3.2140352516641628
- 20
-85.0
- 30
-0.0
- 11
--0.7859647483358501
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-288
- 8
-0
- 10
-91.092714908104512
- 20
--5.0
- 30
-0.0
- 11
-87.092714908104512
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-289
- 8
-0
- 10
-1.0927149081045171
- 20
-85.0
- 30
-0.0
- 11
--2.907285091895488
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-28A
- 8
-0
- 10
-88.971394564544866
- 20
--5.0
- 30
-0.0
- 11
-84.971394564544823
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-28B
- 8
-0
- 10
--1.0000000000000071
- 20
-84.971394564544894
- 30
-0.0
- 11
--5.0000000000000062
- 21
-88.971394564544866
- 31
-0.0
- 0
-LINE
- 5
-28C
- 8
-0
- 10
-86.850074220985221
- 20
--5.0
- 30
-0.0
- 11
-82.850074220985206
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-28D
- 8
-0
- 10
--1.0000000000000071
- 20
-82.850074220985235
- 30
-0.0
- 11
--5.0000000000000062
- 21
-86.850074220985221
- 31
-0.0
- 0
-LINE
- 5
-28E
- 8
-0
- 10
-84.728753877425589
- 20
--5.0
- 30
-0.0
- 11
-80.728753877425561
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-28F
- 8
-0
- 10
--1.0000000000000071
- 20
-80.728753877425589
- 30
-0.0
- 11
--5.0000000000000062
- 21
-84.728753877425589
- 31
-0.0
- 0
-LINE
- 5
-290
- 8
-0
- 10
-82.607433533865958
- 20
--5.0
- 30
-0.0
- 11
-78.607433533865944
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-291
- 8
-0
- 10
--1.0000000000000071
- 20
-78.607433533865944
- 30
-0.0
- 11
--5.0000000000000062
- 21
-82.607433533865944
- 31
-0.0
- 0
-LINE
- 5
-292
- 8
-0
- 10
-80.486113190306298
- 20
--5.0
- 30
-0.0
- 11
-76.486113190306284
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-293
- 8
-0
- 10
--1.0000000000000071
- 20
-76.486113190306298
- 30
-0.0
- 11
--5.0000000000000062
- 21
-80.486113190306298
- 31
-0.0
- 0
-LINE
- 5
-294
- 8
-0
- 10
-78.364792846746653
- 20
--5.0
- 30
-0.0
- 11
-74.364792846746639
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-295
- 8
-0
- 10
--1.0000000000000071
- 20
-74.364792846746667
- 30
-0.0
- 11
--5.0000000000000062
- 21
-78.364792846746653
- 31
-0.0
- 0
-LINE
- 5
-296
- 8
-0
- 10
-76.243472503187022
- 20
--5.0
- 30
-0.0
- 11
-72.243472503186993
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-297
- 8
-0
- 10
--1.0000000000000071
- 20
-72.243472503187022
- 30
-0.0
- 11
--5.0000000000000062
- 21
-76.243472503187022
- 31
-0.0
- 0
-LINE
- 5
-298
- 8
-0
- 10
-74.122152159627376
- 20
--5.0
- 30
-0.0
- 11
-70.122152159627362
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-299
- 8
-0
- 10
--1.0000000000000071
- 20
-70.122152159627376
- 30
-0.0
- 11
--5.0000000000000062
- 21
-74.122152159627376
- 31
-0.0
- 0
-LINE
- 5
-29A
- 8
-0
- 10
-72.000831816067731
- 20
--5.0
- 30
-0.0
- 11
-68.000831816067716
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-29B
- 8
-0
- 10
--1.0000000000000071
- 20
-68.000831816067731
- 30
-0.0
- 11
--5.0000000000000062
- 21
-72.000831816067731
- 31
-0.0
- 0
-LINE
- 5
-29C
- 8
-0
- 10
-69.879511472508071
- 20
--5.0
- 30
-0.0
- 11
-66.0
- 21
--1.1204885274919141
- 31
-0.0
- 0
-LINE
- 5
-29D
- 8
-0
- 10
--1.0000000000000071
- 20
-65.879511472508099
- 30
-0.0
- 11
--5.0000000000000062
- 21
-69.879511472508071
- 31
-0.0
- 0
-LINE
- 5
-29E
- 8
-0
- 10
-67.758191128948425
- 20
--5.0
- 30
-0.0
- 11
-66.0
- 21
--3.24180887105156
- 31
-0.0
- 0
-LINE
- 5
-29F
- 8
-0
- 10
--1.0000000000000071
- 20
-63.758191128948447
- 30
-0.0
- 11
--5.0000000000000062
- 21
-67.758191128948454
- 31
-0.0
- 0
-LINE
- 5
-2A0
- 8
-0
- 10
--1.0000000000000071
- 20
-61.636870785388808
- 30
-0.0
- 11
--5.0000000000000062
- 21
-65.636870785388808
- 31
-0.0
- 0
-LINE
- 5
-2A1
- 8
-0
- 10
--1.0000000000000071
- 20
-59.515550441829149
- 30
-0.0
- 11
--5.0000000000000062
- 21
-63.515550441829163
- 31
-0.0
- 0
-LINE
- 5
-2A2
- 8
-0
- 10
--1.0000000000000071
- 20
-57.394230098269531
- 30
-0.0
- 11
--5.0000000000000062
- 21
-61.394230098269531
- 31
-0.0
- 0
-LINE
- 5
-2A3
- 8
-0
- 10
--1.7270502452901211
- 20
-55.999959999999987
- 30
-0.0
- 11
--5.0000000000000062
- 21
-59.272909754709879
- 31
-0.0
- 0
-LINE
- 5
-2A4
- 8
-0
- 10
--3.8483705888497681
- 20
-55.999959999999987
- 30
-0.0
- 11
--5.0000000000000062
- 21
-57.15158941115024
- 31
-0.0
- 0
-LINE
- 5
-2A5
- 8
-0
- 10
-30.0
- 20
--1.1829343680058311
- 30
-0.0
- 11
-29.817065631994161
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2A6
- 8
-0
- 10
-30.0
- 20
--3.304254711565477
- 30
-0.0
- 11
-27.695745288434519
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2A7
- 8
-0
- 10
-29.57442494487487
- 20
--5.0
- 30
-0.0
- 11
-25.57442494487487
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2A8
- 8
-0
- 10
-27.453104601315228
- 20
--5.0
- 30
-0.0
- 11
-23.453104601315228
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2A9
- 8
-0
- 10
--1.0
- 20
-23.453104601315228
- 30
-0.0
- 11
--1.54689539868476
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-2AA
- 8
-0
- 10
-25.331784257755601
- 20
--5.0
- 30
-0.0
- 11
-21.331784257755569
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2AB
- 8
-0
- 10
--1.0
- 20
-21.331784257755601
- 30
-0.0
- 11
--3.6682157422443988
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-2AC
- 8
-0
- 10
-23.210463914195941
- 20
--5.0
- 30
-0.0
- 11
-19.210463914195952
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2AD
- 8
-0
- 10
--1.0
- 20
-19.210463914195952
- 30
-0.0
- 11
--5.0000000000000062
- 21
-23.210463914195959
- 31
-0.0
- 0
-LINE
- 5
-2AE
- 8
-0
- 10
-21.08914357063631
- 20
--5.0
- 30
-0.0
- 11
-17.08914357063631
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2AF
- 8
-0
- 10
--1.0
- 20
-17.08914357063631
- 30
-0.0
- 11
--5.0000000000000062
- 21
-21.08914357063631
- 31
-0.0
- 0
-LINE
- 5
-2B0
- 8
-0
- 10
-18.967823227076671
- 20
--5.0
- 30
-0.0
- 11
-14.96782322707665
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2B1
- 8
-0
- 10
--1.0
- 20
-14.96782322707667
- 30
-0.0
- 11
--5.0000000000000062
- 21
-18.967823227076671
- 31
-0.0
- 0
-LINE
- 5
-2B2
- 8
-0
- 10
-16.846502883517019
- 20
--5.0
- 30
-0.0
- 11
-12.846502883517021
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2B3
- 8
-0
- 10
--1.0000000000000071
- 20
-12.846502883517029
- 30
-0.0
- 11
--5.0
- 21
-16.846502883517019
- 31
-0.0
- 0
-LINE
- 5
-2B4
- 8
-0
- 10
-14.72518253995738
- 20
--5.0
- 30
-0.0
- 11
-10.72518253995738
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2B5
- 8
-0
- 10
--1.0000000000000071
- 20
-10.72518253995738
- 30
-0.0
- 11
--5.0
- 21
-14.72518253995738
- 31
-0.0
- 0
-LINE
- 5
-2B6
- 8
-0
- 10
-12.60386219639774
- 20
--5.0
- 30
-0.0
- 11
-8.6038621963977331
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2B7
- 8
-0
- 10
--1.0000000000000071
- 20
-8.6038621963977491
- 30
-0.0
- 11
--5.0
- 21
-12.60386219639774
- 31
-0.0
- 0
-LINE
- 5
-2B8
- 8
-0
- 10
-10.4825418528381
- 20
--5.0
- 30
-0.0
- 11
-6.4825418528380956
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2B9
- 8
-0
- 10
--1.0000000000000071
- 20
-6.4825418528381098
- 30
-0.0
- 11
--5.0
- 21
-10.4825418528381
- 31
-0.0
- 0
-LINE
- 5
-2BA
- 8
-0
- 10
-8.3612215092784563
- 20
--5.0
- 30
-0.0
- 11
-4.3612215092784501
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2BB
- 8
-0
- 10
--1.0000000000000071
- 20
-4.3612215092784652
- 30
-0.0
- 11
--5.0
- 21
-8.3612215092784563
- 31
-0.0
- 0
-LINE
- 5
-2BC
- 8
-0
- 10
-6.2399011657188179
- 20
--5.0
- 30
-0.0
- 11
-2.2399011657188121
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2BD
- 8
-0
- 10
--1.0000000000000071
- 20
-2.2399011657188179
- 30
-0.0
- 11
--5.0
- 21
-6.2399011657188117
- 31
-0.0
- 0
-LINE
- 5
-2BE
- 8
-0
- 10
-4.1185808221591742
- 20
--5.0
- 30
-0.0
- 11
-0.1185808221591671
- 21
--1.0
- 31
-0.0
- 0
-LINE
- 5
-2BF
- 8
-0
- 10
--1.0000000000000071
- 20
-0.1185808221591884
- 30
-0.0
- 11
--5.0
- 21
-4.1185808221591742
- 31
-0.0
- 0
-LINE
- 5
-2C0
- 8
-0
- 10
-1.9972604785995269
- 20
--5.0
- 30
-0.0
- 11
--5.0
- 21
-1.9972604785995269
- 31
-0.0
- 0
-LINE
- 5
-2C1
- 8
-0
- 10
--0.1240598649601097
- 20
--5.0
- 30
-0.0
- 11
--5.0
- 21
--0.1240598649601168
- 31
-0.0
- 0
-LINE
- 5
-2C2
- 8
-0
- 10
--2.2453802085197552
- 20
--5.0
- 30
-0.0
- 11
--5.0
- 21
--2.2453802085197609
- 31
-0.0
- 0
-LINE
- 5
-2C3
- 8
-0
- 10
--4.3667005520793927
- 20
--5.0
- 30
-0.0
- 11
--5.0
- 21
--4.3667005520793927
- 31
-0.0
- 0
-LINE
- 5
-2C4
- 8
-0
- 10
-95.335355595223788
- 20
--5.0
- 30
-0.0
- 11
-91.335355595223774
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-2C5
- 8
-0
- 10
-5.3353555952238079
- 20
-85.0
- 30
-0.0
- 11
-1.3353555952237941
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2C6
- 8
-0
- 10
-97.456675938783434
- 20
--5.0
- 30
-0.0
- 11
-93.456675938783434
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-2C7
- 8
-0
- 10
-7.456675938783448
- 20
-85.0
- 30
-0.0
- 11
-3.45667593878344
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2C8
- 8
-0
- 10
-99.577996282343122
- 20
--5.0
- 30
-0.0
- 11
-95.577996282343065
- 21
--0.9999999999999856
- 31
-0.0
- 0
-LINE
- 5
-2C9
- 8
-0
- 10
-9.5779962823430917
- 20
-85.0
- 30
-0.0
- 11
-5.5779962823430784
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2CA
- 8
-0
- 10
-101.0
- 20
--4.3006833740972592
- 30
-0.0
- 11
-97.0
- 21
--0.3006833740972752
- 31
-0.0
- 0
-LINE
- 5
-2CB
- 8
-0
- 10
-11.69931662590273
- 20
-85.0
- 30
-0.0
- 11
-7.699316625902723
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2CC
- 8
-0
- 10
-101.0
- 20
--2.1793630305376288
- 30
-0.0
- 11
-97.0
- 21
-1.8206369694623701
- 31
-0.0
- 0
-LINE
- 5
-2CD
- 8
-0
- 10
-13.82063696946236
- 20
-85.0
- 30
-0.0
- 11
-9.8206369694623703
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2CE
- 8
-0
- 10
-101.0
- 20
--0.0580426869779842
- 30
-0.0
- 11
-97.0
- 21
-3.941957313022014
- 31
-0.0
- 0
-LINE
- 5
-2CF
- 8
-0
- 10
-15.94195731302201
- 20
-85.0
- 30
-0.0
- 11
-11.941957313022
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2D0
- 8
-0
- 10
-101.0
- 20
-2.06327765658166
- 30
-0.0
- 11
-97.0
- 21
-6.0632776565816533
- 31
-0.0
- 0
-LINE
- 5
-2D1
- 8
-0
- 10
-18.063277656581651
- 20
-85.0
- 30
-0.0
- 11
-14.06327765658164
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2D2
- 8
-0
- 10
-101.0
- 20
-4.1845980001412917
- 30
-0.0
- 11
-97.0
- 21
-8.1845980001412855
- 31
-0.0
- 0
-LINE
- 5
-2D3
- 8
-0
- 10
-20.184598000141289
- 20
-85.0
- 30
-0.0
- 11
-16.184598000141271
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2D4
- 8
-0
- 10
-101.0
- 20
-6.3059183437009372
- 30
-0.0
- 11
-97.0
- 21
-10.305918343700929
- 31
-0.0
- 0
-LINE
- 5
-2D5
- 8
-0
- 10
-22.305918343700931
- 20
-85.0
- 30
-0.0
- 11
-18.30591834370092
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2D6
- 8
-0
- 10
-101.0
- 20
-8.4272386872605765
- 30
-0.0
- 11
-97.0
- 21
-12.427238687260569
- 31
-0.0
- 0
-LINE
- 5
-2D7
- 8
-0
- 10
-24.42723868726058
- 20
-85.0
- 30
-0.0
- 11
-20.427238687260559
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2D8
- 8
-0
- 10
-101.0
- 20
-10.54855903082022
- 30
-0.0
- 11
-97.0
- 21
-14.548559030820201
- 31
-0.0
- 0
-LINE
- 5
-2D9
- 8
-0
- 10
-26.548559030820218
- 20
-85.0
- 30
-0.0
- 11
-22.548559030820211
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2DA
- 8
-0
- 10
-101.0
- 20
-12.66987937437985
- 30
-0.0
- 11
-97.0
- 21
-16.66987937437986
- 31
-0.0
- 0
-LINE
- 5
-2DB
- 8
-0
- 10
-28.669879374379871
- 20
-85.0
- 30
-0.0
- 11
-24.66987937437986
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2DC
- 8
-0
- 10
-101.0
- 20
-14.791199717939501
- 30
-0.0
- 11
-97.0
- 21
-18.791199717939499
- 31
-0.0
- 0
-LINE
- 5
-2DD
- 8
-0
- 10
-30.791199717939499
- 20
-85.0
- 30
-0.0
- 11
-26.791199717939499
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2DE
- 8
-0
- 10
-101.0
- 20
-16.912520061499151
- 30
-0.0
- 11
-97.0
- 21
-20.912520061499141
- 31
-0.0
- 0
-LINE
- 5
-2DF
- 8
-0
- 10
-32.912520061499137
- 20
-85.0
- 30
-0.0
- 11
-28.912520061499141
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E0
- 8
-0
- 10
-101.0
- 20
-19.033840405058779
- 30
-0.0
- 11
-97.0
- 21
-23.033840405058779
- 31
-0.0
- 0
-LINE
- 5
-2E1
- 8
-0
- 10
-35.033840405058797
- 20
-85.0
- 30
-0.0
- 11
-31.033840405058768
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E2
- 8
-0
- 10
-101.0
- 20
-21.155160748618421
- 30
-0.0
- 11
-98.155160748618428
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-2E3
- 8
-0
- 10
-37.155160748618428
- 20
-85.0
- 30
-0.0
- 11
-33.155160748618428
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E4
- 8
-0
- 10
-101.0
- 20
-23.276481092178059
- 30
-0.0
- 11
-100.2764810921779
- 21
-24.0
- 31
-0.0
- 0
-LINE
- 5
-2E5
- 8
-0
- 10
-39.276481092178088
- 20
-85.0
- 30
-0.0
- 11
-35.276481092178059
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E6
- 8
-0
- 10
-41.397801435737719
- 20
-85.0
- 30
-0.0
- 11
-37.397801435737719
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E7
- 8
-0
- 10
-43.519121779297357
- 20
-85.0
- 30
-0.0
- 11
-39.51912177929735
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E8
- 8
-0
- 10
-45.64044212285701
- 20
-85.0
- 30
-0.0
- 11
-41.640442122856989
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2E9
- 8
-0
- 10
-47.761762466416641
- 20
-85.0
- 30
-0.0
- 11
-43.761762466416648
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2EA
- 8
-0
- 10
-49.883082809976301
- 20
-85.0
- 30
-0.0
- 11
-45.883082809976287
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2EB
- 8
-0
- 10
-52.004403153535918
- 20
-85.0
- 30
-0.0
- 11
-48.004403153535932
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2EC
- 8
-0
- 10
-54.125723497095578
- 20
-85.0
- 30
-0.0
- 11
-50.125723497095557
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2ED
- 8
-0
- 10
-56.247043840655223
- 20
-85.0
- 30
-0.0
- 11
-52.247043840655209
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2EE
- 8
-0
- 10
-58.368364184214869
- 20
-85.0
- 30
-0.0
- 11
-54.368364184214848
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2EF
- 8
-0
- 10
-60.489684527774507
- 20
-85.0
- 30
-0.0
- 11
-56.489684527774493
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F0
- 8
-0
- 10
-62.611004871334153
- 20
-85.0
- 30
-0.0
- 11
-58.611004871334138
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F1
- 8
-0
- 10
-64.732325214893791
- 20
-85.0
- 30
-0.0
- 11
-60.732325214893763
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F2
- 8
-0
- 10
-66.853645558453422
- 20
-85.0
- 30
-0.0
- 11
-62.853645558453429
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F3
- 8
-0
- 10
-68.974965902013082
- 20
-85.0
- 30
-0.0
- 11
-64.974965902013068
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F4
- 8
-0
- 10
-71.096286245572742
- 20
-85.0
- 30
-0.0
- 11
-67.096286245572713
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F5
- 8
-0
- 10
-98.217606589132345
- 20
-60.0
- 30
-0.0
- 11
-97.0
- 21
-61.217606589132359
- 31
-0.0
- 0
-LINE
- 5
-2F6
- 8
-0
- 10
-73.217606589132373
- 20
-85.0
- 30
-0.0
- 11
-69.217606589132345
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F7
- 8
-0
- 10
-100.3389269326919
- 20
-60.0
- 30
-0.0
- 11
-97.0
- 21
-63.338926932691997
- 31
-0.0
- 0
-LINE
- 5
-2F8
- 8
-0
- 10
-75.338926932692004
- 20
-85.0
- 30
-0.0
- 11
-71.33892693269199
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2F9
- 8
-0
- 10
-101.0
- 20
-61.460247276251643
- 30
-0.0
- 11
-97.0
- 21
-65.46024727625165
- 31
-0.0
- 0
-LINE
- 5
-2FA
- 8
-0
- 10
-77.460247276251664
- 20
-85.0
- 30
-0.0
- 11
-73.460247276251621
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2FB
- 8
-0
- 10
-101.0
- 20
-63.581567619811281
- 30
-0.0
- 11
-97.0
- 21
-67.581567619811295
- 31
-0.0
- 0
-LINE
- 5
-2FC
- 8
-0
- 10
-79.581567619811295
- 20
-85.0
- 30
-0.0
- 11
-75.581567619811281
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2FD
- 8
-0
- 10
-101.0
- 20
-65.702887963370898
- 30
-0.0
- 11
-97.0
- 21
-69.702887963370927
- 31
-0.0
- 0
-LINE
- 5
-2FE
- 8
-0
- 10
-81.702887963370927
- 20
-85.0
- 30
-0.0
- 11
-77.702887963370927
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-2FF
- 8
-0
- 10
-101.0
- 20
-67.824208306930544
- 30
-0.0
- 11
-97.0
- 21
-71.824208306930558
- 31
-0.0
- 0
-LINE
- 5
-300
- 8
-0
- 10
-83.824208306930586
- 20
-85.0
- 30
-0.0
- 11
-79.824208306930544
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-301
- 8
-0
- 10
-101.0
- 20
-69.945528650490203
- 30
-0.0
- 11
-97.0
- 21
-73.945528650490203
- 31
-0.0
- 0
-LINE
- 5
-302
- 8
-0
- 10
-85.945528650490218
- 20
-85.0
- 30
-0.0
- 11
-81.945528650490218
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-303
- 8
-0
- 10
-101.0
- 20
-72.066848994049849
- 30
-0.0
- 11
-97.0
- 21
-76.066848994049863
- 31
-0.0
- 0
-LINE
- 5
-304
- 8
-0
- 10
-88.066848994049877
- 20
-85.0
- 30
-0.0
- 11
-84.066848994049835
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-305
- 8
-0
- 10
-101.0
- 20
-74.18816933760948
- 30
-0.0
- 11
-97.0
- 21
-78.188169337609523
- 31
-0.0
- 0
-LINE
- 5
-306
- 8
-0
- 10
-90.188169337609494
- 20
-85.0
- 30
-0.0
- 11
-86.188169337609509
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-307
- 8
-0
- 10
-101.0
- 20
-76.309489681169126
- 30
-0.0
- 11
-97.0
- 21
-80.309489681169154
- 31
-0.0
- 0
-LINE
- 5
-308
- 8
-0
- 10
-92.309489681169154
- 20
-85.0
- 30
-0.0
- 11
-88.309489681169126
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-309
- 8
-0
- 10
-101.0
- 20
-78.430810024728771
- 30
-0.0
- 11
-97.0
- 21
-82.430810024728785
- 31
-0.0
- 0
-LINE
- 5
-30A
- 8
-0
- 10
-94.430810024728785
- 20
-85.0
- 30
-0.0
- 11
-90.430810024728771
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-30B
- 8
-0
- 10
-101.0
- 20
-80.552130368288417
- 30
-0.0
- 11
-97.0
- 21
-84.552130368288417
- 31
-0.0
- 0
-LINE
- 5
-30C
- 8
-0
- 10
-96.552130368288445
- 20
-85.0
- 30
-0.0
- 11
-92.552130368288445
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-30D
- 8
-0
- 10
-101.0
- 20
-82.673450711848062
- 30
-0.0
- 11
-94.673450711848091
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-30E
- 8
-0
- 10
-101.0
- 20
-84.794771055407708
- 30
-0.0
- 11
-96.794771055407722
- 21
-89.0
- 31
-0.0
- 0
-LINE
- 5
-30F
- 8
-0
- 10
-101.0
- 20
-86.916091398967325
- 30
-0.0
- 11
-98.916091398967353
- 21
-89.0
- 31
-0.0
- 0
-ENDBLK
- 5
-311
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-MIKROWELLENGERÄT
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-MIKROWELLENGERÄT
- 1
-MICROWAVE_OVEN
- 0
-POLYLINE
- 5
-337
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9AF
- 8
-0
- 10
-18.5
- 20
-4.5
- 30
-0.0
- 0
-VERTEX
- 5
-9B0
- 8
-0
- 10
-18.5
- 20
-5.5
- 30
-0.0
- 0
-VERTEX
- 5
-9B1
- 8
-0
- 10
-21.499999999999989
- 20
-5.5
- 30
-0.0
- 0
-VERTEX
- 5
-9B2
- 8
-0
- 10
-21.499999999999989
- 20
-4.5
- 30
-0.0
- 0
-SEQEND
- 5
-9B3
- 8
-0
- 0
-POLYLINE
- 5
-338
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9B4
- 8
-0
- 10
-18.5
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-9B5
- 8
-0
- 10
-18.5
- 20
-4.0
- 30
-0.0
- 0
-VERTEX
- 5
-9B6
- 8
-0
- 10
-21.499999999999989
- 20
-4.0
- 30
-0.0
- 0
-VERTEX
- 5
-9B7
- 8
-0
- 10
-21.499999999999989
- 20
-3.0
- 30
-0.0
- 0
-SEQEND
- 5
-9B8
- 8
-0
- 0
-LINE
- 5
-339
- 8
-0
- 10
-19.0
- 20
-6.0
- 30
-0.0
- 11
-19.0
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-33A
- 8
-0
- 10
-20.0
- 20
-6.0
- 30
-0.0
- 11
-18.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-33B
- 8
-0
- 10
-20.0
- 20
-7.0
- 30
-0.0
- 11
-20.0
- 21
-6.0
- 31
-0.0
- 0
-LINE
- 5
-33C
- 8
-0
- 10
-21.0
- 20
-7.0
- 30
-0.0
- 11
-21.0
- 21
-11.0
- 31
-0.0
- 0
-LINE
- 5
-33D
- 8
-0
- 10
-20.0
- 20
-11.0
- 30
-0.0
- 11
-20.0
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-33E
- 8
-0
- 10
-19.0
- 20
-7.0
- 30
-0.0
- 11
-19.0
- 21
-11.0
- 31
-0.0
- 0
-LINE
- 5
-33F
- 8
-0
- 10
-22.0
- 20
-7.0
- 30
-0.0
- 11
-18.0
- 21
-7.0
- 31
-0.0
- 0
-LINE
- 5
-340
- 8
-0
- 10
-18.0
- 20
-8.0
- 30
-0.0
- 11
-22.0
- 21
-8.0
- 31
-0.0
- 0
-LINE
- 5
-341
- 8
-0
- 10
-22.0
- 20
-9.0
- 30
-0.0
- 11
-18.0
- 21
-9.0
- 31
-0.0
- 0
-LINE
- 5
-342
- 8
-0
- 10
-18.0
- 20
-10.0
- 30
-0.0
- 11
-22.0
- 21
-10.0
- 31
-0.0
- 0
-POLYLINE
- 5
-343
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9B9
- 8
-0
- 10
-18.0
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-9BA
- 8
-0
- 10
-18.0
- 20
-11.0
- 30
-0.0
- 0
-VERTEX
- 5
-9BB
- 8
-0
- 10
-22.0
- 20
-11.0
- 30
-0.0
- 0
-VERTEX
- 5
-9BC
- 8
-0
- 10
-22.0
- 20
-2.0
- 30
-0.0
- 0
-SEQEND
- 5
-9BD
- 8
-0
- 0
-POLYLINE
- 5
-344
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9BE
- 8
-0
- 10
-18.0
- 20
-12.0
- 30
-0.0
- 0
-VERTEX
- 5
-9BF
- 8
-0
- 10
-18.0
- 20
-16.0
- 30
-0.0
- 0
-VERTEX
- 5
-9C0
- 8
-0
- 10
-22.0
- 20
-16.0
- 30
-0.0
- 0
-VERTEX
- 5
-9C1
- 8
-0
- 10
-22.0
- 20
-12.0
- 30
-0.0
- 0
-SEQEND
- 5
-9C2
- 8
-0
- 0
-POLYLINE
- 5
-345
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9C3
- 8
-0
- 10
-2.5
- 20
-2.5
- 30
-0.0
- 0
-VERTEX
- 5
-9C4
- 8
-0
- 10
-2.5
- 20
-15.5
- 30
-0.0
- 0
-VERTEX
- 5
-9C5
- 8
-0
- 10
-14.5
- 20
-15.5
- 30
-0.0
- 0
-VERTEX
- 5
-9C6
- 8
-0
- 10
-14.5
- 20
-2.5
- 30
-0.0
- 0
-SEQEND
- 5
-9C7
- 8
-0
- 0
-POLYLINE
- 5
-346
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9C8
- 8
-0
- 10
-1.0
- 20
-1.0
- 30
-0.0
- 0
-VERTEX
- 5
-9C9
- 8
-0
- 10
-1.0
- 20
-17.0
- 30
-0.0
- 0
-VERTEX
- 5
-9CA
- 8
-0
- 10
-16.0
- 20
-17.0
- 30
-0.0
- 0
-VERTEX
- 5
-9CB
- 8
-0
- 10
-16.0
- 20
-1.0
- 30
-0.0
- 0
-SEQEND
- 5
-9CC
- 8
-0
- 0
-POLYLINE
- 5
-347
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9CD
- 8
-0
- 10
-17.0
- 20
-1.0
- 30
-0.0
- 0
-VERTEX
- 5
-9CE
- 8
-0
- 10
-17.0
- 20
-17.0
- 30
-0.0
- 0
-VERTEX
- 5
-9CF
- 8
-0
- 10
-23.0
- 20
-17.0
- 30
-0.0
- 0
-VERTEX
- 5
-9D0
- 8
-0
- 10
-23.0
- 20
-1.0
- 30
-0.0
- 0
-SEQEND
- 5
-9D1
- 8
-0
- 0
-POLYLINE
- 5
-348
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9D2
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-9D3
- 8
-0
- 10
-0.0
- 20
-18.0
- 30
-0.0
- 0
-VERTEX
- 5
-9D4
- 8
-0
- 10
-24.0
- 20
-18.0
- 30
-0.0
- 0
-VERTEX
- 5
-9D5
- 8
-0
- 10
-24.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-9D6
- 8
-0
- 0
-ENDBLK
- 5
-34A
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-TELEFONSTECKDOSE
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-TELEFONSTECKDOSE
- 1
-PHONE_JACK
- 0
-LINE
- 5
-352
- 8
-0
- 10
--0.125
- 20
-0.5
- 30
-0.0
- 11
-0.125
- 21
-0.5
- 31
-0.0
- 0
-CIRCLE
- 5
-353
- 8
-0
- 10
-0.0
- 20
-0.5
- 30
-0.0
- 40
-0.125
- 0
-CIRCLE
- 5
-354
- 8
-0
- 10
-0.0
- 20
-4.5
- 30
-0.0
- 40
-0.125
- 0
-LINE
- 5
-355
- 8
-0
- 10
--0.125
- 20
-4.5
- 30
-0.0
- 11
-0.125
- 21
-4.5
- 31
-0.0
- 0
-POLYLINE
- 5
-356
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-9D9
- 8
-0
- 10
--0.1894000000000346
- 20
-2.4158000000000182
- 30
-0.0
- 0
-VERTEX
- 5
-9DA
- 8
-0
- 10
--0.1894000000000346
- 20
-2.6658000000000182
- 30
-0.0
- 0
-VERTEX
- 5
-9DB
- 8
-0
- 10
-0.1855999999999653
- 20
-2.6658000000000182
- 30
-0.0
- 0
-VERTEX
- 5
-9DC
- 8
-0
- 10
-0.1855999999999653
- 20
-2.4158000000000182
- 30
-0.0
- 0
-SEQEND
- 5
-9DD
- 8
-0
- 0
-POLYLINE
- 5
-357
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-9DE
- 8
-0
- 10
-0.0605999999999654
- 20
-2.2908000000000182
- 30
-0.0
- 0
-VERTEX
- 5
-9DF
- 8
-0
- 10
--0.0644000000000347
- 20
-2.2908000000000182
- 30
-0.0
- 0
-SEQEND
- 5
-9E0
- 8
-0
- 0
-LINE
- 5
-358
- 8
-0
- 10
-0.1230999999999653
- 20
-2.4158000000000182
- 30
-0.0
- 11
-0.1855999999999653
- 21
-2.4158000000000182
- 31
-0.0
- 0
-LINE
- 5
-359
- 8
-0
- 10
-0.1230999999999653
- 20
-2.3845000000000018
- 30
-0.0
- 11
-0.1230999999999653
- 21
-2.4158000000000182
- 31
-0.0
- 0
-LINE
- 5
-35A
- 8
-0
- 10
-0.0917999999999779
- 20
-2.3845000000000018
- 30
-0.0
- 11
-0.1230999999999653
- 21
-2.3845000000000018
- 31
-0.0
- 0
-LINE
- 5
-35B
- 8
-0
- 10
-0.0917999999999779
- 20
-2.3533000000000182
- 30
-0.0
- 11
-0.0917999999999779
- 21
-2.3845000000000018
- 31
-0.0
- 0
-LINE
- 5
-35C
- 8
-0
- 10
-0.0605999999999654
- 20
-2.3533000000000182
- 30
-0.0
- 11
-0.0917999999999779
- 21
-2.3533000000000182
- 31
-0.0
- 0
-LINE
- 5
-35D
- 8
-0
- 10
--0.1269000000000346
- 20
-2.4158000000000182
- 30
-0.0
- 11
--0.1894000000000346
- 21
-2.4158000000000182
- 31
-0.0
- 0
-LINE
- 5
-35E
- 8
-0
- 10
--0.1269000000000346
- 20
-2.3845000000000018
- 30
-0.0
- 11
--0.1269000000000346
- 21
-2.4158000000000182
- 31
-0.0
- 0
-LINE
- 5
-35F
- 8
-0
- 10
--0.0957000000000221
- 20
-2.3845000000000018
- 30
-0.0
- 11
--0.1269000000000346
- 21
-2.3845000000000018
- 31
-0.0
- 0
-LINE
- 5
-360
- 8
-0
- 10
--0.0957000000000221
- 20
-2.3533000000000182
- 30
-0.0
- 11
--0.0957000000000221
- 21
-2.3845000000000018
- 31
-0.0
- 0
-LINE
- 5
-361
- 8
-0
- 10
--0.0644000000000347
- 20
-2.3533000000000182
- 30
-0.0
- 11
--0.0957000000000221
- 21
-2.3533000000000182
- 31
-0.0
- 0
-LINE
- 5
-362
- 8
-0
- 10
-0.0605999999999654
- 20
-2.3533000000000182
- 30
-0.0
- 11
-0.0605999999999654
- 21
-2.2908000000000182
- 31
-0.0
- 0
-LINE
- 5
-363
- 8
-0
- 10
--0.0644000000000347
- 20
-2.2908000000000182
- 30
-0.0
- 11
--0.0644000000000347
- 21
-2.3533000000000182
- 31
-0.0
- 0
-CIRCLE
- 5
-364
- 8
-0
- 10
-0.0
- 20
-2.5
- 30
-0.0
- 40
-0.5
- 0
-LINE
- 5
-365
- 8
-0
- 10
-1.25
- 20
-0.25
- 30
-0.0
- 11
-1.5
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-366
- 8
-0
- 10
-1.25
- 20
-4.75
- 30
-0.0
- 11
-1.5
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-367
- 8
-0
- 10
--1.25
- 20
-4.75
- 30
-0.0
- 11
--1.5
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-368
- 8
-0
- 10
--1.25
- 20
-0.25
- 30
-0.0
- 11
--1.5
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-369
- 8
-0
- 10
-1.25
- 20
-0.25
- 30
-0.0
- 11
--1.25
- 21
-0.25
- 31
-0.0
- 0
-LINE
- 5
-36A
- 8
-0
- 10
-1.25
- 20
-4.75
- 30
-0.0
- 11
-1.25
- 21
-0.25
- 31
-0.0
- 0
-LINE
- 5
-36B
- 8
-0
- 10
--1.25
- 20
-4.75
- 30
-0.0
- 11
-1.25
- 21
-4.75
- 31
-0.0
- 0
-LINE
- 5
-36C
- 8
-0
- 10
--1.25
- 20
-0.25
- 30
-0.0
- 11
--1.25
- 21
-4.75
- 31
-0.0
- 0
-POLYLINE
- 5
-36D
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9E1
- 8
-0
- 10
--1.5
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-9E2
- 8
-0
- 10
--1.5
- 20
-5.0
- 30
-0.0
- 0
-VERTEX
- 5
-9E3
- 8
-0
- 10
-1.5
- 20
-5.0
- 30
-0.0
- 0
-VERTEX
- 5
-9E4
- 8
-0
- 10
-1.5
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-9E5
- 8
-0
- 0
-ENDBLK
- 5
-36F
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-HERD_-_76_CM_IN_VORDERANSI
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-HERD_-_76_CM_IN_VORDERANSI
- 1
-RANGE_30_INCH_FRONT
- 0
-CIRCLE
- 5
-377
- 8
-0
- 10
-26.0
- 20
-34.500050000000002
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-378
- 8
-0
- 10
-16.0
- 20
-34.500050000000002
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-379
- 8
-0
- 10
-11.0
- 20
-34.500050000000002
- 30
-0.0
- 40
-1.0
- 0
-CIRCLE
- 5
-37A
- 8
-0
- 10
-21.0
- 20
-34.500050000000002
- 30
-0.0
- 40
-1.0
- 0
-POLYLINE
- 5
-37B
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9E8
- 8
-0
- 10
-1.0
- 20
-33.500050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9E9
- 8
-0
- 10
-1.0
- 20
-35.500050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9EA
- 8
-0
- 10
-7.0
- 20
-35.500050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9EB
- 8
-0
- 10
-7.0
- 20
-33.500050000000002
- 30
-0.0
- 0
-SEQEND
- 5
-9EC
- 8
-0
- 0
-POLYLINE
- 5
-37C
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9ED
- 8
-0
- 10
-2.0
- 20
-31.000050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9EE
- 8
-0
- 10
-2.0
- 20
-32.000050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9EF
- 8
-0
- 10
-28.0
- 20
-32.000050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9F0
- 8
-0
- 10
-28.0
- 20
-31.000050000000002
- 30
-0.0
- 0
-SEQEND
- 5
-9F1
- 8
-0
- 0
-LINE
- 5
-37D
- 8
-0
- 10
-0.0
- 20
-33.000050000000002
- 30
-0.0
- 11
-30.0
- 21
-33.000050000000002
- 31
-0.0
- 0
-LINE
- 5
-37E
- 8
-0
- 10
-30.0
- 20
-10.0
- 30
-0.0
- 11
-0.0
- 21
-10.0
- 31
-0.0
- 0
-LINE
- 5
-37F
- 8
-0
- 10
-0.0
- 20
-5.0
- 30
-0.0
- 11
-30.0
- 21
-5.0
- 31
-0.0
- 0
-POLYLINE
- 5
-380
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9F2
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-9F3
- 8
-0
- 10
-0.0
- 20
-36.000050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9F4
- 8
-0
- 10
-30.0
- 20
-36.000050000000002
- 30
-0.0
- 0
-VERTEX
- 5
-9F5
- 8
-0
- 10
-30.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-9F6
- 8
-0
- 0
-ENDBLK
- 5
-382
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-HERD_-_76_CM_IN_DRAUFSICHT
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-HERD_-_76_CM_IN_DRAUFSICHT
- 1
-RANGE_30_INCH_TOP
- 0
-CIRCLE
- 5
-38A
- 8
-0
- 10
-24.0
- 20
--9.0000001999999988
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-38B
- 8
-0
- 10
-12.0
- 20
--6.0
- 30
-0.0
- 11
-18.0
- 21
--6.0
- 31
-0.0
- 0
-CIRCLE
- 5
-38C
- 8
-0
- 10
-6.0000000000000018
- 20
--9.0000001999999988
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-38D
- 8
-0
- 10
-0.0
- 20
--3.0
- 30
-0.0
- 11
-30.0
- 21
--3.0
- 31
-0.0
- 0
-CIRCLE
- 5
-38E
- 8
-0
- 10
-24.0
- 20
--18.0
- 30
-0.0
- 40
-4.0
- 0
-CIRCLE
- 5
-38F
- 8
-0
- 10
-24.0
- 20
--18.0
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-390
- 8
-0
- 10
-24.0
- 20
--18.0
- 30
-0.0
- 40
-2.0
- 0
-CIRCLE
- 5
-391
- 8
-0
- 10
-24.0
- 20
--18.0
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-392
- 8
-0
- 10
-22.0
- 20
--24.999995999999999
- 30
-0.0
- 11
-22.0
- 21
--23.999995999999999
- 31
-0.0
- 0
-LINE
- 5
-393
- 8
-0
- 10
-24.0
- 20
--23.999995999999999
- 30
-0.0
- 11
-24.0
- 21
--24.999995999999999
- 31
-0.0
- 0
-LINE
- 5
-394
- 8
-0
- 10
-18.0
- 20
--19.999995999999989
- 30
-0.0
- 11
-12.0
- 21
--19.999995999999989
- 31
-0.0
- 0
-LINE
- 5
-395
- 8
-0
- 10
-8.0000000000000018
- 20
--24.999995999999999
- 30
-0.0
- 11
-8.0000000000000018
- 21
--23.999995999999999
- 31
-0.0
- 0
-CIRCLE
- 5
-396
- 8
-0
- 10
-6.0000000000000018
- 20
--18.0
- 30
-0.0
- 40
-1.0
- 0
-LINE
- 5
-397
- 8
-0
- 10
-6.0000000000000018
- 20
--23.999995999999999
- 30
-0.0
- 11
-6.0000000000000018
- 21
--24.999995999999999
- 31
-0.0
- 0
-POLYLINE
- 5
-398
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9F9
- 8
-0
- 10
-2.0000000000000031
- 20
--25.999995999999999
- 30
-0.0
- 0
-VERTEX
- 5
-9FA
- 8
-0
- 10
-2.0000000000000031
- 20
--24.999995999999999
- 30
-0.0
- 0
-VERTEX
- 5
-9FB
- 8
-0
- 10
-28.0
- 20
--24.999995999999999
- 30
-0.0
- 0
-VERTEX
- 5
-9FC
- 8
-0
- 10
-28.0
- 20
--25.999995999999999
- 30
-0.0
- 0
-SEQEND
- 5
-9FD
- 8
-0
- 0
-CIRCLE
- 5
-399
- 8
-0
- 10
-6.0000000000000018
- 20
--18.0
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-39A
- 8
-0
- 10
-6.0000000000000018
- 20
--18.0
- 30
-0.0
- 40
-2.0
- 0
-LINE
- 5
-39B
- 8
-0
- 10
-17.0
- 20
--19.999995999999989
- 30
-0.0
- 11
-17.0
- 21
--6.0
- 31
-0.0
- 0
-LINE
- 5
-39C
- 8
-0
- 10
-16.0
- 20
--6.0
- 30
-0.0
- 11
-16.0
- 21
--19.999995999999989
- 31
-0.0
- 0
-LINE
- 5
-39D
- 8
-0
- 10
-15.0
- 20
--19.999995999999989
- 30
-0.0
- 11
-15.0
- 21
--6.0
- 31
-0.0
- 0
-LINE
- 5
-39E
- 8
-0
- 10
-14.0
- 20
--6.0
- 30
-0.0
- 11
-14.0
- 21
--19.999995999999989
- 31
-0.0
- 0
-LINE
- 5
-39F
- 8
-0
- 10
-13.0
- 20
--19.999995999999989
- 30
-0.0
- 11
-13.0
- 21
--6.0
- 31
-0.0
- 0
-POLYLINE
- 5
-3A0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-9FE
- 8
-0
- 10
-12.0
- 20
--20.999995999999989
- 30
-0.0
- 0
-VERTEX
- 5
-9FF
- 8
-0
- 10
-12.0
- 20
--5.0
- 30
-0.0
- 0
-VERTEX
- 5
-A00
- 8
-0
- 10
-18.0
- 20
--5.0
- 30
-0.0
- 0
-VERTEX
- 5
-A01
- 8
-0
- 10
-18.0
- 20
--20.999995999999989
- 30
-0.0
- 0
-SEQEND
- 5
-A02
- 8
-0
- 0
-CIRCLE
- 5
-3A1
- 8
-0
- 10
-24.0
- 20
--9.0000001999999988
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-3A2
- 8
-0
- 10
-24.0
- 20
--9.0000001999999988
- 30
-0.0
- 40
-2.0
- 0
-CIRCLE
- 5
-3A3
- 8
-0
- 10
-6.0000000000000018
- 20
--9.0000001999999988
- 30
-0.0
- 40
-4.0
- 0
-CIRCLE
- 5
-3A4
- 8
-0
- 10
-6.0000000000000018
- 20
--9.0000001999999988
- 30
-0.0
- 40
-3.0
- 0
-CIRCLE
- 5
-3A5
- 8
-0
- 10
-6.0000000000000018
- 20
--9.0000001999999988
- 30
-0.0
- 40
-2.0
- 0
-POLYLINE
- 5
-3A6
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A03
- 8
-0
- 10
-0.0
- 20
--23.999995999999999
- 30
-0.0
- 0
-VERTEX
- 5
-A04
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A05
- 8
-0
- 10
-30.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A06
- 8
-0
- 10
-30.0
- 20
--23.999995999999999
- 30
-0.0
- 0
-SEQEND
- 5
-A07
- 8
-0
- 0
-ENDBLK
- 5
-3A8
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-HERDABZUGSHAUBE_-_76_CM_IN
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-HERDABZUGSHAUBE_-_76_CM_IN
- 1
-RANGE_HOOD_30_INCH_FRONT
- 0
-POLYLINE
- 5
-3B0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A0A
- 8
-0
- 10
-23.0
- 20
--5.75
- 30
-0.0
- 0
-VERTEX
- 5
-A0B
- 8
-0
- 10
-23.0
- 20
--4.25
- 30
-0.0
- 0
-VERTEX
- 5
-A0C
- 8
-0
- 10
-29.0
- 20
--4.25
- 30
-0.0
- 0
-VERTEX
- 5
-A0D
- 8
-0
- 10
-29.0
- 20
--5.75
- 30
-0.0
- 0
-SEQEND
- 5
-A0E
- 8
-0
- 0
-CIRCLE
- 5
-3B1
- 8
-0
- 10
-4.0
- 20
--5.0
- 30
-0.0
- 40
-0.75
- 0
-CIRCLE
- 5
-3B2
- 8
-0
- 10
-2.0
- 20
--5.0
- 30
-0.0
- 40
-0.75
- 0
-LINE
- 5
-3B3
- 8
-0
- 10
-0.0
- 20
--4.0
- 30
-0.0
- 11
-30.000100000000199
- 21
--4.0
- 31
-0.0
- 0
-POLYLINE
- 5
-3B4
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A0F
- 8
-0
- 10
-0.0
- 20
--6.0
- 30
-0.0
- 0
-VERTEX
- 5
-A10
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A11
- 8
-0
- 10
-30.000100000000199
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A12
- 8
-0
- 10
-30.000100000000199
- 20
--6.0
- 30
-0.0
- 0
-SEQEND
- 5
-A13
- 8
-0
- 0
-ENDBLK
- 5
-3B6
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-KÜHLSCHRANK_-_ZWEITÜRIGER_
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-KÜHLSCHRANK_-_ZWEITÜRIGER_
- 1
-REFRIGERATOR_2_DOOR_36_INCH_FRT
- 0
-POLYLINE
- 5
-3BE
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A16
- 8
-0
- 10
-11.0
- 20
-36.0
- 30
-0.0
- 0
-VERTEX
- 5
-A17
- 8
-0
- 10
-11.0
- 20
-52.000000000000007
- 30
-0.0
- 0
-VERTEX
- 5
-A18
- 8
-0
- 10
-13.0
- 20
-52.000000000000007
- 30
-0.0
- 0
-VERTEX
- 5
-A19
- 8
-0
- 10
-13.0
- 20
-36.0
- 30
-0.0
- 0
-SEQEND
- 5
-A1A
- 8
-0
- 0
-LINE
- 5
-3BF
- 8
-0
- 10
-12.0
- 20
-5.0
- 30
-0.0
- 11
-12.0
- 21
-64.0
- 31
-0.0
- 0
-POLYLINE
- 5
-3C0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A1B
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A1C
- 8
-0
- 10
-0.0
- 20
-64.0
- 30
-0.0
- 0
-VERTEX
- 5
-A1D
- 8
-0
- 10
-36.0
- 20
-64.0
- 30
-0.0
- 0
-VERTEX
- 5
-A1E
- 8
-0
- 10
-36.0
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-A1F
- 8
-0
- 0
-LINE
- 5
-3C1
- 8
-0
- 10
-0.0
- 20
-5.0
- 30
-0.0
- 11
-36.0
- 21
-5.0
- 31
-0.0
- 0
-ENDBLK
- 5
-3C3
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-KÜHLSCHRANK_-_ZWEITÜRIGER0
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-KÜHLSCHRANK_-_ZWEITÜRIGER0
- 1
-REFRIGERATOR_2_DOOR_36_INCH_TOP
- 0
-LINE
- 5
-3CB
- 8
-0
- 10
-12.0
- 20
--26.999998999999988
- 30
-0.0
- 11
-12.0
- 21
--28.999998999999999
- 31
-0.0
- 0
-LINE
- 5
-3CC
- 8
-0
- 10
-13.0
- 20
--28.999998999999999
- 30
-0.0
- 11
-13.0
- 21
--27.999998999999988
- 31
-0.0
- 0
-LINE
- 5
-3CD
- 8
-0
- 10
-11.0
- 20
--28.999998999999999
- 30
-0.0
- 11
-13.0
- 21
--28.999998999999999
- 31
-0.0
- 0
-LINE
- 5
-3CE
- 8
-0
- 10
-11.0
- 20
--27.999998999999988
- 30
-0.0
- 11
-11.0
- 21
--28.999998999999999
- 31
-0.0
- 0
-LINE
- 5
-3CF
- 8
-0
- 10
-0.0
- 20
--26.999998999999988
- 30
-0.0
- 11
-36.0
- 21
--26.999998999999988
- 31
-0.0
- 0
-POLYLINE
- 5
-3D0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A22
- 8
-0
- 10
-0.0
- 20
--27.999998999999988
- 30
-0.0
- 0
-VERTEX
- 5
-A23
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A24
- 8
-0
- 10
-36.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A25
- 8
-0
- 10
-36.0
- 20
--27.999998999999988
- 30
-0.0
- 0
-SEQEND
- 5
-A26
- 8
-0
- 0
-ENDBLK
- 5
-3D2
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-SPÜLE_-_DOPPELSPÜLE_MIT_91
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-SPÜLE_-_DOPPELSPÜLE_MIT_91
- 1
-SINK_DOUBLE_36_INCH_TOP
- 0
-ARC
- 5
-3DA
- 8
-0
- 10
-15.5
- 20
--6.5
- 30
-0.0
- 40
-1.0
- 50
-0.0
- 51
-90.0
- 0
-ARC
- 5
-3DB
- 8
-0
- 10
-16.5
- 20
--1.5
- 30
-0.0
- 40
-1.5
- 50
-0.0
- 51
-90.0
- 0
-CIRCLE
- 5
-3DC
- 8
-0
- 10
-8.5
- 20
--12.5
- 30
-0.0
- 40
-0.5
- 0
-CIRCLE
- 5
-3DD
- 8
-0
- 10
-8.5
- 20
--12.5
- 30
-0.0
- 40
-1.0
- 0
-ARC
- 5
-3DE
- 8
-0
- 10
-15.5
- 20
--18.5
- 30
-0.0
- 40
-1.0
- 50
-270.0
- 51
-0.0
- 0
-ARC
- 5
-3DF
- 8
-0
- 10
-16.5
- 20
--19.5
- 30
-0.0
- 40
-1.5
- 50
-270.0
- 51
-0.0
- 0
-POLYLINE
- 5
-3E0
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A29
- 8
-0
- 10
-16.5
- 20
--6.5
- 30
-0.0
- 0
-VERTEX
- 5
-A2A
- 8
-0
- 10
-16.5
- 20
--18.5
- 30
-0.0
- 0
-SEQEND
- 5
-A2B
- 8
-0
- 0
-POLYLINE
- 5
-3E1
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A2C
- 8
-0
- 10
-18.0
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A2D
- 8
-0
- 10
-18.0
- 20
--19.5
- 30
-0.0
- 0
-SEQEND
- 5
-A2E
- 8
-0
- 0
-ARC
- 5
-3E2
- 8
-0
- 10
-1.75
- 20
--6.5
- 30
-0.0
- 40
-1.0
- 50
-90.0
- 51
-180.0
- 0
-ARC
- 5
-3E3
- 8
-0
- 10
--1.75
- 20
--6.5
- 30
-0.0
- 40
-1.0
- 50
-0.0
- 51
-90.0
- 0
-ARC
- 5
-3E4
- 8
-0
- 10
--15.5
- 20
--6.5
- 30
-0.0
- 40
-1.0
- 50
-90.0
- 51
-180.0
- 0
-ARC
- 5
-3E5
- 8
-0
- 10
--16.5
- 20
--1.5
- 30
-0.0
- 40
-1.5
- 50
-90.0
- 51
-180.0
- 0
-POLYLINE
- 5
-3E6
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A2F
- 8
-0
- 10
--15.5
- 20
--5.5
- 30
-0.0
- 0
-VERTEX
- 5
-A30
- 8
-0
- 10
--1.75
- 20
--5.5
- 30
-0.0
- 0
-SEQEND
- 5
-A31
- 8
-0
- 0
-ARC
- 5
-3E7
- 8
-0
- 10
-1.75
- 20
--18.5
- 30
-0.0
- 40
-1.0
- 50
-180.0
- 51
-270.0
- 0
-ARC
- 5
-3E8
- 8
-0
- 10
--1.75
- 20
--18.5
- 30
-0.0
- 40
-1.0
- 50
-270.0
- 51
-0.0
- 0
-CIRCLE
- 5
-3E9
- 8
-0
- 10
--8.5
- 20
--12.5
- 30
-0.0
- 40
-0.5
- 0
-CIRCLE
- 5
-3EA
- 8
-0
- 10
--8.5
- 20
--12.5
- 30
-0.0
- 40
-1.0
- 0
-ARC
- 5
-3EB
- 8
-0
- 10
--15.5
- 20
--18.5
- 30
-0.0
- 40
-1.0
- 50
-180.0
- 51
-270.0
- 0
-ARC
- 5
-3EC
- 8
-0
- 10
--16.5
- 20
--19.5
- 30
-0.0
- 40
-1.5
- 50
-180.0
- 51
-270.0
- 0
-POLYLINE
- 5
-3ED
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A32
- 8
-0
- 10
--1.75
- 20
--19.5
- 30
-0.0
- 0
-VERTEX
- 5
-A33
- 8
-0
- 10
--15.5
- 20
--19.5
- 30
-0.0
- 0
-SEQEND
- 5
-A34
- 8
-0
- 0
-POLYLINE
- 5
-3EE
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A35
- 8
-0
- 10
--16.5
- 20
--18.5
- 30
-0.0
- 0
-VERTEX
- 5
-A36
- 8
-0
- 10
--16.5
- 20
--6.5
- 30
-0.0
- 0
-SEQEND
- 5
-A37
- 8
-0
- 0
-POLYLINE
- 5
-3EF
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A38
- 8
-0
- 10
--18.0
- 20
--19.5
- 30
-0.0
- 0
-VERTEX
- 5
-A39
- 8
-0
- 10
--18.0
- 20
--1.5
- 30
-0.0
- 0
-SEQEND
- 5
-A3A
- 8
-0
- 0
-LINE
- 5
-3F0
- 8
-0
- 10
-0.75
- 20
--6.5
- 30
-0.0
- 11
-0.75
- 21
--18.5
- 31
-0.0
- 0
-LINE
- 5
-3F1
- 8
-0
- 10
--0.75
- 20
--18.5
- 30
-0.0
- 11
--0.75
- 21
--6.5
- 31
-0.0
- 0
-POLYLINE
- 5
-3F2
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A3B
- 8
-0
- 10
-16.5
- 20
--21.0
- 30
-0.0
- 0
-VERTEX
- 5
-A3C
- 8
-0
- 10
--16.5
- 20
--21.0
- 30
-0.0
- 0
-SEQEND
- 5
-A3D
- 8
-0
- 0
-POLYLINE
- 5
-3F3
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A3E
- 8
-0
- 10
--16.5
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A3F
- 8
-0
- 10
-16.5
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-A40
- 8
-0
- 0
-LINE
- 5
-3F4
- 8
-0
- 10
--18.0
- 20
--4.0
- 30
-0.0
- 11
-18.0
- 21
--4.0
- 31
-0.0
- 0
-POLYLINE
- 5
-3F5
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A41
- 8
-0
- 10
-1.75
- 20
--5.5
- 30
-0.0
- 0
-VERTEX
- 5
-A42
- 8
-0
- 10
-15.5
- 20
--5.5
- 30
-0.0
- 0
-SEQEND
- 5
-A43
- 8
-0
- 0
-POLYLINE
- 5
-3F6
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A44
- 8
-0
- 10
-15.5
- 20
--19.5
- 30
-0.0
- 0
-VERTEX
- 5
-A45
- 8
-0
- 10
-1.75
- 20
--19.5
- 30
-0.0
- 0
-SEQEND
- 5
-A46
- 8
-0
- 0
-ENDBLK
- 5
-3F8
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-SPÜLE_-_EINZELSPÜLE_MIT_76
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-SPÜLE_-_EINZELSPÜLE_MIT_76
- 1
-SINK_SINGLE_30_INCH_TOP
- 0
-ARC
- 5
-400
- 8
-0
- 10
-12.5
- 20
--6.4999960000000012
- 30
-0.0
- 40
-1.0
- 50
-0.0
- 51
-90.0
- 0
-ARC
- 5
-401
- 8
-0
- 10
--12.5
- 20
--6.4999960000000012
- 30
-0.0
- 40
-1.0
- 50
-90.0
- 51
-180.0
- 0
-CIRCLE
- 5
-402
- 8
-0
- 10
-0.0
- 20
--11.999995999999999
- 30
-0.0
- 40
-0.5
- 0
-CIRCLE
- 5
-403
- 8
-0
- 10
-0.0
- 20
--11.999995999999999
- 30
-0.0
- 40
-1.0
- 0
-POLYLINE
- 5
-404
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A49
- 8
-0
- 10
--12.5
- 20
--5.4999960000000012
- 30
-0.0
- 0
-VERTEX
- 5
-A4A
- 8
-0
- 10
-12.5
- 20
--5.4999960000000012
- 30
-0.0
- 0
-SEQEND
- 5
-A4B
- 8
-0
- 0
-ARC
- 5
-405
- 8
-0
- 10
-12.5
- 20
--17.499995999999989
- 30
-0.0
- 40
-1.0
- 50
-270.0
- 51
-0.0
- 0
-ARC
- 5
-406
- 8
-0
- 10
-13.5
- 20
--18.499995999999999
- 30
-0.0
- 40
-1.5
- 50
-270.0
- 51
-0.0
- 0
-ARC
- 5
-407
- 8
-0
- 10
--12.5
- 20
--17.499995999999989
- 30
-0.0
- 40
-1.0
- 50
-180.0
- 51
-270.0
- 0
-ARC
- 5
-408
- 8
-0
- 10
--13.5
- 20
--18.499995999999999
- 30
-0.0
- 40
-1.5
- 50
-180.0
- 51
-270.0
- 0
-POLYLINE
- 5
-409
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A4C
- 8
-0
- 10
-13.5
- 20
--19.999995999999989
- 30
-0.0
- 0
-VERTEX
- 5
-A4D
- 8
-0
- 10
--13.5
- 20
--19.999995999999989
- 30
-0.0
- 0
-SEQEND
- 5
-A4E
- 8
-0
- 0
-POLYLINE
- 5
-40A
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A4F
- 8
-0
- 10
-12.5
- 20
--18.499995999999999
- 30
-0.0
- 0
-VERTEX
- 5
-A50
- 8
-0
- 10
--12.5
- 20
--18.499995999999999
- 30
-0.0
- 0
-SEQEND
- 5
-A51
- 8
-0
- 0
-POLYLINE
- 5
-40B
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A52
- 8
-0
- 10
--13.5
- 20
--17.499995999999989
- 30
-0.0
- 0
-VERTEX
- 5
-A53
- 8
-0
- 10
--13.5
- 20
--6.4999960000000012
- 30
-0.0
- 0
-SEQEND
- 5
-A54
- 8
-0
- 0
-POLYLINE
- 5
-40C
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A55
- 8
-0
- 10
-13.5
- 20
--6.4999960000000012
- 30
-0.0
- 0
-VERTEX
- 5
-A56
- 8
-0
- 10
-13.5
- 20
--17.499995999999989
- 30
-0.0
- 0
-SEQEND
- 5
-A57
- 8
-0
- 0
-ARC
- 5
-40D
- 8
-0
- 10
-13.5
- 20
--1.5
- 30
-0.0
- 40
-1.5
- 50
-0.0
- 51
-90.0
- 0
-POLYLINE
- 5
-40E
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A58
- 8
-0
- 10
-15.0
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A59
- 8
-0
- 10
-15.0
- 20
--18.499995999999999
- 30
-0.0
- 0
-SEQEND
- 5
-A5A
- 8
-0
- 0
-ARC
- 5
-40F
- 8
-0
- 10
--13.5
- 20
--1.5
- 30
-0.0
- 40
-1.5
- 50
-90.0
- 51
-180.0
- 0
-POLYLINE
- 5
-410
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A5B
- 8
-0
- 10
--15.0
- 20
--18.499995999999999
- 30
-0.0
- 0
-VERTEX
- 5
-A5C
- 8
-0
- 10
--15.0
- 20
--1.5
- 30
-0.0
- 0
-SEQEND
- 5
-A5D
- 8
-0
- 0
-POLYLINE
- 5
-411
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A5E
- 8
-0
- 10
--13.5
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A5F
- 8
-0
- 10
-13.5
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-A60
- 8
-0
- 0
-LINE
- 5
-412
- 8
-0
- 10
--15.0
- 20
--3.9999960000000012
- 30
-0.0
- 11
-15.0
- 21
--3.9999960000000012
- 31
-0.0
- 0
-ENDBLK
- 5
-414
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-LICHTSCHALTER_-_DOPPELSCHA
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-LICHTSCHALTER_-_DOPPELSCHA
- 1
-SWITCH_DOUBLE
- 0
-POLYLINE
- 5
-41C
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A63
- 8
-0
- 10
--0.7818000000000041
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A64
- 8
-0
- 10
--0.75
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A65
- 8
-0
- 10
--0.75
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A66
- 8
-0
- 10
--1.25
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A67
- 8
-0
- 10
--1.25
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A68
- 8
-0
- 10
--1.221900000000004
- 20
-3.0
- 30
-0.0
- 0
-SEQEND
- 5
-A69
- 8
-0
- 0
-LINE
- 5
-41D
- 8
-0
- 10
--0.7854000000000099
- 20
-2.5
- 30
-0.0
- 11
--1.2182999999999991
- 21
-2.5
- 31
-0.0
- 0
-POLYLINE
- 5
-41E
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A6A
- 8
-0
- 10
--0.7800000000000013
- 20
-3.125
- 30
-0.0
- 0
-VERTEX
- 5
-A6B
- 8
-0
- 10
--0.7800000000000013
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A6C
- 8
-0
- 10
--1.2199999999999971
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A6D
- 8
-0
- 10
--1.2199999999999971
- 20
-3.125
- 30
-0.0
- 0
-SEQEND
- 5
-A6E
- 8
-0
- 0
-LINE
- 5
-41F
- 8
-0
- 10
--0.875
- 20
-4.0
- 30
-0.0
- 11
--1.125
- 21
-4.0
- 31
-0.0
- 0
-CIRCLE
- 5
-420
- 8
-0
- 10
--1.0
- 20
-4.0
- 30
-0.0
- 40
-0.125
- 0
-LINE
- 5
-421
- 8
-0
- 10
--0.875
- 20
-1.0
- 30
-0.0
- 11
--1.125
- 21
-1.0
- 31
-0.0
- 0
-CIRCLE
- 5
-422
- 8
-0
- 10
--1.0
- 20
-1.0
- 30
-0.0
- 40
-0.125
- 0
-POLYLINE
- 5
-423
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A6F
- 8
-0
- 10
-0.781700000000001
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A70
- 8
-0
- 10
-0.75
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A71
- 8
-0
- 10
-0.75
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A72
- 8
-0
- 10
-1.25
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A73
- 8
-0
- 10
-1.25
- 20
-2.0
- 30
-0.0
- 0
-VERTEX
- 5
-A74
- 8
-0
- 10
-1.2218999999999749
- 20
-2.0
- 30
-0.0
- 0
-SEQEND
- 5
-A75
- 8
-0
- 0
-LINE
- 5
-424
- 8
-0
- 10
-0.7853999999999815
- 20
-2.5
- 30
-0.0
- 11
-1.2181999999999951
- 21
-2.5
- 31
-0.0
- 0
-POLYLINE
- 5
-425
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A76
- 8
-0
- 10
-0.7800000000000013
- 20
-1.875
- 30
-0.0
- 0
-VERTEX
- 5
-A77
- 8
-0
- 10
-0.7800000000000013
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A78
- 8
-0
- 10
-1.2199999999999971
- 20
-3.0
- 30
-0.0
- 0
-VERTEX
- 5
-A79
- 8
-0
- 10
-1.2199999999999971
- 20
-1.875
- 30
-0.0
- 0
-SEQEND
- 5
-A7A
- 8
-0
- 0
-LINE
- 5
-426
- 8
-0
- 10
-0.875
- 20
-1.0
- 30
-0.0
- 11
-1.125
- 21
-1.0
- 31
-0.0
- 0
-CIRCLE
- 5
-427
- 8
-0
- 10
-1.0
- 20
-1.0
- 30
-0.0
- 40
-0.125
- 0
-LINE
- 5
-428
- 8
-0
- 10
-0.875
- 20
-4.0
- 30
-0.0
- 11
-1.125
- 21
-4.0
- 31
-0.0
- 0
-CIRCLE
- 5
-429
- 8
-0
- 10
-1.0
- 20
-4.0
- 30
-0.0
- 40
-0.125
- 0
-LINE
- 5
-42A
- 8
-0
- 10
-2.25
- 20
-0.25
- 30
-0.0
- 11
-2.5
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-42B
- 8
-0
- 10
-2.25
- 20
-4.75
- 30
-0.0
- 11
-2.5
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-42C
- 8
-0
- 10
-2.25
- 20
-0.25
- 30
-0.0
- 11
--2.25
- 21
-0.25
- 31
-0.0
- 0
-LINE
- 5
-42D
- 8
-0
- 10
-2.25
- 20
-4.75
- 30
-0.0
- 11
-2.25
- 21
-0.25
- 31
-0.0
- 0
-LINE
- 5
-42E
- 8
-0
- 10
--2.25
- 20
-4.75
- 30
-0.0
- 11
-2.25
- 21
-4.75
- 31
-0.0
- 0
-POLYLINE
- 5
-42F
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A7B
- 8
-0
- 10
--2.5
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A7C
- 8
-0
- 10
--2.5
- 20
-5.0
- 30
-0.0
- 0
-VERTEX
- 5
-A7D
- 8
-0
- 10
-2.5
- 20
-5.0
- 30
-0.0
- 0
-VERTEX
- 5
-A7E
- 8
-0
- 10
-2.5
- 20
-0.0
- 30
-0.0
- 0
-SEQEND
- 5
-A7F
- 8
-0
- 0
-LINE
- 5
-430
- 8
-0
- 10
--2.25
- 20
-4.75
- 30
-0.0
- 11
--2.5
- 21
-5.0
- 31
-0.0
- 0
-LINE
- 5
-431
- 8
-0
- 10
--2.25
- 20
-0.25
- 30
-0.0
- 11
--2.5
- 21
-0.0
- 31
-0.0
- 0
-LINE
- 5
-432
- 8
-0
- 10
--2.25
- 20
-0.25
- 30
-0.0
- 11
--2.25
- 21
-4.75
- 31
-0.0
- 0
-ENDBLK
- 5
-434
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-HÄNGESCHRANK_-_46_X_30_CM_
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-HÄNGESCHRANK_-_46_X_30_CM_
- 1
-WALL_CABINET_18X12_SIDE
- 0
-POLYLINE
- 5
-43C
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A82
- 8
-0
- 10
--13.0
- 20
--16.5
- 30
-0.0
- 0
-VERTEX
- 5
-A83
- 8
-0
- 10
--13.0
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A84
- 8
-0
- 10
--12.5
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A85
- 8
-0
- 10
--12.5
- 20
--16.5
- 30
-0.0
- 0
-SEQEND
- 5
-A86
- 8
-0
- 0
-POLYLINE
- 5
-43D
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A87
- 8
-0
- 10
--12.0
- 20
--18.0
- 30
-0.0
- 0
-VERTEX
- 5
-A88
- 8
-0
- 10
--12.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A89
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A8A
- 8
-0
- 10
-0.0
- 20
--18.0
- 30
-0.0
- 0
-SEQEND
- 5
-A8B
- 8
-0
- 0
-ENDBLK
- 5
-43F
- 8
-0
- 0
-BLOCK
- 8
-0
- 2
-HÄNGESCHRANK_-_46_X_91_CM_
- 70
- 2
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-HÄNGESCHRANK_-_46_X_91_CM_
- 1
-WALL_CABINET_18X36_FRONT
- 0
-LINE
- 5
-447
- 8
-0
- 10
-18.5
- 20
--16.5
- 30
-0.0
- 11
-18.5
- 21
--1.5
- 31
-0.0
- 0
-LINE
- 5
-448
- 8
-0
- 10
-17.5
- 20
--1.5
- 30
-0.0
- 11
-17.5
- 21
--16.5
- 31
-0.0
- 0
-POLYLINE
- 5
-449
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A8E
- 8
-0
- 10
-18.5
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A8F
- 8
-0
- 10
-34.5
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A90
- 8
-0
- 10
-34.5
- 20
--16.5
- 30
-0.0
- 0
-VERTEX
- 5
-A91
- 8
-0
- 10
-18.5
- 20
--16.5
- 30
-0.0
- 0
-SEQEND
- 5
-A92
- 8
-0
- 0
-POLYLINE
- 5
-44A
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A93
- 8
-0
- 10
-17.5
- 20
--16.5
- 30
-0.0
- 0
-VERTEX
- 5
-A94
- 8
-0
- 10
-1.5
- 20
--16.5
- 30
-0.0
- 0
-VERTEX
- 5
-A95
- 8
-0
- 10
-1.5
- 20
--1.5
- 30
-0.0
- 0
-VERTEX
- 5
-A96
- 8
-0
- 10
-17.5
- 20
--1.5
- 30
-0.0
- 0
-SEQEND
- 5
-A97
- 8
-0
- 0
-POLYLINE
- 5
-44B
- 8
-0
- 66
- 1
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 70
- 1
- 0
-VERTEX
- 5
-A98
- 8
-0
- 10
-0.0
- 20
--18.0
- 30
-0.0
- 0
-VERTEX
- 5
-A99
- 8
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A9A
- 8
-0
- 10
-36.0
- 20
-0.0
- 30
-0.0
- 0
-VERTEX
- 5
-A9B
- 8
-0
- 10
-36.0
- 20
--18.0
- 30
-0.0
- 0
-SEQEND
- 5
-A9C
- 8
-0
- 0
-ENDBLK
- 5
-44D
- 8
-0
- 0
-ENDSEC
- 0
-SECTION
- 2
-ENTITIES
- 0
-INSERT
- 5
-47
- 8
-0
- 2
-SCHRANK_-_SCHRANKTÜR_1_IN_
- 10
-24.331368346318101
- 20
-144.8344702039895
- 30
-0.0
- 0
-INSERT
- 5
-6E
- 8
-0
- 2
-SCHRANK_-_SCHRANKTÜR_1_MIT
- 10
-29.6830998410204
- 20
-145.04317761806359
- 30
-0.0
- 0
-INSERT
- 5
-AB
- 8
-0
- 2
-GESCHIRRSPÜLMASCHINE
- 10
-60.105710772110569
- 20
-145.04317761806359
- 30
-0.0
- 0
-INSERT
- 5
-E2
- 8
-0
- 2
-ARMATUR_-_KÜCHENARMATUR_IN
- 10
-98.54882786903454
- 20
-171.85263706733321
- 30
-0.0
- 0
-INSERT
- 5
-103
- 8
-0
- 2
-ARMATUR_-_KÜCHENARMATUR_I0
- 10
-99.378535322428206
- 20
-164.94298264937009
- 30
-0.0
- 0
-INSERT
- 5
-128
- 8
-0
- 2
-ARMATUR_-_EINHEBELMISCHER_
- 10
-119.2915171402322
- 20
-172.4054092157217
- 30
-0.0
- 0
-INSERT
- 5
-13B
- 8
-0
- 2
-ARMATUR_-_EINHEBELMISCHER0
- 10
-118.46180968683881
- 20
-164.6665965751759
- 30
-0.0
- 0
-INSERT
- 5
-19A
- 8
-0
- 2
-EIS-_UND_WASSERSPENDER
- 10
-132.56362930600071
- 20
-159.60502300407529
- 30
-0.0
- 0
-INSERT
- 5
-318
- 8
-0
- 2
-KÜCHENBLOCK_-_2100_X_2400_
- 10
-6.0898855669328213
- 20
-42.533505871986719
- 30
-0.0
- 0
-INSERT
- 5
-350
- 8
-0
- 2
-MIKROWELLENGERÄT
- 10
-122.4536224511608
- 20
-113.92970571603421
- 30
-0.0
- 0
-INSERT
- 5
-375
- 8
-0
- 2
-TELEFONSTECKDOSE
- 10
-156.63571516314519
- 20
-126.3204868920714
- 30
-0.0
- 0
-INSERT
- 5
-388
- 8
-0
- 2
-HERD_-_76_CM_IN_VORDERANSI
- 10
-168.3676038291764
- 20
-96.411705033417491
- 30
-0.0
- 0
-INSERT
- 5
-3AE
- 8
-0
- 2
-HERD_-_76_CM_IN_DRAUFSICHT
- 10
-204.1519799347677
- 20
-131.447706764809
- 30
-0.0
- 0
-INSERT
- 5
-3BC
- 8
-0
- 2
-HERDABZUGSHAUBE_-_76_CM_IN
- 10
-120.4058526729516
- 20
-81.884582426818653
- 30
-0.0
- 0
-INSERT
- 5
-3C9
- 8
-0
- 2
-KÜHLSCHRANK_-_ZWEITÜRIGER_
- 10
-164.4152973919943
- 20
-23.348823860774409
- 30
-0.0
- 0
-INSERT
- 5
-3D8
- 8
-0
- 2
-KÜHLSCHRANK_-_ZWEITÜRIGER0
- 10
-205.86108504018389
- 20
-87.011802299556436
- 30
-0.0
- 0
-INSERT
- 5
-3FE
- 8
-0
- 2
-SPÜLE_-_DOPPELSPÜLE_MIT_91
- 10
-20.53095125746756
- 20
-22.067018709510929
- 30
-0.0
- 0
-INSERT
- 5
-41A
- 8
-0
- 2
-SPÜLE_-_EINZELSPÜLE_MIT_76
- 10
-63.258567147448161
- 20
-22.494287215318121
- 30
-0.0
- 0
-INSERT
- 5
-43A
- 8
-0
- 2
-LICHTSCHALTER_-_DOPPELSCHA
- 10
-92.313346304997708
- 20
-17.794335482229481
- 30
-0.0
- 0
-INSERT
- 5
-445
- 8
-0
- 2
-HÄNGESCHRANK_-_46_X_30_CM_
- 10
-117.0953632862777
- 20
-20.785213924405522
- 30
-0.0
- 0
-INSERT
- 5
-453
- 8
-0
- 2
-HÄNGESCHRANK_-_46_X_91_CM_
- 10
-121.7954005643586
- 20
-20.785213924405522
- 30
-0.0
- 0
-ENDSEC
- 0
-EOF
diff --git a/dxflib/test/main.cpp b/dxflib/test/main.cpp
deleted file mode 100644
index 103722d..0000000
--- a/dxflib/test/main.cpp
+++ /dev/null
@@ -1,278 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-/*****************************************************************************
-** $Id: main.cpp 3591 2006-10-18 21:23:25Z andrew $
-**
-** This is part of the dxflib library
-** Copyright (C) 2000-2001 Andrew Mustun
-**
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Library General Public License as
-** published by the Free Software Foundation.
-**
-** This program 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 this program; if not, write to the Free Software
-** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-******************************************************************************/
-
-#include <iostream>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "dl_dxf.h"
-#include "dl_creationadapter.h"
-
-#include "test_creationclass.h"
-
-void usage();
-void testReading(char* file);
-void testWriting();
-
-
-/*
- * @brief Main function for DXFLib test program.
- *
- * @param argc Number of delimited items on command line,
- * including program name.
- * @param argv Pointer to array of command line items
- *
- * @retval 0 if missing input file argument or
- * file couldn't be opened
- * @retval 1 if file opened
- */
-int main(int argc, char** argv) {
-
- // Check given arguments:
- if (argc<2) {
- usage();
- return 0;
- }
-
- testReading(argv[1]);
-
- testWriting();
-
- return 0;
-}
-
-
-
-/*
- * @brief Prints error message if file name not specified as command
- * line argument.
- */
-void usage() {
- std::cout << "\nUsage: test <DXF file>\n\n";
-}
-
-
-void testReading(char* file) {
- // Load DXF file into memory:
- std::cout << "Reading file " << file << "...\n";
- Test_CreationClass* creationClass = new Test_CreationClass();
- DL_Dxf* dxf = new DL_Dxf();
- if (!dxf->in(file, creationClass)) { // if file open failed
- std::cerr << file << " could not be opened.\n";
- return;
- }
- delete dxf;
- delete creationClass;
-}
-
-
-
-void testWriting() {
- DL_Dxf* dxf = new DL_Dxf();
- DL_Codes::version exportVersion = DL_Codes::AC1015;
- DL_WriterA* dw = dxf->out("myfile.dxf", exportVersion);
- if (dw==NULL) {
- printf("Cannot open file 'myfile.dxf' \
- for writing.");
- // abort function e.g. with return
- }
- dxf->writeHeader(*dw);
- // int variable:
- dw->dxfString(9, "$INSUNITS");
- dw->dxfInt(70, 4);
- // real (double, float) variable:
- dw->dxfString(9, "$DIMEXE");
- dw->dxfReal(40, 1.25);
- // string variable:
- dw->dxfString(9, "$TEXTSTYLE");
- dw->dxfString(7, "Standard");
- // vector variable:
- dw->dxfString(9, "$LIMMIN");
- dw->dxfReal(10, 0.0);
- dw->dxfReal(20, 0.0);
- dw->sectionEnd();
- dw->sectionTables();
- dxf->writeVPort(*dw);
- dw->tableLineTypes(25);
- dxf->writeLineType(*dw, DL_LineTypeData("BYBLOCK", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("BYLAYER", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("CONTINUOUS", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("ACAD_ISO02W100", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("ACAD_ISO03W100", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("ACAD_ISO04W100", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("ACAD_ISO05W100", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("BORDER", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("BORDER2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("BORDERX2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("CENTER", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("CENTER2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("CENTERX2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DASHDOT", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DASHDOT2", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("DASHDOTX2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DASHED", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DASHED2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DASHEDX2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DIVIDE", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DIVIDE2", 0));
- dxf->writeLineType(*dw,
- DL_LineTypeData("DIVIDEX2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DOT", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DOT2", 0));
- dxf->writeLineType(*dw, DL_LineTypeData("DOTX2", 0));
- dw->tableEnd();
- int numberOfLayers = 3;
- dw->tableLayers(numberOfLayers);
-
- dxf->writeLayer(*dw,
- DL_LayerData("0", 0),
- DL_Attributes(
- std::string(""), // leave empty
- DL_Codes::black, // default color
- 100, // default width
- "CONTINUOUS")); // default line style
-
- dxf->writeLayer(*dw,
- DL_LayerData("mainlayer", 0),
- DL_Attributes(
- std::string(""),
- DL_Codes::red,
- 100,
- "CONTINUOUS"));
-
- dxf->writeLayer(*dw,
- DL_LayerData("anotherlayer", 0),
- DL_Attributes(
- std::string(""),
- DL_Codes::black,
- 100,
- "CONTINUOUS"));
-
- dw->tableEnd();
- dxf->writeStyle(*dw);
- dxf->writeView(*dw);
- dxf->writeUcs(*dw);
-
- dw->tableAppid(1);
- dw->tableAppidEntry(0x12);
- dw->dxfString(2, "ACAD");
- dw->dxfInt(70, 0);
- dw->tableEnd();
- dxf->writeDimStyle(*dw,
- 1,
- 1,
- 1,
- 1,
- 1);
- dxf->writeBlockRecord(*dw);
- dxf->writeBlockRecord(*dw, "myblock1");
- dxf->writeBlockRecord(*dw, "myblock2");
- dw->tableEnd();
- dw->sectionEnd();
- dw->sectionBlocks();
-
- dxf->writeBlock(*dw,
- DL_BlockData("*Model_Space", 0, 0.0, 0.0, 0.0));
- dxf->writeEndBlock(*dw, "*Model_Space");
-
- dxf->writeBlock(*dw,
- DL_BlockData("*Paper_Space", 0, 0.0, 0.0, 0.0));
- dxf->writeEndBlock(*dw, "*Paper_Space");
-
- dxf->writeBlock(*dw,
- DL_BlockData("*Paper_Space0", 0, 0.0, 0.0, 0.0));
- dxf->writeEndBlock(*dw, "*Paper_Space0");
-
- dxf->writeBlock(*dw,
- DL_BlockData("myblock1", 0, 0.0, 0.0, 0.0));
- // ...
- // write block entities e.g. with dxf->writeLine(), ..
- // ...
- dxf->writeEndBlock(*dw, "myblock1");
-
- dxf->writeBlock(*dw,
- DL_BlockData("myblock2", 0, 0.0, 0.0, 0.0));
- // ...
- // write block entities e.g. with dxf->writeLine(), ..
- // ...
- dxf->writeEndBlock(*dw, "myblock2");
-
- dw->sectionEnd();
- dw->sectionEntities();
-
- // write all your entities..
- dxf->writePoint(
- *dw,
- DL_PointData(10.0,
- 45.0,
- 0.0),
- DL_Attributes("mainlayer", 256, -1, "BYLAYER"));
-
- dxf->writeLine(
- *dw,
- DL_LineData(25.0, // start point
- 30.0,
- 0.0,
- 100.0, // end point
- 120.0,
- 0.0),
- DL_Attributes("mainlayer", 256, -1, "BYLAYER"));
-
- dw->sectionEnd();
- dxf->writeObjects(*dw);
- dxf->writeObjectsEnd(*dw);
- dw->dxfEOF();
- dw->close();
- delete dw;
- delete dxf;
-}
-
diff --git a/dxflib/test/myfile.dxf b/dxflib/test/myfile.dxf
deleted file mode 100644
index d779c0a..0000000
--- a/dxflib/test/myfile.dxf
+++ /dev/null
@@ -1,2086 +0,0 @@
-999
-dxflib 2.2.0.0
- 0
-SECTION
- 2
-HEADER
- 9
-$ACADVER
- 1
-AC1015
- 9
-$HANDSEED
- 5
-FFFF
- 9
-$INSUNITS
- 70
-4
- 9
-$DIMEXE
- 40
-1.25
- 9
-$TEXTSTYLE
- 7
-Standard
- 9
-$LIMMIN
- 10
-0.0
- 20
-0.0
- 0
-ENDSEC
- 0
-SECTION
- 2
-TABLES
- 0
-TABLE
- 2
-VPORT
- 5
-8
-100
-AcDbSymbolTable
- 70
-1
- 0
-VPORT
- 5
-30
-100
-AcDbSymbolTableRecord
-100
-AcDbViewportTableRecord
- 2
-*Active
- 70
-0
- 10
-0.0
- 20
-0.0
- 11
-1.0
- 21
-1.0
- 12
-286.3055555555554861
- 22
-148.5
- 13
-0.0
- 23
-0.0
- 14
-10.0
- 24
-10.0
- 15
-10.0
- 25
-10.0
- 16
-0.0
- 26
-0.0
- 36
-1.0
- 17
-0.0
- 27
-0.0
- 37
-0.0
- 40
-297.0
- 41
-1.92798353909465
- 42
-50.0
- 43
-0.0
- 44
-0.0
- 50
-0.0
- 51
-0.0
- 71
-0
- 72
-100
- 73
-1
- 74
-3
- 75
-1
- 76
-1
- 77
-0
- 78
-0
-281
-0
- 65
-1
-110
-0.0
-120
-0.0
-130
-0.0
-111
-1.0
-121
-0.0
-131
-0.0
-112
-0.0
-122
-1.0
-132
-0.0
- 79
-0
-146
-0.0
- 0
-ENDTAB
- 0
-TABLE
- 2
-LTYPE
- 5
-5
-100
-AcDbSymbolTable
- 70
-25
- 0
-LTYPE
- 5
-14
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-BYBLOCK
- 70
-0
- 3
-
- 72
-65
- 73
-0
- 40
-0.0
- 0
-LTYPE
- 5
-15
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-BYLAYER
- 70
-0
- 3
-
- 72
-65
- 73
-0
- 40
-0.0
- 0
-LTYPE
- 5
-16
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-CONTINUOUS
- 70
-0
- 3
-Solid line
- 72
-65
- 73
-0
- 40
-0.0
- 0
-LTYPE
- 5
-31
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-ACAD_ISO02W100
- 70
-0
- 3
-ISO Dashed __ __ __ __ __ __ __ __ __ __ _
- 72
-65
- 73
-2
- 40
-15.0
- 49
-12.0
- 74
-0
- 49
--3.0
- 74
-0
- 0
-LTYPE
- 5
-32
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-ACAD_ISO03W100
- 70
-0
- 3
-ISO Dashed with Distance __ __ __ _
- 72
-65
- 73
-2
- 40
-30.0
- 49
-12.0
- 74
-0
- 49
--18.0
- 74
-0
- 0
-LTYPE
- 5
-33
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-ACAD_ISO04W100
- 70
-0
- 3
-ISO Long Dashed Dotted ____ . ____ . __
- 72
-65
- 73
-4
- 40
-30.0
- 49
-24.0
- 74
-0
- 49
--3.0
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.0
- 74
-0
- 0
-LTYPE
- 5
-34
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-ACAD_ISO05W100
- 70
-0
- 3
-ISO Long Dashed Double Dotted ____ .. __
- 72
-65
- 73
-6
- 40
-33.0
- 49
-24.0
- 74
-0
- 49
--3.0
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.0
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.0
- 74
-0
- 0
-LTYPE
- 5
-35
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-BORDER
- 70
-0
- 3
-Border __ __ . __ __ . __ __ . __ __ . __ __ .
- 72
-65
- 73
-6
- 40
-44.4500000000000028
- 49
-12.6999999999999993
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 49
-12.6999999999999993
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 49
-0.0
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 0
-LTYPE
- 5
-36
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-BORDER2
- 70
-0
- 3
-Border (.5x) __.__.__.__.__.__.__.__.__.__.__.
- 72
-65
- 73
-6
- 40
-22.2250000000000014
- 49
-6.3499999999999996
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 49
-6.3499999999999996
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 0
-LTYPE
- 5
-37
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-BORDERX2
- 70
-0
- 3
-Border (2x) ____ ____ . ____ ____ . ___
- 72
-65
- 73
-6
- 40
-88.9000000000000057
- 49
-25.3999999999999986
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 49
-25.3999999999999986
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 49
-0.0
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 0
-LTYPE
- 5
-38
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-CENTER
- 70
-0
- 3
-Center ____ _ ____ _ ____ _ ____ _ ____ _ ____
- 72
-65
- 73
-4
- 40
-50.7999999999999972
- 49
-31.75
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 49
-6.3499999999999996
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 0
-LTYPE
- 5
-39
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-CENTER2
- 70
-0
- 3
-Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___
- 72
-65
- 73
-4
- 40
-28.5749999999999993
- 49
-19.0500000000000007
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 49
-3.1749999999999998
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 0
-LTYPE
- 5
-3A
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-CENTERX2
- 70
-0
- 3
-Center (2x) ________ __ ________ __ _____
- 72
-65
- 73
-4
- 40
-101.5999999999999943
- 49
-63.5
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 49
-12.6999999999999993
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 0
-LTYPE
- 5
-3B
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DASHDOT
- 70
-0
- 3
-Dash dot __ . __ . __ . __ . __ . __ . __ . __
- 72
-65
- 73
-4
- 40
-25.3999999999999986
- 49
-12.6999999999999993
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 49
-0.0
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 0
-LTYPE
- 5
-3C
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DASHDOT2
- 70
-0
- 3
-Dash dot (.5x) _._._._._._._._._._._._._._._.
- 72
-65
- 73
-4
- 40
-12.6999999999999993
- 49
-6.3499999999999996
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 0
-LTYPE
- 5
-3D
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DASHDOTX2
- 70
-0
- 3
-Dash dot (2x) ____ . ____ . ____ . ___
- 72
-65
- 73
-4
- 40
-50.7999999999999972
- 49
-25.3999999999999986
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 49
-0.0
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 0
-LTYPE
- 5
-3E
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DASHED
- 70
-0
- 3
-Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _
- 72
-65
- 73
-2
- 40
-19.0500000000000007
- 49
-12.6999999999999993
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 0
-LTYPE
- 5
-3F
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DASHED2
- 70
-0
- 3
-Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- 72
-65
- 73
-2
- 40
-9.5250000000000004
- 49
-6.3499999999999996
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 0
-LTYPE
- 5
-40
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DASHEDX2
- 70
-0
- 3
-Dashed (2x) ____ ____ ____ ____ ____ ___
- 72
-65
- 73
-2
- 40
-38.1000000000000014
- 49
-25.3999999999999986
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 0
-LTYPE
- 5
-41
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DIVIDE
- 70
-0
- 3
-Divide ____ . . ____ . . ____ . . ____ . . ____
- 72
-65
- 73
-6
- 40
-31.75
- 49
-12.6999999999999993
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 49
-0.0
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 49
-0.0
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 0
-LTYPE
- 5
-42
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DIVIDE2
- 70
-0
- 3
-Divide (.5x) __..__..__..__..__..__..__..__.._
- 72
-65
- 73
-6
- 40
-15.875
- 49
-6.3499999999999996
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 49
-0.0
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 0
-LTYPE
- 5
-43
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DIVIDEX2
- 70
-0
- 3
-Divide (2x) ________ . . ________ . . _
- 72
-65
- 73
-6
- 40
-63.5
- 49
-25.3999999999999986
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 49
-0.0
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 49
-0.0
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 0
-LTYPE
- 5
-44
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DOT
- 70
-0
- 3
-Dot . . . . . . . . . . . . . . . . . . . . . .
- 72
-65
- 73
-2
- 40
-6.3499999999999996
- 49
-0.0
- 74
-0
- 49
--6.3499999999999996
- 74
-0
- 0
-LTYPE
- 5
-45
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DOT2
- 70
-0
- 3
-Dot (.5x) .....................................
- 72
-65
- 73
-2
- 40
-3.1749999999999998
- 49
-0.0
- 74
-0
- 49
--3.1749999999999998
- 74
-0
- 0
-LTYPE
- 5
-46
-100
-AcDbSymbolTableRecord
-100
-AcDbLinetypeTableRecord
- 2
-DOTX2
- 70
-0
- 3
-Dot (2x) . . . . . . . . . . . . .
- 72
-65
- 73
-2
- 40
-12.6999999999999993
- 49
-0.0
- 74
-0
- 49
--12.6999999999999993
- 74
-0
- 0
-ENDTAB
- 0
-TABLE
- 2
-LAYER
- 5
-2
-100
-AcDbSymbolTable
- 70
-3
- 0
-LAYER
- 5
-10
-100
-AcDbSymbolTableRecord
-100
-AcDbLayerTableRecord
- 2
-0
- 70
-0
- 62
-250
- 6
-CONTINUOUS
-370
-100
-390
-F
- 0
-LAYER
- 5
-47
-100
-AcDbSymbolTableRecord
-100
-AcDbLayerTableRecord
- 2
-mainlayer
- 70
-0
- 62
-1
- 6
-CONTINUOUS
-370
-100
-390
-F
- 0
-LAYER
- 5
-48
-100
-AcDbSymbolTableRecord
-100
-AcDbLayerTableRecord
- 2
-anotherlayer
- 70
-0
- 62
-250
- 6
-CONTINUOUS
-370
-100
-390
-F
- 0
-ENDTAB
- 0
-TABLE
- 2
-STYLE
- 5
-3
-100
-AcDbSymbolTable
- 70
-1
- 0
-STYLE
- 5
-11
-100
-AcDbSymbolTableRecord
-100
-AcDbTextStyleTableRecord
- 2
-Standard
- 70
-0
- 40
-0.0
- 41
-0.75
- 50
-0.0
- 71
-0
- 42
-2.5
- 3
-txt
- 4
-
- 0
-ENDTAB
- 0
-TABLE
- 2
-VIEW
- 5
-6
-100
-AcDbSymbolTable
- 70
-0
- 0
-ENDTAB
- 0
-TABLE
- 2
-UCS
- 5
-7
-100
-AcDbSymbolTable
- 70
-0
- 0
-ENDTAB
- 0
-TABLE
- 2
-APPID
- 5
-9
-100
-AcDbSymbolTable
- 70
-1
- 0
-APPID
- 5
-12
-100
-AcDbSymbolTableRecord
-100
-AcDbRegAppTableRecord
- 2
-ACAD
- 70
-0
- 0
-ENDTAB
- 0
-TABLE
- 2
-DIMSTYLE
- 5
-A
-100
-AcDbSymbolTable
- 70
-1
-100
-AcDbDimStyleTable
- 71
-0
- 0
-DIMSTYLE
-105
-27
-100
-AcDbSymbolTableRecord
-100
-AcDbDimStyleTableRecord
- 2
-Standard
- 41
-1.0
- 42
-1.0
- 43
-3.75
- 44
-1.0
- 70
-0
- 73
-0
- 74
-0
- 77
-1
- 78
-8
-140
-1.0
-141
-2.5
-143
-0.03937007874016
-147
-1.0
-171
-3
-172
-1
-271
-2
-272
-2
-274
-3
-278
-44
-283
-0
-284
-8
-340
-11
- 0
-ENDTAB
- 0
-TABLE
- 2
-BLOCK_RECORD
- 5
-1
-100
-AcDbSymbolTable
- 70
-1
- 0
-BLOCK_RECORD
- 5
-1F
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-*Model_Space
-340
-22
- 0
-BLOCK_RECORD
- 5
-1B
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-*Paper_Space
-340
-1E
- 0
-BLOCK_RECORD
- 5
-23
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-*Paper_Space0
-340
-26
- 0
-BLOCK_RECORD
- 5
-49
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-myblock1
-340
-0
- 0
-BLOCK_RECORD
- 5
-4A
-100
-AcDbSymbolTableRecord
-100
-AcDbBlockTableRecord
- 2
-myblock2
-340
-0
- 0
-ENDTAB
- 0
-ENDSEC
- 0
-SECTION
- 2
-BLOCKS
- 0
-BLOCK
- 5
-20
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockBegin
- 2
-*Model_Space
- 70
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-*Model_Space
- 1
-
- 0
-ENDBLK
- 5
-21
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockEnd
- 0
-BLOCK
- 5
-1C
-100
-AcDbEntity
- 67
-1
- 8
-0
-100
-AcDbBlockBegin
- 2
-*Paper_Space
- 70
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-*Paper_Space
- 1
-
- 0
-ENDBLK
- 5
-1D
-100
-AcDbEntity
- 67
-1
- 8
-0
-100
-AcDbBlockEnd
- 0
-BLOCK
- 5
-24
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockBegin
- 2
-*Paper_Space0
- 70
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-*Paper_Space0
- 1
-
- 0
-ENDBLK
- 5
-25
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockEnd
- 0
-BLOCK
- 5
-4B
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockBegin
- 2
-myblock1
- 70
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-myblock1
- 1
-
- 0
-ENDBLK
- 5
-4C
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockEnd
- 0
-BLOCK
- 5
-4D
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockBegin
- 2
-myblock2
- 70
-0
- 10
-0.0
- 20
-0.0
- 30
-0.0
- 3
-myblock2
- 1
-
- 0
-ENDBLK
- 5
-4E
-100
-AcDbEntity
- 8
-0
-100
-AcDbBlockEnd
- 0
-ENDSEC
- 0
-SECTION
- 2
-ENTITIES
- 0
-POINT
- 5
-4F
-100
-AcDbEntity
-100
-AcDbPoint
- 8
-mainlayer
- 62
-256
-370
--1
- 6
-BYLAYER
- 10
-10.0
- 20
-45.0
- 30
-0.0
- 0
-LINE
- 5
-50
-100
-AcDbEntity
-100
-AcDbLine
- 8
-mainlayer
- 62
-256
-370
--1
- 6
-BYLAYER
- 10
-25.0
- 20
-30.0
- 30
-0.0
- 11
-100.0
- 21
-120.0
- 31
-0.0
- 0
-ENDSEC
- 0
-SECTION
- 2
-OBJECTS
- 0
-DICTIONARY
- 5
-C
-100
-AcDbDictionary
-280
-0
-281
-1
- 3
-ACAD_GROUP
-350
-D
- 3
-ACAD_LAYOUT
-350
-1A
- 3
-ACAD_MLINESTYLE
-350
-17
- 3
-ACAD_PLOTSETTINGS
-350
-19
- 3
-ACAD_PLOTSTYLENAME
-350
-E
- 3
-AcDbVariableDictionary
-350
-51
- 0
-DICTIONARY
- 5
-D
-100
-AcDbDictionary
-280
-0
-281
-1
- 0
-ACDBDICTIONARYWDFLT
- 5
-E
-100
-AcDbDictionary
-281
-1
- 3
-Normal
-350
-F
-100
-AcDbDictionaryWithDefault
-340
-F
- 0
-ACDBPLACEHOLDER
- 5
-F
- 0
-DICTIONARY
- 5
-17
-100
-AcDbDictionary
-280
-0
-281
-1
- 3
-Standard
-350
-18
- 0
-MLINESTYLE
- 5
-18
-100
-AcDbMlineStyle
- 2
-STANDARD
- 70
-0
- 3
-
- 62
-256
- 51
-90.0
- 52
-90.0
- 71
-2
- 49
-0.5
- 62
-256
- 6
-BYLAYER
- 49
--0.5
- 62
-256
- 6
-BYLAYER
- 0
-DICTIONARY
- 5
-19
-100
-AcDbDictionary
-280
-0
-281
-1
- 0
-DICTIONARY
- 5
-1A
-100
-AcDbDictionary
-281
-1
- 3
-Layout1
-350
-1E
- 3
-Layout2
-350
-26
- 3
-Model
-350
-22
- 0
-LAYOUT
- 5
-1E
-100
-AcDbPlotSettings
- 1
-
- 2
-C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3
- 4
-
- 6
-
- 40
-0.0
- 41
-0.0
- 42
-0.0
- 43
-0.0
- 44
-0.0
- 45
-0.0
- 46
-0.0
- 47
-0.0
- 48
-0.0
- 49
-0.0
-140
-0.0
-141
-0.0
-142
-1.0
-143
-1.0
- 70
-688
- 72
-0
- 73
-0
- 74
-5
- 7
-
- 75
-16
-147
-1.0
-148
-0.0
-149
-0.0
-100
-AcDbLayout
- 1
-Layout1
- 70
-1
- 71
-1
- 10
-0.0
- 20
-0.0
- 11
-420.0
- 21
-297.0
- 12
-0.0
- 22
-0.0
- 32
-0.0
- 14
-100000000000000000000.0
- 24
-100000000000000000000.0
- 34
-100000000000000000000.0
- 15
--100000000000000000000.0
- 25
--100000000000000000000.0
- 35
--100000000000000000000.0
-146
-0.0
- 13
-0.0
- 23
-0.0
- 33
-0.0
- 16
-1.0
- 26
-0.0
- 36
-0.0
- 17
-0.0
- 27
-1.0
- 37
-0.0
- 76
-0
-330
-1B
- 0
-LAYOUT
- 5
-22
-100
-AcDbPlotSettings
- 1
-
- 2
-C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3
- 4
-
- 6
-
- 40
-0.0
- 41
-0.0
- 42
-0.0
- 43
-0.0
- 44
-0.0
- 45
-0.0
- 46
-0.0
- 47
-0.0
- 48
-0.0
- 49
-0.0
-140
-0.0
-141
-0.0
-142
-1.0
-143
-1.0
- 70
-1712
- 72
-0
- 73
-0
- 74
-0
- 7
-
- 75
-0
-147
-1.0
-148
-0.0
-149
-0.0
-100
-AcDbLayout
- 1
-Model
- 70
-1
- 71
-0
- 10
-0.0
- 20
-0.0
- 11
-12.0
- 21
-9.0
- 12
-0.0
- 22
-0.0
- 32
-0.0
- 14
-0.0
- 24
-0.0
- 34
-0.0
- 15
-0.0
- 25
-0.0
- 35
-0.0
-146
-0.0
- 13
-0.0
- 23
-0.0
- 33
-0.0
- 16
-1.0
- 26
-0.0
- 36
-0.0
- 17
-0.0
- 27
-1.0
- 37
-0.0
- 76
-0
-330
-1F
- 0
-LAYOUT
- 5
-26
-100
-AcDbPlotSettings
- 1
-
- 2
-C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3
- 4
-
- 6
-
- 40
-0.0
- 41
-0.0
- 42
-0.0
- 43
-0.0
- 44
-0.0
- 45
-0.0
- 46
-0.0
- 47
-0.0
- 48
-0.0
- 49
-0.0
-140
-0.0
-141
-0.0
-142
-1.0
-143
-1.0
- 70
-688
- 72
-0
- 73
-0
- 74
-5
- 7
-
- 75
-16
-147
-1.0
-148
-0.0
-149
-0.0
-100
-AcDbLayout
- 1
-Layout2
- 70
-1
- 71
-2
- 10
-0.0
- 20
-0.0
- 11
-12.0
- 21
-9.0
- 12
-0.0
- 22
-0.0
- 32
-0.0
- 14
-0.0
- 24
-0.0
- 34
-0.0
- 15
-0.0
- 25
-0.0
- 35
-0.0
-146
-0.0
- 13
-0.0
- 23
-0.0
- 33
-0.0
- 16
-1.0
- 26
-0.0
- 36
-0.0
- 17
-0.0
- 27
-1.0
- 37
-0.0
- 76
-0
-330
-23
- 0
-DICTIONARY
- 5
-51
-100
-AcDbDictionary
-281
-1
- 3
-DIMASSOC
-350
-53
- 3
-HIDETEXT
-350
-52
- 0
-DICTIONARYVAR
- 5
-52
-100
-DictionaryVariables
-280
-0
- 1
-2
- 0
-DICTIONARYVAR
- 5
-53
-100
-DictionaryVariables
-280
-0
- 1
-1
- 0
-ENDSEC
- 0
-EOF
diff --git a/dxflib/test/test_creationclass.cpp b/dxflib/test/test_creationclass.cpp
deleted file mode 100644
index e19b270..0000000
--- a/dxflib/test/test_creationclass.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-/*****************************************************************************
-** $Id: test_creationclass.cpp 8865 2008-02-04 18:54:02Z andrew $
-**
-** This is part of the dxflib library
-** Copyright (C) 2001 Andrew Mustun
-**
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Library General Public License as
-** published by the Free Software Foundation.
-**
-** This program 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 this program; if not, write to the Free Software
-** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-******************************************************************************/
-
-#include "test_creationclass.h"
-
-#include <iostream>
-#include <stdio.h>
-
-
-/**
- * Default constructor.
- */
-Test_CreationClass::Test_CreationClass() {}
-
-
-/**
- * Sample implementation of the method which handles layers.
- */
-void Test_CreationClass::addLayer(const DL_LayerData& data) {
- printf("LAYER: %s flags: %d\n", data.name.c_str(), data.flags);
- printAttributes();
-}
-
-/**
- * Sample implementation of the method which handles point entities.
- */
-void Test_CreationClass::addPoint(const DL_PointData& data) {
- printf("POINT (%6.3f, %6.3f, %6.3f)\n",
- data.x, data.y, data.z);
- printAttributes();
-}
-
-/**
- * Sample implementation of the method which handles line entities.
- */
-void Test_CreationClass::addLine(const DL_LineData& data) {
- printf("LINE (%6.3f, %6.3f, %6.3f) (%6.3f, %6.3f, %6.3f)\n",
- data.x1, data.y1, data.z1, data.x2, data.y2, data.z2);
- printAttributes();
-}
-
-/**
- * Sample implementation of the method which handles arc entities.
- */
-void Test_CreationClass::addArc(const DL_ArcData& data) {
- printf("ARC (%6.3f, %6.3f, %6.3f) %6.3f, %6.3f, %6.3f\n",
- data.cx, data.cy, data.cz,
- data.radius, data.angle1, data.angle2);
- printAttributes();
-}
-
-/**
- * Sample implementation of the method which handles circle entities.
- */
-void Test_CreationClass::addCircle(const DL_CircleData& data) {
- printf("CIRCLE (%6.3f, %6.3f, %6.3f) %6.3f\n",
- data.cx, data.cy, data.cz,
- data.radius);
- printAttributes();
-}
-
-
-/**
- * Sample implementation of the method which handles polyline entities.
- */
-void Test_CreationClass::addPolyline(const DL_PolylineData& data) {
- printf("POLYLINE \n");
- printf("flags: %d\n", (int)data.flags);
- printAttributes();
-}
-
-
-/**
- * Sample implementation of the method which handles vertices.
- */
-void Test_CreationClass::addVertex(const DL_VertexData& data) {
- printf("VERTEX (%6.3f, %6.3f, %6.3f) %6.3f\n",
- data.x, data.y, data.z,
- data.bulge);
- printAttributes();
-}
-
-
-void Test_CreationClass::add3dFace(const DL_3dFaceData& data) {
- printf("3DFACE\n");
- for (int i=0; i<4; i++) {
- printf(" corner %d: %6.3f %6.3f %6.3f\n",
- i, data.x[i], data.y[i], data.z[i]);
- }
- printAttributes();
-}
-
-
-void Test_CreationClass::printAttributes() {
- printf(" Attributes: Layer: %s, ", attributes.getLayer().c_str());
- printf(" Color: ");
- if (attributes.getColor()==256) {
- printf("BYLAYER");
- } else if (attributes.getColor()==0) {
- printf("BYBLOCK");
- } else {
- printf("%d", attributes.getColor());
- }
- printf(" Width: ");
- if (attributes.getWidth()==-1) {
- printf("BYLAYER");
- } else if (attributes.getWidth()==-2) {
- printf("BYBLOCK");
- } else if (attributes.getWidth()==-3) {
- printf("DEFAULT");
- } else {
- printf("%d", attributes.getWidth());
- }
- printf(" Type: %s\n", attributes.getLineType().c_str());
-}
-
-
-
-// EOF
diff --git a/dxflib/test/test_creationclass.h b/dxflib/test/test_creationclass.h
deleted file mode 100644
index f69e298..0000000
--- a/dxflib/test/test_creationclass.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/****************************************************************************
-**
-** This file is part of the LibreCAD project, a 2D CAD program
-**
-** Copyright (C) 2010 R. van Twisk (librecad at rvt.dds.nl)
-** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
-**
-**
-** 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
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program 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 General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software
-** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-**
-** This copyright notice MUST APPEAR in all copies of the script!
-**
-**********************************************************************/
-
-/*****************************************************************************
-** $Id: test_creationclass.h 8865 2008-02-04 18:54:02Z andrew $
-**
-** This is part of the dxflib library
-** Copyright (C) 2001 Andrew Mustun
-**
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU Library General Public License as
-** published by the Free Software Foundation.
-**
-** This program 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 this program; if not, write to the Free Software
-** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-******************************************************************************/
-
-#ifndef TEST_CREATIONCLASS_H
-#define TEST_CREATIONCLASS_H
-
-#include "dl_creationadapter.h"
-
-
-
-/**
- * This class takes care of the entities read from the file.
- * Usually such a class would probably store the entities.
- * this one just prints some information about them to stdout.
- *
- * @author Andrew Mustun
- */
-class Test_CreationClass : public DL_CreationAdapter {
-public:
- Test_CreationClass();
-
- virtual void addLayer(const DL_LayerData& data);
- virtual void addPoint(const DL_PointData& data);
- virtual void addLine(const DL_LineData& data);
- virtual void addArc(const DL_ArcData& data);
- virtual void addCircle(const DL_CircleData& data);
- virtual void addPolyline(const DL_PolylineData& data);
- virtual void addVertex(const DL_VertexData& data);
- virtual void add3dFace(const DL_3dFaceData& data);
-
- void printAttributes();
-};
-
-#endif
diff --git a/fparser/docs/fparser.html b/fparser/docs/fparser.html
deleted file mode 100644
index 1b10066..0000000
--- a/fparser/docs/fparser.html
+++ /dev/null
@@ -1,1629 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <link href="style.css" rel="stylesheet" type="text/css" title="normal" media=screen>
- <title>Function Parser for C++ v4.3 : Documentation</title>
-</head>
-
-<body>
-<h1>Function Parser for C++ v4.3 </h1>
-
-<p>Authors: Juha Nieminen
-(<a href="http://iki.fi/warp/">http://iki.fi/warp/</a>),
-Joel Yliluoma
-(<a href="http://iki.fi/bisqwit/">http://iki.fi/bisqwit/</a>).
-
-<p>The usage license of this library is located at the end of this file.
-
-<h2>Table of contents:</h2>
-
-<ul>
- <li><a href="#whatsnew">What's new</a>
- <li><a href="#preface">Preface</a>
- <li><a href="#usage">Usage</a>
- <ul>
- <li><a href="#parsertypes">Parser types</a>
- <li><a href="#configuring">Configuring the compilation</a>
- <li><a href="#copyassignment">Copying and assignment</a>
- <li><a href="#shortdesc">Short descriptions of FunctionParser methods</a>
- <li><a href="#longdesc">Long descriptions of FunctionParser methods</a>
- <ul>
- <li><a href="#longdesc_Parse"><code>Parse()</code></a>
- <li><a href="#longdesc_setDelimiterChar"><code>setDelimiterChar()</code></a>
- <li><a href="#longdesc_ErrorMsg"><code>ErrorMsg()</code></a>
- <li><a href="#longdesc_GetParseErrorType"><code>GetParseErrorType()</code></a>
- <li><a href="#longdesc_Eval"><code>Eval()</code></a>
- <li><a href="#longdesc_EvalError"><code>EvalError()</code></a>
- <li><a href="#longdesc_Optimize"><code>Optimize()</code></a>
- <li><a href="#longdesc_AddConstant"><code>AddConstant()</code></a>
- <li><a href="#longdesc_AddUnit"><code>AddUnit()</code></a>
- <li><a href="#longdesc_AddFunction1"><code>AddFunction()</code></a> (C++ function)
- <li><a href="#longdesc_AddFunction2"><code>AddFunction()</code></a> (FunctionParser)
- <li><a href="#longdesc_RemoveIdentifier"><code>RemoveIdentifier()</code></a>
- <li><a href="#longdesc_ParseAndDeduceVariables"><code>ParseAndDeduceVariables()</code></a>
- </ul>
- </ul>
- <li>Syntax
- <ul>
- <li><a href="#literals">Numeric literals</a>
- <li><a href="#identifiers">Identifier names</a>
- <li><a href="#functionsyntax">The function string syntax</a>
- <li><a href="#inlinevars">Inline variables</a>
- <li><a href="#whitespace">Whitespace</a>
- </ul>
- <li>Miscellaneous
- <ul>
- <li><a href="#evaluationchecks">About evaluation-time checks</a>
- <li><a href="#threadsafety">About thread safety</a>
- <li><a href="#tipsandtricks">Tips and tricks</a>
- <li><a href="#contact">Contacting the author</a>
- </ul>
-<!-- <li><a href="#algorithm">The algorithm used in the library</a> -->
- <li><a href="#license">Usage license</a>
-</ul>
-
-<a name="whatsnew"></a>
-<h2>What's new</h2>
-
-<p>What's new in v4.3
- <ul>
- <li>Function syntax enhancement: Added possibility of defining new
- variables in the function string itself. (See documentation for details.)
- <li>Fixed some bugs in the optimizer (among others,
- <code>"atan2(-x,-y)"</code> was being wrongly optimized into
- <code>"atan2(x,y)"</code>
- </ul>
-
-<p>What's new in v4.2
- <ul>
- <li>The <code>Optimize()</code> method now works also with the
- <code>float</code> and <code>long double</code> versions of the library.
- </li>
- <li>Some new optimizations added.</li>
- <li>There was a call to the C99/C++0x function <code>isinf()</code> in the
- optimizer which made it not compile with some compilers. This call has
- been removed.</li>
- </ul>
-
-<p>What's new in v4.1
- <ul>
- <li>Official support for hexadecimal literals (for all the parser types).
- Previously there was support only if the <code>strto...()</code> C
- library functions happened to support them (which is a non-standard
- extension of those functions). See documentation for details.</li>
- <li>Significant amount of new optimizations performed by
- <code>Parse()</code>.</li>
- <li>Minor bugfixes.</li>
- </ul>
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="preface"></a>
-<h2>Preface</h2>
-
-<p>This C++ library offers a class which can be used to parse and evaluate a
-mathematical function from a string (which might be eg. requested from the
-user). The syntax of the function string is similar to mathematical expressions
-written in C/C++ (the exact syntax is specified later in this document).
-The function can then be evaluated with different values of variables.
-
-<p>For example, a function like "<code>sin(sqrt(x*x+y*y))</code>" can be
-parsed from a string (either <code>std::string</code> or a C-style string)
-and then evaluated with different values of <code>x</code> and <code>y</code>.
-This library can be useful for evaluating user-inputted functions, or in
-some cases interpreting mathematical expressions in a scripting language.
-
-<p>This library aims for maximum speed in both parsing and evaluation, while
-keeping maximum portability. The library should compile and work with any
-standard-conforming C++ compiler.
-
-<p>Different numerical types are supported: <code>double</code>,
- <code>float</code>, <code>long double</code>, <code>long int</code>,
- multiple-precision floating point numbers using the MPFR library, and
- arbitrary precision integers using the GMP library. (Note that it's
- not necessary for these two libraries to exist in the system in order
- to use the Function Parser library with the other numerical types. Support
- for these libraries is optionally compiled in using preprocessor settings.)
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="usage"></a>
-<h2>Usage</h2>
-
-<p>To use the <code>FunctionParser</code> class, you have to include
-<code>"fparser.hh"</code> in your source code files which use the
-<code>FunctionParser</code> class.
-
-<p>If you are going to use the MPFR version of the library, you need to
-include <code>"fparser_mpfr.hh"</code>. If you are going to use the GMP
-version of the library, you need to include <code>"fparser_gmpint.hh"</code>.
-(Note that support for these special parser versions needs to be specified
-with preprocessor macros. See the <a href="#parsertypes">documentation
-below</a> for details.)
-
-<p>When compiling, you have to compile <code>fparser.cc</code> and
-<code>fpoptimizer.cc</code> and link them to the main program. In many
-developement environments it's enough to add those two files to your
-current project (usually header files don't have to be added to the
-project for the compilation to work).
-
-<p>If you are going to use the MPFR or the GMP versions of the library,
-you also need to add <code>mpfr/MpfrFloat.cc</code> or
-<code>mpfr/GmpInt.cc</code> files to your project, respectively. Otherwise
-they should not be added to the project.
-
-<p>Note that part of the library source code is inside several
-<code>.inc</code> files (these files contain auto-generated C++ code),
-provided in the library package. These files are used by
-<code>fparser.cc</code> and don't need to be added explicitly to the
-project in most IDEs (such as Visual Studio). Basically, you don't need
-to do anything with these files, other than keep them in the same directory
-as <code>fparser.cc</code>.
-
-<p>Simple usage example of the library:
-
-<pre>
- FunctionParser fp;
- fp.Parse("sqrt(x*x + y*y)", "x,y");
- double variables[2] = { 1.5, 2.9 };
- double result = fp.Eval(variables);
-</pre>
-
-<!-- -------------------------------------------------------------------- -->
-<a name="parsertypes"></a>
-<h3>Parser types</h3>
-
-<p>Different versions of the function parser class are supported, using
- different floating point or integral types for function evaluation.
-
-<p>All the classes other than the default one, <code>FunctionParser</code>,
- need to be enabled at compile time by defining a preprocessor macro
- (specified below) either in the <code>fpconfig.hh</code> file or your
- compiler settings. (The reason for this is that all the other parser types
- use either C99 standard libraries not yet available in the official C++
- standard or the third-party libraries GMP and MPFR. It also makes
- compilation faster and the resulting binary smaller when unused classes
- are not compiled in.).
-
-<p>Note that if you try to use the other class types without enabling them
- with the correspondent preprocessor macro, you will get a linker error
- (rather than a compiler error) because those classes will not have been
- instantiated when the library was compiled.
-
-<p>Currently the <code>Optimize()</code> method works only for the
- <code>FunctionParser</code>, <code>FunctionParser_f</code> and
- <code>FunctionParser_ld</code> classes. For the other types it can be
- called but it does nothing.
-
-<p>
-<dl>
- <dt><p><code>FunctionParser</code></dt>
- <dd>
- <p>This is the default class, which uses <code>double</code> as its
- numerical type. This is the only class enabled by default.
- <p>If you use some other type than this one, and you don't want this
- version of the class compiled into the library, you can define the
- preprocessor macro <code>FP_DISABLE_DOUBLE_TYPE</code>.
- </dd>
-
- <dt><p><code>FunctionParser_f</code></dt>
- <dd>
- <p>This parser uses <code>float</code> as its numerical type.
- <p>The <code>FP_SUPPORT_FLOAT_TYPE</code> preprocessor macro needs to be
- defined for this class to be enabled.
- <p>Note that this version of the class uses C99 standard math functions
- not yet available in all C++ compilers. Also the <code>ld</code> version
- of the class described below use such functions.
- </dd>
-
- <dt><p><code>FunctionParser_ld</code></dt>
- <dd>
- <p>This parser uses <code>long double</code> as its numerical type.
- <p>The <code>FP_SUPPORT_LONG_DOUBLE_TYPE</code> preprocessor macro needs
- to be defined for this class to be enabled.
- </dd>
-
- <dt><p><code>FunctionParser_li</code></dt>
- <dd>
- <p>This parser uses <code>long int</code> as its numerical type.
- <p>The <code>FP_SUPPORT_LONG_INT_TYPE</code> preprocessor macro needs
- to be defined for this class to be enabled.
- <p>Note that this version of the class uses a reduced function syntax
- with support only for functions which are feasible to be used with
- integral types (namely <code>abs()</code>, <code>eval()</code>,
- <code>if()</code>, <code>min()</code> and <code>max()</code>, besides
- basic arithmetic operators, except for the power operator).
- </dd>
-
- <dt><p><code>FunctionParser_mpfr</code></dt>
- <dd>
- <p>This parser uses <code>MpfrFloat</code> as its numerical type.
- <p>The <code>FP_SUPPORT_MPFR_FLOAT_TYPE</code> preprocessor macro needs
- to be defined for this class to be enabled.
- <p>Note that to use this version of the parser,
- <code>"fparser_mpfr.hh"</code> needs to be included.
- <p><code>MpfrFloat</code> is an auxiliary class which uses the MPFR
- library for multiple-precision floating point numbers. The class
- behaves largely like a floating point type, and is declared in the
- <code>mpfr/MpfrFloat.hh</code> file (see that file for info about
- the public interface of the class).
- <p>If this class is enabled, <code>mpfr/MpfrFloat.cc</code>
- needs to be compiled into the project, as well as the GMP and MPFR
- libraries. (With the gcc compiler this means using the linker options
- "<code>-lgmp -lmpfr</code>".)
- </dd>
-
- <dt><p><code>FunctionParser_gmpint</code></dt>
- <dd>
- <p>This parser uses <code>GmpInt</code> as its numerical type.
- <p>The <code>FP_SUPPORT_GMP_INT_TYPE</code> preprocessor macro needs
- to be defined for this class to be enabled.
- <p>Note that to use this version of the parser,
- <code>"fparser_gmpint.hh"</code> needs to be included.
- <p><code>GmpInt</code> is an auxiliary class which uses the GMP
- library for arbitrary-precision integer numbers. The class
- behaves largely like an integer type, and is declared in the
- <code>mpfr/GmpInt.hh</code> file (see that file for info about
- the public interface of the class).
- <p>If this class is enabled, <code>mpfr/GmpInt.cc</code>
- needs to be compiled into the project, as well as the GMP library.
- <p>This version of the class also uses a reduced version of the syntax,
- like the <code>long int</code> version.
- <p><b>Note:</b> Since there's no upper limit to the size of GMP
- integers, this version of the class should be used with care in
- situations where malicious users might be able to exploit it to
- make the program run out of memory. An example of this would be
- a server-side application usable through the WWW.
- </dd>
-</dl>
-
-<p>Note that these different classes are completely independent and
- instances of different classes cannot be given to each other using the
- <code>AddFunction()</code> method. Only objects of the same type can
- be given to that method.
-
-<p>The rest of the documentation assumes that <code>FunctionParser</code>
- (which uses the <code>double</code> type) is used. The usage of the other
- classes is identical except that <code>double</code> is replaced with the
- correspondent type used by that class. (In other words, whenever the
- rest of this documentation uses the type keyword '<code>double</code>',
- the correspondent type should be used instead, when using another version
- of the class.)
-
-<!-- -------------------------------------------------------------------- -->
-<a name="configuring"></a>
-<h3>Configuring the compilation</h3>
-
-<p>There is a set of precompiler options in the <code>fpconfig.hh</code> file
-which can be used for setting certain features on or off. All of these options
-can also be specified from the outside, using precompiler settings (eg. the
-<code>-D</code> option in gcc), and thus it's not necessary to modify this
-file.
-
-<dl>
- <dt><p><code>FP_SUPPORT_TR1_MATH_FUNCS</code> : (Default off)</dt>
- <dd><p>Define this precompiler constant to make the library use additional
- math functions defined in the C99 standard and the C++ TR1 standard
- proposal (but not yet in the official C++ standard). This can make
- evaluation faster when these functions are involved.
- <p>The C++ TR1 math functions in question are: <code>asinh()</code>,
- <code>acosh()</code>, <code>atanh()</code>, <code>exp2()</code> and
- <code>log2()</code>.
- </dd>
-
- <dt><p><code>FP_ENABLE_EVAL</code> : (Default off)</dt>
- <dd><p>Even though the maximum recursion level of the <code>eval()</code>
- function is limited, it is still possible to write functions which never
- reach this maximum recursion level but take enormous amounts of
- time to evaluate (this can be undesirable eg. in web server-side
- applications). For this reason this function is disabled by default.
- You can add support for the <code>eval()</code> function by
- defining this precompiler constant.
- </dd>
-
- <dt><p><code>FP_EVAL_MAX_REC_LEVEL</code> : (Default 1000)</dt>
- <dd><p>Sets the maximum recursion level allowed for <code>eval()</code>.
- </dd>
-
- <dt><p><code>FP_SUPPORT_OPTIMIZER</code> : (Default on)</dt>
- <dd><p>If you are not going to use the <code>Optimize()</code> method, you
- can comment this line out to speed-up the compilation a bit, as
- well as making the binary a bit smaller. (<code>Optimize()</code> can
- still be called, but it will not do anything.)
-
- <p>You can also disable the optimizer by specifying the
- <code>FP_NO_SUPPORT_OPTIMIZER</code> precompiler constant in your
- compiler settings.
- </dd>
-
- <dt><p><code>FP_EPSILON</code> : (Default <code>1e-14</code>)</dt>
- <dd><p>Epsilon value used in comparison operators.
- If this line is commented out, then no epsilon will be used.
- </dd>
-
- <dt><p><code>FP_USE_THREAD_SAFE_EVAL</code> : (Default off)</dt>
- <dd><p>Define this precompiler constant to make <code>Eval()</code>
- thread-safe. Refer to the <a href="#threadsafety">thread safety
- section</a> later in this document for more information.
- Note that defining this may make <code>Eval()</code> slightly slower.
- <p>Also note that the MPFR and GMP versions of the library cannot be
- made thread-safe, and thus this setting has no effect on them.
- </dd>
-
- <dt><p><code>FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA</code> : (Default off)</dt>
- <dd><p>This is like the previous, but makes <code>Eval()</code> use the
- <code>alloca()</code> function (instead of <code>std::vector</code>).
- This will make it faster, but the <code>alloca()</code>
- function is not standard and thus not supported by all compilers.
- </dd>
-
- <dt><p><code>FP_NO_EVALUATION_CHECKS</code> : (Default off)</dt>
- <dd><p>If this precompiler constant is defined, no evaluation-time checks
- will be performed. This may give a slight boost in speed in certain
- situations. Consult the <a href="#evaluationchecks">evaluation
- checks section</a> below for more information on this subject.
- </dd>
-</dl>
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="copyassignment"></a>
-<h3>Copying and assignment</h3>
-
-<p>The class implements a safe copy constructor and assignment operator.
-
-<p>It uses the copy-on-write technique for efficiency. This means that
- when copying or assigning a FunctionParser instance, the internal data
- (which in some cases can be quite lengthy) is not immediately copied
- but only when the contents of the copy (or the original) are changed.
-
-<p>This means that copying/assigning is a very fast operation, and if
- the copies are never modified then actual data copying never happens
- either.
-
-<p>The <code>Eval()</code> and <code>EvalError()</code> methods of the
-copy can be called without the internal data being copied.
-
-<p>Calling <code>Parse()</code>, <code>Optimize()</code> or the user-defined
-constant/function adding methods will cause a deep-copy.
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="shortdesc"></a>
-<h3>Short descriptions of FunctionParser methods</h3>
-
-<pre>
-int Parse(const std::string& Function, const std::string& Vars,
- bool useDegrees = false);
-
-int Parse(const char* Function, const std::string& Vars,
- bool useDegrees = false);
-</pre>
-
-<p>Parses the given function and compiles it to internal format.
- Return value is -1 if successful, else the index value to the location
- of the error.
-
-<hr>
-<pre>
-void setDelimiterChar(char);
-</pre>
-
-<p>Sets an ending delimiter character for the function string. (See the
- long description for more details.)
-
-<hr>
-<pre>
-const char* ErrorMsg(void) const;
-</pre>
-
-<p>Returns an error message corresponding to the error in
-<code>Parse()</code>, or an empty string if no such error occurred.
-
-<hr>
-<pre>
-ParseErrorType GetParseErrorType() const;
-</pre>
-
-<p>Returns the type of parsing error which occurred. Possible return types
- are described in the long description.
-
-<hr>
-<pre>
-double Eval(const double* Vars);
-</pre>
-
-<p>Evaluates the function given to <code>Parse()</code>.
-
-<hr>
-<pre>
-int EvalError(void) const;
-</pre>
-
-<p>Returns <code>0</code> if no error happened in the previous call to
-<code>Eval()</code>, else an error code <code>>0</code>.
-
-<hr>
-<pre>
-void Optimize();
-</pre>
-
-<p>Tries to optimize the bytecode for faster evaluation.
-
-<hr>
-<pre>
-bool AddConstant(const std::string& name, double value);
-</pre>
-
-<p>Add a constant to the parser. Returns <code>false</code> if the name of
-the constant is invalid, else <code>true</code>.
-
-<hr>
-<pre>
-bool AddUnit(const std::string& name, double value);
-</pre>
-
-<p>Add a new unit to the parser. Returns <code>false</code> if the name of
-the unit is invalid, else <code>true</code>.
-
-<hr>
-<pre>
-bool AddFunction(const std::string& name,
- double (*functionPtr)(const double*),
- unsigned paramsAmount);
-</pre>
-
-<p>Add a user-defined function to the parser (as a function pointer).
-Returns <code>false</code> if the name of the function is invalid, else
-<code>true</code>.
-
-<hr>
-<pre>
-bool AddFunction(const std::string& name, FunctionParser&);
-</pre>
-
-<p>Add a user-defined function to the parser (as a <code>FunctionParser</code>
-instance). Returns <code>false</code> if the name of the function is invalid,
-else <code>true</code>.
-
-<hr>
-<pre>
-bool RemoveIdentifier(const std::string& name);
-</pre>
-
-<p>Removes the constant, unit or user-defined function with the specified
-name from the parser.
-
-<hr>
-<pre>
-int ParseAndDeduceVariables(const std::string& function,
- int* amountOfVariablesFound = 0,
- bool useDegrees = false);
-int ParseAndDeduceVariables(const std::string& function,
- std::string& resultVarString,
- int* amountOfVariablesFound = 0,
- bool useDegrees = false);
-int ParseAndDeduceVariables(const std::string& function,
- std::vector<std::string>& resultVars,
- bool useDegrees = false);
-</pre>
-
-<p>Like <code>Parse()</code>, but the variables in the function are deduced
-automatically. The amount of found variables and the variable names themselves
-are returned by the different versions of the function.
-
-<!-- -------------------------------------------------------------------- -->
-<a name="longdesc"></a>
-<h3>Long descriptions of FunctionParser methods</h3>
-
-<hr>
-<a name="longdesc_Parse"></a>
-<pre>
-int Parse(const std::string& Function, const std::string& Vars,
- bool useDegrees = false);
-
-int Parse(const char* Function, const std::string& Vars,
- bool useDegrees = false);
-</pre>
-
-<p>Parses the given function (and compiles it to internal format).
-Destroys previous function. Following calls to <code>Eval()</code> will evaluate
-the given function.
-
-<p>The strings given as parameters are not needed anymore after parsing.
-
-<p>Parameters:
-
-<table border=2>
- <tr>
- <td><code>Function</code></td>
- <td>String containing the function to parse.</td>
- </tr><tr>
- <td><code>Vars</code></td>
- <td>String containing the variable names, separated by commas.<br>
- Eg. <code>"x,y"</code>, <code>"VarX,VarY,VarZ,n"</code> or
- <code>"x1,x2,x3,x4,__VAR__"</code>.
- </tr><tr>
- <td><code>useDegrees</code></td>
- <td>(Optional.) Whether to use degrees or radians in
- trigonometric functions. (Default: radians)</td>
- </tr>
-</table>
-
-<p>If a <code>char*</code> is given as the <code>Function</code> parameter,
-it must be a null-terminated string.
-
-<p>Variables can have any size and they are case sensitive (ie.
-<code>"var"</code>, <code>"VAR"</code> and <code>"Var"</code> are
-<em>different</em> variable names). Letters, digits, underscores and
-UTF8-encoded characters can be used in variable names, but the name of
-a variable can't begin with a digit. Each variable name can appear only
-once in the '<code>Vars</code>' string. Function names are not legal
-variable names.
-
-<p>Using longer variable names causes no overhead whatsoever to the
-<code>Eval()</code> method, so it's completely safe to use variable names
-of any size.
-
-<p>The third, optional parameter specifies whether angles should be
- interpreted as radians or degrees in trigonometrical functions.
- If not specified, the default value is radians.
-
-<p>Return values:
-
-<ul>
- <li>On success the function returns <code>-1</code>.
- <li>On error the function returns an index to where the error was found
- (<code>0</code> is the first character, <code>1</code> the second, etc).
- If the error was not a parsing error returns an index to the end of the
- string.
-</ul>
-
-<p>Example: <code>parser.Parse("3*x+y", "x,y");</code>
-
-
-<hr>
-<a name="longdesc_setDelimiterChar"></a>
-<pre>
-void setDelimiterChar(char);
-</pre>
-
-<p>By default the parser expects the entire function string to be valid
-(ie. the entire contents of the given <code>std::string</code>, or a C string
-ending in the null character <code>'\0'</code>).
-
-<p>If a delimiter character is specified with this function, then if it's
-encountered at the outermost parsing level by the <code>Parse()</code>
-function, and the input function has been valid so far, <code>Parse()</code>
-will return an index to this character inside the input string, but rather
-than set an error code, <code>FP_NO_ERROR</code> will be set.
-
-<p>The idea is that this can be used to more easily parse functions which
-are embedded inside larger strings, containing surrounding data, without
-having to explicitly extract the function to a separate string.
-
-<p>For example, suppose you are writing an interpreter for a scripting
- language, which can have commands like this:
-
-<p><code>let MyFunction(x,y) = { sin(x*x+y*y) } // A 2-dimensional function</code>
-
-<p>Normally when parsing such a line you would have to extract the part
-inside the curly brackets into a separate string and parse it that way.
-With this feature what you can do instead is to set <code>'}'</code> as
-the delimiter character and then simply give a pointer to the character
-which comes after the <code>'{'</code>. If all goes well, the
-<code>Parse()</code> function will return an index to the <code>'}'</code>
-character (from the given starting point) and <code>GetParseErrorType()</code>
-will return <code>FP_NO_ERROR</code>. You can use the return
-value (if it's not <code>-1</code>) to jump forward in the string to the
-delimiter character.
-
-<p>Note that a null character (<code>'\0'</code>) or the end of the
-<code>std::string</code> (if one was given) will still be a valid end of
-the function string even if a delimiter character was specified. (In this
-case <code>Parse()</code> will return <code>-1</code> if there was no error,
-as usual.)
-
-<p>Also note that the delimiter character cannot be any valid operator
-or alphanumeric (including the underscore) character, nor the other
-characters defined in the function syntax. It must be a character not
-supported by the function parser (such as <code>'}'</code>,
-<code>'"'</code>, <code>']'</code>, etc).
-
-
-<hr>
-<a name="longdesc_ErrorMsg"></a>
-<pre>
-const char* ErrorMsg(void) const;
-</pre>
-
-<p>Returns a pointer to an error message string corresponding to the error
-caused by <code>Parse()</code> (you can use this to print the proper error
-message to the user). If no such error has occurred, returns an empty string.
-
-
-<hr>
-<a name="longdesc_GetParseErrorType"></a>
-<pre>
-ParseErrorType GetParseErrorType() const;
-</pre>
-
-<p>Returns the type of parse error which occurred.
-
-<p>This method can be used to get the error type if <code>ErrorMsg()</code>
-is not enough for printing the error message. In other words, this can be
-used for printing customized error messages (eg. in another language).
-If the default error messages suffice, then this method doesn't need
-to be called.
-
-<code>FunctionParser::ParseErrorType</code> is an enumerated type inside
-the class (ie. its values are accessed like
-"<code>FunctionParser::SYNTAX_ERROR</code>").
-
-<p>The possible values for FunctionParser::ParseErrorType are listed below,
-along with their equivalent error message returned by the
-<code>ErrorMsg()</code> method:
-
-<p><table border=2>
-<tr>
- <td><code>FP_NO_ERROR</code></td>
- <td>If no error occurred in the previous call to <code>Parse()</code>.</td>
-</tr><tr>
- <td><code>SYNTAX_ERROR</code></td>
- <td>"Syntax error"</td>
-</tr><tr>
- <td><code>MISM_PARENTH</code></td>
- <td>"Mismatched parenthesis"</td>
-</tr><tr>
- <td><code>MISSING_PARENTH</code></td>
- <td>"Missing ')'"</td>
-</tr><tr>
- <td><code>EMPTY_PARENTH</code></td>
- <td>"Empty parentheses"</td>
-</tr><tr>
- <td><code>EXPECT_OPERATOR</code></td>
- <td>"Syntax error: Operator expected"</td>
-</tr><tr>
- <td><code>OUT_OF_MEMORY</code></td>
- <td>"Not enough memory"</td>
-</tr><tr>
- <td><code>UNEXPECTED_ERROR</code></td>
- <td>"An unexpected error occurred. Please make a full bug report to the
- author"</td>
-</tr><tr>
- <td><code>INVALID_VARS</code></td>
- <td>"Syntax error in parameter 'Vars' given to FunctionParser::Parse()"</td>
-</tr><tr>
- <td><code>ILL_PARAMS_AMOUNT</code></td>
- <td>"Illegal number of parameters to function"</td>
-</tr><tr>
- <td><code>PREMATURE_EOS</code></td>
- <td>"Syntax error: Premature end of string"</td>
-</tr><tr>
- <td><code>EXPECT_PARENTH_FUNC</code></td>
- <td>"Syntax error: Expecting ( after function"</td>
-</tr><tr>
- <td><code>UNKNOWN_IDENTIFIER</code></td>
- <td>"Syntax error: Unknown identifier"</td>
-</tr><tr>
- <td><code>NO_FUNCTION_PARSED_YET</code></td>
- <td>"(No function has been parsed yet)"</td>
-</tr>
-</table>
-
-
-<hr>
-<a name="longdesc_Eval"></a>
-<pre>
-double Eval(const double* Vars);
-</pre>
-
-<p>Evaluates the function given to <code>Parse()</code>.
-The array given as parameter must contain the same amount of values as
-the amount of variables given to <code>Parse()</code>. Each value corresponds
-to each variable, in the same order.
-
-<p>Return values:
-<ul>
- <li>On success returns the evaluated value of the function given to
- <code>Parse()</code>.
- <li>On error (such as division by 0) the return value is unspecified,
- probably 0.
-</ul>
-
-<p>Example:
-
-<p><code>double Vars[] = {1, -2.5};</code><br>
-<code>double result = parser.Eval(Vars);</code>
-
-
-<hr>
-<a name="longdesc_EvalError"></a>
-<pre>
-int EvalError(void) const;
-</pre>
-
-<p>Used to test if the call to <code>Eval()</code> succeeded.
-
-<p>Return values:
-
-<p>If there was no error in the previous call to <code>Eval()</code>,
-returns <code>0</code>, else returns a positive value as follows:
-<ul>
- <li>1: division by zero
- <li>2: sqrt error (sqrt of a negative value)
- <li>3: log error (logarithm of a negative value)
- <li>4: trigonometric error (asin or acos of illegal value)
- <li>5: maximum recursion level in <code>eval()</code> reached
-</ul>
-
-
-<hr>
-<a name="longdesc_Optimize"></a>
-<pre>
-void Optimize();
-</pre>
-
-<p>This method can be called after calling the <code>Parse()</code> method.
-It will try to simplify the internal bytecode so that it will evaluate faster
-(it tries to reduce the amount of opcodes in the bytecode).
-
-<p>For example, the bytecode for the function <code>"5+x*y-25*4/8"</code> will
-be reduced to a bytecode equivalent to the function <code>"x*y-7.5"</code> (the
-original 11 opcodes will be reduced to 5). Besides calculating constant
-expressions (like in the example), it also performs other types of
-simplifications with variable and function expressions.
-
-<p>This method is quite slow and the decision of whether to use it or
-not should depend on the type of application. If a function is parsed
-once and evaluated millions of times, then calling <code>Optimize()</code>
-may speed-up noticeably. However, if there are tons of functions to parse
-and each one is evaluated once or just a few times, then calling
-<code>Optimize()</code> will only slow down the program.
-
-<p>Also, if the original function is expected to be optimal, then calling
-<code>Optimize()</code> would be useless.
-
-<p>Note: Currently this method does not make any checks (like
-<code>Eval()</code> does) and thus things like <code>"1/0"</code> will cause
-undefined behaviour. (On the other hand, if such expression is given to the
-parser, <code>Eval()</code> will always give an error code, no matter what
-the parameters.) If caching this type of errors is important, a work-around
-is to call <code>Eval()</code> once before calling <code>Optimize()</code>
-and checking <code>EvalError()</code>.
-
-<p>If the destination application is not going to use this method,
-the compiler constant <code>FP_SUPPORT_OPTIMIZER</code> can be undefined in
-<code>fpconfig.hh</code> to make the library smaller (<code>Optimize()</code>
-can still be called, but it will not do anything).
-
-<p>(If you are interested in seeing how this method optimizes the opcode,
-you can call the <code>PrintByteCode()</code> method before and after the
-call to <code>Optimize()</code> to see the difference.)
-
-
-<hr>
-<a name="longdesc_AddConstant"></a>
-<pre>
-bool AddConstant(const std::string& name, double value);
-</pre>
-
-<p>This method can be used to add constants to the parser. Syntactically
- constants are identical to variables (ie. they follow the same naming
- rules and they can be used in the function string in the same way as
- variables), but internally constants are directly replaced with their
- value at parse time.
-
-<p>Constants used by a function must be added before calling
-<code>Parse()</code> for that function. Constants are preserved between
-<code>Parse()</code> calls in the current FunctionParser instance, so
-they don't need to be added but once. (If you use the same constant in
-several instances of FunctionParser, you will need to add it to all the
-instances separately.)
-
-<p>Constants can be added at any time and the value of old constants can
-be changed, but new additions and changes will only have effect the next
-time <code>Parse()</code> is called. (That is, changing the value of a constant
-after calling <code>Parse()</code> and before calling <code>Eval()</code>
-will have no effect.)
-
-<p>The return value will be <code>false</code> if the '<code>name</code>' of
-the constant was illegal, else <code>true</code>. If the name was illegal,
-the method does nothing.
-
-<p>Example: <code>parser.AddConstant("pi", 3.1415926535897932);</code>
-
-<p>Now for example <code>parser.Parse("x*pi", "x");</code> will be identical
-to the call <code>parser.Parse("x*3.1415926535897932", "x");</code>
-
-
-<hr>
-<a name="longdesc_AddUnit"></a>
-<pre>
-bool AddUnit(const std::string& name, double value);
-</pre>
-
-<p>In some applications it is desirable to have units of measurement.
-A typical example is an application which creates a page layout to be
-printed. When printing, distances are usually measured in points
-(defined by the resolution of the printer). However, it is often more
-useful for the user to be able to specify measurements in other units
-such as centimeters or inches.
-
-<p>A unit is simply a value by which the preceding element is multiplied.
-For example, if the printing has been set up to 300 DPI, one inch is
-then 300 points (dots). Thus saying eg. <code>"5in"</code> is the same as saying
-<code>"5*300"</code> or <code>"1500"</code> (assuming <code>"in"</code> has
-been added as a unit with the value 300).
-
-<p>Note that units are slightly different from a multiplication in
-that they have a higher precedence than any other operator (except
-parentheses). Thus for example <code>"5/2in"</code> is parsed as
-<code>"5/(2*300)"</code>.
-(If 5/2 inches is what one wants, it has to be written <code>"(5/2)in"</code>.)
-
-<p>You can use the <code>AddUnit()</code> method to add a new unit. The
-unit can then be used after any element in the function (and will work as
-a multiplier for that element). An element is a float literal, a constant,
-a variable, a function or any expression in parentheses. When the element
-is not a float literal nor an expression in parentheses, there has to naturally
-be at least one whitespace between the element and the unit (eg.
-<code>"x in"</code>). To change the value of a unit, call
-<code>AddUnit()</code> again with the same unit name and the new value.
-
-<p>Unit names share the same namespace as constants, functions and
- variables, and thus should be distinct from those.
-
-<p>Example: <code>parser.AddUnit("in", 300);</code>
-
-<p>Now for example the function <code>"5in"</code> will be identical to
-<code>"(5*300)"</code>. Other usage examples include <code>"x in"</code>,
-<code>"3in+2"</code>, <code>"pow(x,2)in"</code>, <code>"(x+2)in"</code>.
-
-
-<hr>
-<a name="longdesc_AddFunction1"></a>
-<pre>
-bool AddFunction(const std::string& name,
- double (*functionPtr)(const double*),
- unsigned paramsAmount);
-</pre>
-
-This method can be used to add new functions to the parser. For example,
-if you would like to add a function "<code>sqr(A)</code>" which squares the
-value of <code>A</code>, you can do it with this method (so that you don't
-need to touch the source code of the parser).
-
-<p>The method takes three parameters:
-
-<ul>
- <li>The name of the function. The name follows the same naming conventions
- as variable names.
-
- <li>A C++ function, which will be called when evaluating the function
- string (if the user-given function is called there). The C++ function
- must have the form:
- <p><code>double functionName(const double* params);</code>
-
- <li>The number of parameters the function takes. 0 is a valid value
- in which case the function takes no parameters (such function
- should simply ignore the <code>double*</code> it gets as a parameter).
-</ul>
-
-<p>The return value will be <code>false</code> if the given name was invalid
-(either it did not follow the variable naming conventions, or the name was
-already reserved), else <code>true</code>. If the return value is
-<code>false</code>, nothing is added.
-
-<p>Example: Suppose we have a C++ function like this:
-
-<p><code>double Square(const double* p)</code><br>
-<code>{</code><br>
-<code> return p[0]*p[0];</code><br>
-<code>}</code>
-
-<p>Now we can add this function to the parser like this:
-
-<p><code>parser.AddFunction("sqr", Square, 1);</code><br>
-<code>parser.Parse("2*sqr(x)", "x");</code>
-
-<p>An example of a useful function taking no parameters is a function
- returning a random value. For example:
-
-<p><code>double Rand(const double*)</code><br>
-<code>{</code><br>
-<code> return drand48();</code><br
-<code>}</code>
-
-<p><code>parser.AddFunction("rand", Rand, 0);</code>
-
-<p><em>Important note</em>: If you use the <code>Optimize()</code> method,
-it will assume that the user-given function has no side-effects, that is,
-it always returns the same value for the same parameters. The optimizer will
-optimize the function call away in some cases, making this assumption.
-(The <code>Rand()</code> function given as example above is one such
-problematic case.)
-
-
-<hr>
-<a name="longdesc_AddFunction2"></a>
-<pre>
-bool AddFunction(const std::string& name, FunctionParser&);
-</pre>
-
-<p>This method is almost identical to the previous <code>AddFunction()</code>,
-but instead of taking a C++ function, it takes another FunctionParser
-instance.
-
-<p>There are some important restrictions on making a FunctionParser instance
- call another:
-
-<ul>
- <li>The FunctionParser instance given as parameter must be initialized
- with a <code>Parse()</code> call before giving it as parameter. That
- is, if you want to use the parser <code>A</code> in the parser
- <code>B</code>, you must call <code>A.Parse()</code> before you can
- call <code>B.AddFunction("name", A)</code>.
-
- <li>The amount of variables in the FunctionParser instance given as
- parameter must not change after it has been given to the
- <code>AddFunction()</code>
- of another instance. Changing the number of variables will result in
- malfunction.
-
- <li><code>AddFunction()</code> will fail (ie. return <code>false</code>)
- if a recursive loop is
- formed. The method specifically checks that no such loop is built.
-
- <li>The FunctionParser instance given as parameter will <em>not</em> be
- copied internally, only referenced. Thus the FunctionParser instance
- given as parameter must exist for as long as the other FunctionParser
- instance uses it.
-</ul>
-
-<p>Example:
-
-<p><code>FunctionParser f1, f2;</code><br>
-<p><code>f1.Parse("x*x", "x");</code><br>
-<p><code>f2.AddFunction("sqr", f1);</code>
-
-<p>This version of the <code>AddFunction()</code> method can be useful to
-eg. chain user-given functions. For example, ask the user for a function F1,
- and then ask the user another function F2, but now the user can
- call F1 in this second function if he wants (and so on with a third
- function F3, where he can call F1 and F2, etc).
-
-<hr>
-<a name="longdesc_RemoveIdentifier"></a>
-<pre>
-bool RemoveIdentifier(const std::string& name);
-</pre>
-
-<p>If a constant, unit or user-defined function with the specified name
-exists in the parser, it will be removed and the return value will be
-<code>true</code>, else nothing will be done and the return value will be
-<code>false</code>.
-
-<p>(Note: If you want to remove <em>everything</em> from an existing
-FunctionParser instance, simply assign a fresh instance to it, ie. like
-"<code>parser = FunctionParser();</code>")
-
-<hr>
-<a name="longdesc_ParseAndDeduceVariables"></a>
-<pre>
-int ParseAndDeduceVariables(const std::string& function,
- int* amountOfVariablesFound = 0,
- bool useDegrees = false);
-int ParseAndDeduceVariables(const std::string& function,
- std::string& resultVarString,
- int* amountOfVariablesFound = 0,
- bool useDegrees = false);
-int ParseAndDeduceVariables(const std::string& function,
- std::vector<std::string>& resultVars,
- bool useDegrees = false);
-</pre>
-
-<p>These functions work in the same way as the <code>Parse()</code> function,
-but the variables in the input function string are deduced automatically. The
-parameters are:
-
-<ul>
- <li><code>function</code>: The input function string, as with
- <code>Parse()</code>.
- <li><code>amountOfVariablesFound</code>: If non-null, the amount of found
- variables will be assigned here.
- <li><code>resultVarString</code>: The found variables will be written to
- this string, in the same format as accepted by the <code>Parse()</code>
- function. The variable names will be sorted using the <code><</code>
- operator of <code>std::string</code>.
- <li><code>resultVars</code>: The found variables will be written to this
- vector, each element being one variable name. They will be sorted using
- the <code><</code> operator of <code>std::string</code>. (The amount
- of found variables can be retrieved, rather obviously, with the
- <code>size()</code> method of the vector.)
- <li><code>useDegrees</code>: As with <code>Parse()</code>.
-</ul>
-
-<p>As with <code>Parse()</code>, the return value will be <code>-1</code> if
-the parsing succeeded, else an index to the location of the error. None of
-the specified return values will be modified in case of error.
-
-
-<!-- -------------------------------------------------------------------- -->
-<h2>Syntax</h2>
-
-<a name="literals"></a>
-<h3>Numeric literals</h3>
-
-<p>A numeric literal is a fixed numerical value in the input function string
- (either a floating point value or an integer value, depending on the parser
- type).
-
-<p>An integer literal can consist solely of numerical digits (possibly with
- a preceding unary minus). For example, "<code>12345</code>".
-
-<p>If the literal is preceded by the characters "<code>0x</code>", it
- will be interpreted as a hexadecimal literal, where digits can also include
- the letters from '<code>A</code>' to '<code>F</code>' (in either uppercase
- or lowercase). For example, "<code>0x89ABC</code>" (which corresponds to the
- value 563900).
-
-<p>A floating point literal (only supported by the floating point type parsers)
- may additionally include a decimal point followed by the decimal part of the
- value, such as for example "<code>12.34</code>", optionally followed by a
- decimal exponent.
-
-<p>A decimal exponent consists of an '<code>E</code>' or '<code>e</code>',
- followed by an optional plus or minus sign, followed by decimal digits, and
- indicates multiplication by a power of 10. For example, "<code>1.2e5</code>"
- (which is equivalent to the value 120000).
-
-<p>If a floating point literal is preceded by the characters "<code>0x</code>"
- it will be interpreted in hexadecimal. A hexadecimal floating point
- literal consists of a hexadecimal value, with an optional decimal point,
- followed optionally by a binary exponent in base 10 (in other words, the
- exponent is not in hexadecimal).
-
-<p>A binary exponent has the same format as a decimal exponent, except that
- '<code>P</code>' or '<code>p</code>' is used. A binary exponent indicates
- multiplication by a power of 2. For example, "<code>0xA.Bp10</code>"
- (which is equivalent to the value 10944).
-
-<a name="identifiers"></a>
-<h3>Identifier names</h3>
-
-<p>An identifier is the name of a function (internal or user-defined),
- variable, constant or unit. New identifiers can be specified with the
- functions described in the earlier subsections in this document.
-
-<p>The name of an identifier can use any alphanumeric characters, the
- underscore character and any UTF8-encoded unicode character, excluding
- those denoting whitespace.
- The first character of the name cannot be a numeric digit, though.
-
-<p>All functions, variables, constants and units must use unique names.
- It's not possible to add two different identifiers with the same name.
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="functionsyntax"></a>
-<h3>The function string syntax</h3>
-
-<p>The function string understood by the class is very similar (but not
-completely identical in all aspects) to mathematical expressions in the
-C/C++ languages.
-Arithmetic float expressions can be created from float literals, variables
-or functions using the following operators in this order of precedence:
-
-<p><table border=2>
- <tr>
- <td><code>()</code></td>
- <td>expressions in parentheses first</td>
- </tr><tr>
- <td><code>A unit</code></td>
- <td>a unit multiplier (if one has been added)</td>
- </tr><tr>
- <td><code>A^B</code></td>
- <td>exponentiation (A raised to the power B)</td>
- </tr><tr>
- <td><code>-A</code></td>
- <td>unary minus</td>
- </tr><tr>
- <td><code>!A</code></td>
- <td>unary logical not (result is 1 if <code>int(A)</code> is 0, else 0)</td>
- </tr><tr>
- <td><code>A*B A/B A%B</code></td>
- <td>multiplication, division and modulo</td>
- </tr><tr>
- <td><code>A+B A-B</code></td>
- <td>addition and subtraction</td>
- </tr><tr>
- <td><code>A=B A<B A<=B<br>A!=B A>B A>=B</code></td>
- <td>comparison between A and B (result is either 0 or 1)</td>
- </tr><tr>
- <td><code>A&B</code></td>
- <td>result is 1 if <code>int(A)</code> and <code>int(B)</code> differ from
- 0, else 0.<br>
- Note: Regardless of the values, both operands are always
- evaluated. However, if the expression is optimized, it may
- be changed such that only one of the operands is evaluated,
- according to standard shortcut logical operation semantics.</td>
- </tr><tr>
- <td><code>A|B</code></td>
- <td>result is 1 if <code>int(A)</code> or <code>int(B)</code> differ from 0,
- else 0.<br>
- Note: Regardless of the values, both operands are always
- evaluated. However, if the expression is optimized, it may
- be changed such that only one of the operands is evaluated,
- according to standard shortcut logical operation semantics.</td>
- </tr>
-</table>
-
-<p>(Note that currently the exponentiation operator is not supported for
- <code>FunctionParser_li</code> nor <code>FunctionParser_gmpint</code>.
- With the former the result would very easily overflow, making its
- usefulness questionable. With the latter it could be easily abused to
- make the program run out of memory; think of a function like
- "10^10^10^100000".)
-
-<p>Since the unary minus has higher precedence than any other operator, for
- example the following expression is valid: <code>x*-y</code>
-
-<p>The comparison operators use an epsilon value, so expressions which may
-differ in very least-significant digits should work correctly. For example,
-<code>"0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 = 1"</code> should always
-return 1, and the same comparison done with "<code>></code>" or
-"<code><</code>" should always return 0. (The epsilon value can be
-configured in the <code>fpconfig.hh</code> file.)
-Without epsilon this comparison probably returns the wrong value.
-
-<p>The class supports these functions:
-
-<p><table border=2>
-<tr>
- <td><code>abs(A)</code></td>
- <td>Absolute value of A. If A is negative, returns -A otherwise returns A.</td>
-</tr><tr>
- <td><code>acos(A)</code></td>
- <td>Arc-cosine of A. Returns the angle, measured in radians, whose cosine
- is A.</td>
-</tr><tr>
- <td><code>acosh(A)</code></td>
- <td>Same as acos() but for hyperbolic cosine.</td>
-</tr><tr>
- <td><code>asin(A)</code></td>
- <td>Arc-sine of A. Returns the angle, measured in radians, whose sine
- is A.</td>
-</tr><tr>
- <td><code>asinh(A)</code></td>
- <td>Same as asin() but for hyperbolic sine.</td>
-</tr><tr>
- <td><code>atan(A)</code></td>
- <td>Arc-tangent of (A). Returns the angle, measured in radians,
- whose tangent is (A).</td>
-</tr><tr>
- <td><code>atan2(A,B)</code></td>
- <td>Arc-tangent of A/B. The two main differences to atan() is
- that it will return the right angle depending on the signs of
- A and B (atan() can only return values betwen -pi/2 and pi/2),
- and that the return value of pi/2 and -pi/2 are possible.</td>
-</tr><tr>
- <td><code>atanh(A)</code></td>
- <td>Same as atan() but for hyperbolic tangent.</td>
-</tr><tr>
- <td><code>cbrt(A)</code></td>
- <td>Cube root of A. Returns the value whose cube is A.</td>
-</tr><tr>
- <td><code>ceil(A)</code></td>
- <td>Ceiling of A. Returns the smallest integer not smaller than A.
- Rounds up to the next higher integer. E.g. -2.9, -2.5 and -2.1 are
- rounded to -2.0, and 2.9, 2.5 and 2.1 are rounded to 3.0.</td>
-</tr><tr>
- <td><code>cos(A)</code></td>
- <td>Cosine of A. Returns the cosine of the angle A, where A is
- measured in radians.</td>
-</tr><tr>
- <td><code>cosh(A)</code></td>
- <td>Same as cos() but for hyperbolic cosine.</td>
-</tr><tr>
- <td><code>cot(A)</code></td>
- <td>Cotangent of A (equivalent to 1/tan(A)).</td>
-</tr><tr>
- <td><code>csc(A)</code></td>
- <td>Cosecant of A (equivalent to 1/sin(A)).</td>
-</tr><tr>
- <td><code>eval(...)</code></td>
- <td>This a recursive call to the function to be evaluated. The
- number of parameters must be the same as the number of parameters
- taken by the function. Must be called inside <code>if()</code> to avoid
- infinite recursion.</td>
-</tr><tr>
- <td><code>exp(A)</code></td>
- <td>Exponential of A. Returns the value of e raised to the power
- A where e is the base of the natural logarithm, i.e. the
- non-repeating value approximately equal to 2.71828182846.</td>
-</tr><tr>
- <td><code>floor(A)</code></td>
- <td>Floor of A. Returns the largest integer not greater than A. Rounds
- down to the next lower integer.
- E.g. -2.9, -2.5 and -2.1 are rounded to -3.0,
- and 2.9, 2.5 and 2.1 are rounded to 2.0.</td>
-</tr><tr>
- <td><code>if(A,B,C)</code></td>
- <td>If int(A) differs from 0, the return value of this function is B,
- else C. Only the parameter which needs to be evaluated is
- evaluated, the other parameter is skipped; this makes it safe to
- use <code>eval()</code> in them.</td>
-</tr><tr>
- <td><code>int(A)</code></td>
- <td>Rounds A to the closest integer. Equidistant values are rounded up.
- E.g. -2.9 is rounded to -3.0; -2.5 and -2.1 are rounded to -2.0,
- and 2.9 and 2.5 are rounded to 3.0; 2.1 is rounded to 2.0.</td>
-</tr><tr>
- <td><code>log(A)</code></td>
- <td>Natural (base e) logarithm of A.</td>
-</tr><tr>
- <td><code>log10(A)</code></td>
- <td>Base 10 logarithm of A.</td>
-</tr><tr>
- <td><code>max(A,B)</code></td>
- <td>If A>B, the result is A, else B.</td>
-</tr><tr>
- <td><code>min(A,B)</code></td>
- <td>If A<B, the result is A, else B.</td>
-</tr><tr>
- <td><code>pow(A,B)</code></td>
- <td>Exponentiation (A raised to the power B).</td>
-</tr><tr>
- <td><code>sec(A)</code></td>
- <td>Secant of A (equivalent to 1/cos(A)).</td>
-</tr><tr>
- <td><code>sin(A)</code></td>
- <td>Sine of A. Returns the sine of the angle A, where A is
- measured in radians.</td>
-</tr><tr>
- <td><code>sinh(A)</code></td>
- <td>Same as sin() but for hyperbolic sine.</td>
-</tr><tr>
- <td><code>sqrt(A)</code></td>
- <td>Square root of A. Returns the value whose square is A.</td>
-</tr><tr>
- <td><code>tan(A)</code></td>
- <td>Tangent of A. Returns the tangent of the angle A, where A
- is measured in radians.</td>
-</tr><tr>
- <td><code>tanh(A)</code></td>
- <td>Same as tan() but for hyperbolic tangent.</td>
-</tr><tr>
- <td><code>trunc(A)</code></td>
- <td>Truncated value of A. Returns an integer corresponding to the value
- of A without its fractional part.
- E.g. -2.9, -2.5 and -2.1 are rounded to -2.0,
- and 2.9, 2.5 and 2.1 are rounded to 2.0.</td>
-</tr>
-</table>
-
-<p>(Note that for <code>FunctionParser_li</code> and
- <code>FunctionParser_gmpint</code> only the functions
- <code>abs()</code>, <code>eval()</code>, <code>if()</code>,
- <code>min()</code> and <code>max()</code> are supported.)
-
-<p>Examples of function string understood by the class:
-
-<p><code>"1+2"</code><br>
-<code>"x-1"</code><br>
-<code>"-sin(sqrt(x^2+y^2))"</code><br>
-<code>"sqrt(XCoord*XCoord + YCoord*YCoord)"</code><br>
-
-<p>An example of a recursive function is the factorial function:
-
-<code>"if(n>1, n*eval(n-1), 1)"</code>
-
-<p>Note that a recursive call has some overhead, which makes it a bit slower
- than any other operation. It may be a good idea to avoid recursive functions
- in very time-critical applications. Recursion also takes some memory, so
- extremely deep recursions should be avoided (eg. millions of nested recursive
- calls).
-
-<p>Also note that even though the maximum recursion level of
-<code>eval()</code> is limited, it is possible to write functions which
-never reach that level but still take enormous amounts of time to evaluate.
-This can sometimes be undesirable because it is prone to exploitation,
-which is why <code>eval()</code> is disabled by default. It can be enabled
-in the <code>fpconfig.hh</code> file.
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="inlinevars"></a>
-<h3>Inline variables</h3>
-
-<p>The function syntax supports defining new variables inside the function
-string itself. This can be done with the following syntax:
-
-<p><code>"<variable name> := <expression>; <function>"</code>
-
-<p>For example:
-
-<p><code>"length := sqrt(x*x+y*y); 2*length*sin(length)"</code>
-
-<p>(Spaces around the '<code>:=</code>' operator are optional.)
-
-<p>The obvious benefit of this is that if a long expression needs to be
-used in the function several times, this allows writing it only once and
-using a named variable from that point forward.
-
-<p>The variable name must be an unused identifier (in other words, not an
-existing function, variable or unit name).
-
-<p>The <code><function></code> part can have further inline variable
-definitions, and thus it's possible to have any amount of them, for example:
-
-<p><code>"A := x^2; B := y^2; C := z^2; sqrt(A+B+C)"</code>
-
-<p>The expressions in subsequent inline variable definitions can use any
-of the previous inline variables. It is also possible to redefine an inline
-variable. For example:
-
-<p><code>"A := x^2; A := 2*A; sqrt(A)"</code>
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="whitespace"></a>
-<h3>Whitespace</h3>
-
-<p>Arbitrary amounts of whitespace can optionally be included between
- elements in the function string.
- The following unicode characters are interpreted as whitespace:
-<table>
- <tr>
- <th>Character number</th>
- <th>Character name</th>
- <th>UTF-8 byte sequence</th>
- </tr>
- <tr><td>U+0009</td><td>HORIZONTAL TABULATION </td><td>09</td></tr>
- <tr><td>U+000A</td><td>LINE FEED </td><td>0A</td></tr>
- <tr><td>U+000B</td><td>VERTICAL TABULATION </td><td>0B</td></tr>
- <tr><td>U+000D</td><td>CARRIAGE RETURN </td><td>0D</td></tr>
- <tr><td>U+0020</td><td>SPACE </td><td>20</td></tr>
- <tr><td>U+00A0</td><td>NO-BREAK SPACE </td><td>C2 A0</td></tr>
- <tr><td>U+2000</td><td>EN QUAD </td><td>E2 80 80</td></tr>
- <tr><td>U+2001</td><td>EM QUAD </td><td>E2 80 81</td></tr>
- <tr><td>U+2002</td><td>EN SPACE </td><td>E2 80 82</td></tr>
- <tr><td>U+2003</td><td>EM SPACE </td><td>E2 80 83</td></tr>
- <tr><td>U+2004</td><td>THREE-PER-EM SPACE </td><td>E2 80 84</td></tr>
- <tr><td>U+2005</td><td>FOUR-PER-EM SPACE </td><td>E2 80 85</td></tr>
- <tr><td>U+2006</td><td>SIX-PER-EM SPACE </td><td>E2 80 86</td></tr>
- <tr><td>U+2007</td><td>FIGURE SPACE </td><td>E2 80 87</td></tr>
- <tr><td>U+2008</td><td>PUNCTUATION SPACE </td><td>E2 80 88</td></tr>
- <tr><td>U+2009</td><td>THIN SPACE </td><td>E2 80 89</td></tr>
- <tr><td>U+200A</td><td>HAIR SPACE </td><td>E2 80 8A</td></tr>
- <tr><td>U+200B</td><td>ZERO WIDTH SPACE </td><td>E2 80 8B</td></tr>
- <tr><td>U+202F</td><td>NARROW NO-BREAK SPACE </td><td>E2 80 AF</td></tr>
- <tr><td>U+205F</td><td>MEDIUM MATHEMATICAL SPACE</td><td>E2 81 9F</td></tr>
- <tr><td>U+3000</td><td>IDEOGRAPHIC SPACE </td><td>E3 80 80</td></tr>
-</table>
-
-
-<!-- -------------------------------------------------------------------- -->
-<h2>Miscellaneous</h2>
-
-<a name="evaluationchecks"></a>
-<h3>About evaluation-time checks</h3>
-
-<p>By default <code>FunctionParser::Eval()</code> will perform certain sanity
-checks before performing certain operations. For example, before calling the
-<code>sqrt</code> function, it will check if the parameter is negative, and
-if so, it will set the proper error code instead of calling the function.
-These checks include:
-
-<ul>
- <li>Division by (the exact value of) zero.
- <li>Square root of a negative value.
- <li>Logarithm of a non-positive value.
- <li>Arcsine or arccosine of a value not in the range [-1, 1]. (This includes
- hyperbolic versions of the functions.)
-</ul>
-
-<p>However, the library <em>can not</em> guarantee that it will catch all
-possible floating point errors before performing them, because this is
-impossible to do with standard C++. For example, dividing a very large
-value by a value which is very close to zero, or calculating the logarithm
-of a very small value may overflow the result, as well as multiplying two
-very large values. Raising a negative number to a non-integral power may
-cause a <em>NaN</em> result, etc.
-
-<p>As a rule of thumb, the library will (by default) detect invalid operations
-if they are invalid for a range of values. For example, square root is undefined
-for all negative values, and arc sine is undefined only values outside the range
-[-1, 1]. In general, operations which are invalid for only one single value
-(rather than a contiguous range of values) will not be detected (division by
-the exact value of zero is an exception to this rule) nor will
-overflow/underflow situations.
-
-<p>The library cannot guarantee that floating point
-errors will never happen during evaluation. This can make the library to
-return the floating point values <em>inf</em> and <em>NaN</em>. Moreover,
-if floating point errors cause an interrupt in the target computer
-architecture and/or when using certain compiler settings, this library
-cannot guarantee that it will never happen.
-
-<p>Since not all error situations can be caught, and since the sanity checks
-only slow down the evaluation (although only very slightly), the precompiler
-constant <code>FP_NO_EVALUATION_CHECKS</code> can be used to turn all the
-checks off. This might make the evaluation slightly faster in certain
-situations.
-
-<p>Note that the optimizer never performs any sanity checks.
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="threadsafety"></a>
-<h3>About thread safety</h3>
-
-<p>None of the member functions of the FunctionParser class are thread-safe.
-Most prominently, the <code>Eval()</code> function is not thread-safe.
-(In other words, the <code>Eval()</code> function of a single FunctionParser
-instance cannot be safely called simultaneously by two threads.)
-
-<p>There are ways to use this library in a thread-safe way, though. If each
-thread uses its own FunctionParser instance, no problems will obviously
-happen. Note, however, that if these instances need to be a copy of a given
-FunctionParser instance (eg. one where the user has entered a function),
-a deep copy of this instance has to be performed for each thread. By
-default FunctionParser uses shallow-copying (copy-on-write), which means
-that a simple assignment of copy construction will not copy the data itself.
-To force a deep copy you can all the <code>ForceDeepCopy()</code> function on
-each of the instances of each thread after the assignment or copying has been
-done.
-
-<p>Another possibility is to compile the FunctionParser library so that
-its <code>Eval()</code> function will be thread-safe. (This can be done by
-defining the <code>FP_USE_THREAD_SAFE_EVAL</code> or the
-<code>FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA</code>
-precompiler constant.) As long as only one thread calls the other functions
-of FunctionParser, the other threads can safely call the <code>Eval()</code>
-of this one instance.
-
-<p>Note, however, that compiling the library like this can make
-<code>Eval()</code> slightly slower. (The <code>alloca</code> version, if
-supported by the compiler, will not be as slow.)
-
-<p>Also note that the MPFR and GMP versions of the library cannot be
- made thread-safe, and thus this setting has no effect on them.
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="tipsandtricks"></a>
-<h3>Tips and tricks</h3>
-
-<h4>Add constants automatically to all parser objects</h4>
-
-<p>Often the same constants (such as <em>pi</em> and <em>e</em>) and other
-user-defined identifiers (such as units) are always used in all the
-<code>FunctionParser</code> objects throughout the program. It would be
-troublesome to always have to manually add these constants every time a
-new parser object is created.
-
-<p>There is, however, a simple way to always add these user-defined identifiers
-to all instances. Write a class like this:
-
-<pre>
- class ParserWithConsts: public FunctionParser
- {
- public:
- ParserWithConsts()
- {
- AddConstant("pi", 3.14159265358979323846);
- AddConstant("e", 2.71828182845904523536);
- }
- };
-</pre>
-
-<p>Now instead of using <code>FunctionParser</code>, always use
-<code>ParserWithConsts</code>. It will behave identically except that the
-constants (and possibly other user-defined identifiers) will always be
-automatically defined. (Objects of this type even survive
-<a href="http://en.wikipedia.org/wiki/Object_slicing">slicing</a>, so
-they are completely safe to use anywhere.)
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="contact"></a>
-<h3>Contacting the author</h3>
-
-<p>Any comments, bug reports, etc. should be sent to warp at iki.fi
-
-
-<!-- -------------------------------------------------------------------- -->
-<!--
-<a name="algorithm"></a>
-<h2>The algorithm used in the library</h2>
-
-<p>The whole idea behind the algorithm is to convert the regular infix
-format (the regular syntax for mathematical operations in most languages,
-like C and the input of the library) to postfix format. The postfix format
-is also called stack arithmetic since an expression in postfix format
-can be evaluated using a stack and operating with the top of the stack.
-
-<p>For example:
-
-<p><table border=2>
-<tr><th>infix</th> <th>postfix</th></tr>
-<tr><td><code>2+3</code></td><td><code>2 3 +</code></td></tr>
-<tr><td><code>1+2+3</code></td><td><code>1 2 + 3 +</code></td></tr>
-<tr><td><code>5*2+8/2</code></td><td><code>5 2 * 8 2 / +</code></td></tr>
-<tr><td><code>(5+9)*3</code></td><td><code>5 9 + 3 *</code></td></tr>
-</table>
-
-<p>The postfix notation should be read in this way:
-
-<p>Let's take for example the expression: <code>5 2 * 8 2 / +</code>
-<ul>
- <li>Put 5 on the stack
- <li>Put 2 on the stack
- <li>Multiply the two values on the top of the stack and put the result on
- the stack (removing the two old values)
- <li>Put 8 on the stack
- <li>Put 2 on the stack
- <li>Divide the two values on the top of the stack
- <li>Add the two values on the top of the stack (which are in this case
- the result of 5*2 and 8/2, that is, 10 and 4).
-</ul>
-
-<p>At the end there's only one value in the stack, and that value is the
-result of the expression.
-
-<p>Why stack arithmetic?
-
-<p>The last example above can give you a hint.
- In infix format operators have precedence and we have to use parentheses to
-group operations with lower precedence to be calculated before operations
-with higher precedence.
- This causes a problem when evaluating an infix expression, specially
-when converting it to byte code. For example in this kind of expression:
- <code>(x+1)/(y+2)</code>
-we have to calculate first the two additions before we can calculate the
-division. We have to also keep counting parentheses, since there can be
-a countless amount of nested parentheses. This usually means that you
-have to do some type of recursion.
-
-<p>The simplest and mostefficient way of calculating this is to convert it
-to postfix notation.
- The postfix notation has the advantage that you can make all operations
-in a straightforward way. You just evaluate the expression from left to
-right, applying each operation directly and that's it. There are no
-parentheses to worry about. You don't need recursion anywhere.
- You have to keep a stack, of course, but that's extremely easily done.
-Also you just operate with the top of the stack, which makes it very easy.
-You never have to go deeper than 2 items in the stack.
- And even better: Evaluating an expression in postfix format is never
-slower than in infix format. All the contrary, in many cases it's a lot
-faster (eg. because all parentheses are optimized away).
- The above example could be expressed in postfix format:
- <code>x 1 + y 2 + /</code>
-
-<p>The good thing about the postfix notation is also the fact that it can
-be extremely easily expressed in bytecode form.
- You only need a byte value for each operation, for each variable and
-to push a constant to the stack.
- Then you can interpret this bytecode straightforwardly. You just interpret
-it byte by byte, from the beginning to the end. You never have to go back,
-make loops or anything.
-
-<p>This is what makes byte-coded stack arithmetic so fast.
--->
-
-
-<!-- -------------------------------------------------------------------- -->
-<a name="license"></a>
-<h2>Usage license</h2>
-
-<p>Copyright © 2003-2010 Juha Nieminen, Joel Yliluoma
-
-<p>This Library is distributed under the
- <a href="http://www.gnu.org/copyleft/lesser.html">Lesser General Public
- License</a> (LGPL) version 3.
-
-</body>
-</html>
diff --git a/fparser/docs/gpl.txt b/fparser/docs/gpl.txt
deleted file mode 100644
index 94a9ed0..0000000
--- a/fparser/docs/gpl.txt
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/fparser/docs/lgpl.txt b/fparser/docs/lgpl.txt
deleted file mode 100644
index cca7fc2..0000000
--- a/fparser/docs/lgpl.txt
+++ /dev/null
@@ -1,165 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/fparser/docs/style.css b/fparser/docs/style.css
deleted file mode 100644
index d5141d3..0000000
--- a/fparser/docs/style.css
+++ /dev/null
@@ -1,80 +0,0 @@
-html
-{
- background-color: #E0E0E0;
-}
-
-body
-{
- background-color: white;
- margin-left: 7%;
- margin-top: 16px;
- margin-right: 7%;
- padding-top: 2em;
- padding-left: 7%;
- padding-right: 7%;
- padding-bottom: 2%;
- border-color: black;
- border: solid;
- border-width: 1px;
-}
-
-h1
-{
- text-align: center;
- background-color: #FFEEBB;
- padding-bottom: 0.2em;
- padding-top: 0.1em;
-}
-
-h2
-{
- background-color: #FFFFCC;
- padding-left: 0.5em;
-}
-
-h3
-{
- background-color: #FFFFEE;
-}
-
-blockquote
-{
- padding-left: 2em;
- padding-right: 2em;
- font-style: italic;
- background-color: #FFFAF0;
-}
-
-li
-{
- padding-top: 0.3em;
-}
-
-pre
-{
- background-color: #E8E8E8;
- padding-left: 1em;
- padding-top: 0.5em;
- padding-bottom: 0.5em;
-}
-
-code
-{
- font-family: monospace;
- color: #900040;
-}
-
-.small
-{
- font-size: 80%;
-}
-
-.codecomment
-{
- color: green;
-}
-
-.highlight
-{
- background: #C0D0FF;
-}
diff --git a/fparser/examples/example.cc b/fparser/examples/example.cc
deleted file mode 100644
index b4ab5f4..0000000
--- a/fparser/examples/example.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Simple example file for the function parser
-// ===========================================
-
-/* When running the program, try for example with these values:
-
-f(x) = x^2
-min x: -5
-max x: 5
-step: 1
-
-*/
-
-#include "../fparser.hh"
-
-#include <iostream>
-#include <string>
-
-int main()
-{
- std::string function;
- double minx, maxx, step;
- FunctionParser fparser;
-
- fparser.AddConstant("pi", 3.1415926535897932);
-
- while(true)
- {
- std::cout << "f(x) = ";
- std::getline(std::cin, function);
- if(std::cin.fail()) return 0;
-
- int res = fparser.Parse(function, "x");
- if(res < 0) break;
-
- std::cout << std::string(res+7, ' ') << "^\n"
- << fparser.ErrorMsg() << "\n\n";
- }
-
- std::cout << "min x: ";
- std::cin >> minx;
- std::cout << "max x: ";
- std::cin >> maxx;
- std::cout << "step: ";
- std::cin >> step;
- if(std::cin.fail()) return 0;
-
- double vals[] = { 0 };
- for(vals[0] = minx; vals[0] <= maxx; vals[0] += step)
- {
- std::cout << "f(" << vals[0] << ") = " << fparser.Eval(vals)
- << std::endl;
- }
-
- return 0;
-}
diff --git a/fparser/examples/example2.cc b/fparser/examples/example2.cc
deleted file mode 100644
index 958b9a1..0000000
--- a/fparser/examples/example2.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-// Simple example file for the function parser
-// ===========================================
-/* Note that the library has to be compiled with
- FP_SUPPORT_FLOAT_TYPE, FP_SUPPORT_LONG_DOUBLE_TYPE and
- FP_SUPPORT_LONG_INT_TYPE
- preprocessor macros defined for this example to work.
-
- Try with these input values with the different floating point parser
- types to see the difference in accuracy:
-
-f(x) = x + 1.234567890123456789
-min x: 0
-max x: 2
-step: 1
-*/
-
-#include "../fparser.hh"
-
-#include <iostream>
-#include <iomanip>
-#include <string>
-
-template<typename Parser>
-void runExample(const char* valueTypeName)
-{
- typedef typename Parser::value_type Value_t;
-
- std::cout << "Using " << valueTypeName << " parser." << std::endl;
-
- Parser fparser;
- std::string function;
- Value_t minx, maxx, step;
-
- fparser.AddConstant("pi", Value_t(3.1415926535897932));
-
- std::cin.ignore();
- while(true)
- {
- std::cout << "f(x) = ";
- std::getline(std::cin, function);
- if(std::cin.fail()) return;
-
- int res = fparser.Parse(function, "x");
- if(res < 0) break;
-
- std::cout << std::string(res+7, ' ') << "^\n"
- << fparser.ErrorMsg() << "\n\n";
- }
-
- std::cout << "min x: ";
- std::cin >> minx;
- std::cout << "max x: ";
- std::cin >> maxx;
- std::cout << "step: ";
- std::cin >> step;
- if(std::cin.fail()) return;
-
- Value_t vals[] = { 0 };
- for(vals[0] = minx; vals[0] <= maxx; vals[0] += step)
- {
- std::cout << std::setprecision(20);
- std::cout << "f(" << vals[0] << ") = " << fparser.Eval(vals)
- << std::endl;
- }
-}
-
-int main()
-{
- int choice = 0;
- do
- {
- std::cout << "1 = double, 2 = float, 3 = long double, 4 = long int: ";
- std::cin >> choice;
- } while(choice < 1 || choice > 4);
-
- switch(choice)
- {
- case 1: runExample<FunctionParser>("double"); break;
- case 2: runExample<FunctionParser_f>("float"); break;
- case 3: runExample<FunctionParser_ld>("long double"); break;
- case 4: runExample<FunctionParser_li>("long int"); break;
- }
-
- return 0;
-}
diff --git a/fparser/fp_identifier_parser.inc b/fparser/fp_identifier_parser.inc
deleted file mode 100644
index 7a903c1..0000000
--- a/fparser/fp_identifier_parser.inc
+++ /dev/null
@@ -1,415 +0,0 @@
-/* NOTE:
- Do not include this file in your project. The fparser.cc file #includes
-this file internally and thus you don't need to do anything (other than keep
-this file in the same directory as fparser.cc).
-
- Part of this file is generated code (by using the make_function_name_parser
-utility, found in the development version of this library). It's not intended
-to be modified by hand.
-*/
-
- unsigned nameLength = 0;
- const unsigned maximumNameLength = 0x80000000U-8;
- /*
- Due to the manner the identifier lengths are returned from
- the readOpcode() function, the maximum supported length for
- identifiers is 0x7FFFFFFF bytes. We minus 8 here to add some
- buffer, because of the multibyteness of UTF-8.
- Function names are limited to 0xFFFF bytes instead, but because
- function names that long just are not defined, the point is moot.
- */
- const unsigned char* const uptr = (const unsigned char*) input;
- typedef signed char schar;
- while(likely(nameLength < maximumNameLength))
- {
- unsigned char byte = uptr[nameLength+0];
- /* Handle the common case of A-Za-z first */
- if(byte >= 0x40)
- {
- if(byte < 0x80) // 0x40..0x7F - most common case
- {
- // Valid characters in 40..7F: A-Za-z_
- // Valid bitmask for 40..5F: 01111111111111111111111111100001
- // Valid bitmask for 60..7F: 01111111111111111111111111100000
- if(sizeof(unsigned long) == 8)
- {
- const unsigned n = sizeof(unsigned long)*8-32;
- // ^ avoids compiler warning when not 64-bit
- unsigned long masklow6bits = 1UL << (byte & 0x3F);
- if(masklow6bits & ~((1UL << 0) | (0x0FUL << (0x1B ))
- | (1UL << n) | (0x1FUL << (0x1B+n))))
- { ++nameLength; continue; }
- }
- else
- {
- unsigned masklow5bits = 1 << (byte & 0x1F);
- if((masklow5bits & ~(1 | (0x1F << 0x1B))) || byte == '_')
- { ++nameLength; continue; }
- }
- break;
- }
- if(byte < 0xF0)
- {
- if(byte < 0xE0)
- {
- if(byte < 0xC2) break; // 0x80..0xC1
- if(byte == 0xC2 && uptr[nameLength+1]==0xA0) break; // skip nbsp
- // C2-DF - next common case when >= 0x40
- // Valid sequence: C2-DF 80-BF
- if(schar(uptr[nameLength+1]) > schar(0xBF)) break;
- nameLength += 2;
- continue;
- }
- if(byte == 0xE0) // E0
- {
- // Valid sequence: E0 A0-BF 80-BF
- if((unsigned char)(uptr[nameLength+1] - 0xA0) > (0xBF-0xA0)) break;
- }
- else
- {
- if(byte == 0xED) break; // ED is invalid
- // Valid sequence: E1-EC 80-BF 80-BF
- // And: EE-EF 80-BF 80-BF
- if(byte == 0xE2)
- {
- // break on various space characters
- if(uptr[nameLength+1] == 0x80
- && (schar(uptr[nameLength+2]) <= schar(0x8B)
- || (uptr[nameLength+2] == 0xAF))) break;
- if(uptr[nameLength+1] == 0x81
- && uptr[nameLength+2] == 0x9F) break;
- } else
- if(byte == 0xE3 && uptr[nameLength+1] == 0x80
- && uptr[nameLength+2] == 0x80) break; // this too
-
- if(schar(uptr[nameLength+1]) > schar(0xBF)) break;
- }
- if(schar(uptr[nameLength+2]) > schar(0xBF)) break;
- nameLength += 3;
- continue;
- }
- if(byte == 0xF0) // F0
- {
- // Valid sequence: F0 90-BF 80-BF 80-BF
- if((unsigned char)(uptr[nameLength+1] - 0x90) > (0xBF-0x90)) break;
- }
- else
- {
- if(byte > 0xF4) break; // F5-FF are invalid
- if(byte == 0xF4) // F4
- {
- // Valid sequence: F4 80-8F
- if(schar(uptr[nameLength+1]) > schar(0x8F)) break;
- }
- else
- {
- // F1-F3
- // Valid sequence: F1-F3 80-BF 80-BF 80-BF
- if(schar(uptr[nameLength+1]) > schar(0xBF)) break;
- }
- }
- if(schar(uptr[nameLength+2]) > schar(0xBF)) break;
- if(schar(uptr[nameLength+3]) > schar(0xBF)) break;
- nameLength += 4;
- continue;
- }
- if(nameLength > 0)
- {
- if(sizeof(unsigned long) == 8)
- {
- // Valid bitmask for 00..1F: 00000000000000000000000000000000
- // Valid bitmask for 20..3F: 00000000000000001111111111000000
- const unsigned n = sizeof(unsigned long)*8-32;
- // ^ avoids compiler warning when not 64-bit
- unsigned long masklow6bits = 1UL << byte;
- if(masklow6bits & (((1UL << 10)-1UL) << (16+n)))
- { ++nameLength; continue; }
- }
- else
- {
- if(byte >= '0' && byte <= '9')
- { ++nameLength; continue; }
- }
- }
- break;
- }
-
- /* This function generated with make_function_name_parser.cc */
-#define lN l7 lB
-#define lM l2 lB
-#define lL l3 lB
-#define lK if('i'l4
-#define lJ uptr
-#define lI l5 3]={
-#define lH 'n'l4
-#define lG l6 3;}lB
-#define lF return
-#define lE 0x80000003U:3;
-#define lD 0x80000005U:5;
-#define lC std::memcmp(lJ+
-#define lB case
-#define lA switch(
-#define l9 <<16)|
-#define l8 lC 1,tmp,
-#define l7 lD lF 5;}
-#define l6 default:lF
-#define l5 static const char tmp[
-#define l4 ==lJ[
-#define l3 lE lF 3;
-#define l2 0x80000004U:4;lF 4;
-#define l1 .enabled()?(
-#define l0 lF Functions[
-lA
-nameLength){lB
-2:lK
-0]&&'f'l4
-1])l0
-cIf]l1
-cIf
-l9
-0x80000002U:2;lF
-2;lB
-3:lA
-lJ[0]){lB'a':if('b'l4
-1]&&'s'l4
-2])l0
-cAbs]l1
-cAbs
-l9
-lL'c':lA
-lJ[1]){lB'o':lA
-lJ[2]){lB's':l0
-cCos]l1
-cCos
-l9
-lE
-lB't':l0
-cCot]l1
-cCot
-l9
-lE
-lG's':if('c'l4
-2])l0
-cCsc]l1
-cCsc
-l9
-l3
-lG'e':if('x'l4
-1]&&'p'l4
-2])l0
-cExp]l1
-cExp
-l9
-lL'i':if(lH
-1]&&'t'l4
-2])l0
-cInt]l1
-cInt
-l9
-lL'l':if('o'l4
-1]&&'g'l4
-2])l0
-cLog]l1
-cLog
-l9
-lL'm':lA
-lJ[1]){lB'a':if('x'l4
-2])l0
-cMax]l1
-cMax
-l9
-lL'i':if(lH
-2])l0
-cMin]l1
-cMin
-l9
-l3
-lG'p':if('o'l4
-1]&&'w'l4
-2])l0
-cPow]l1
-cPow
-l9
-lL's':lA
-lJ[1]){lB'e':if('c'l4
-2])l0
-cSec]l1
-cSec
-l9
-lL'i':if(lH
-2])l0
-cSin]l1
-cSin
-l9
-l3
-lG't':if('a'l4
-1]&&lH
-2])l0
-cTan]l1
-cTan
-l9
-l3
-lG
-4:lA
-lJ[0]){lB'a':lA
-lJ[1]){lB'c':if('o'l4
-2]&&'s'l4
-3])l0
-cAcos]l1
-cAcos
-l9
-lM's':lK
-2]&&lH
-3])l0
-cAsin]l1
-cAsin
-l9
-lM't':if('a'l4
-2]&&lH
-3])l0
-cAtan]l1
-cAtan
-l9
-l2
-l6
-4;}
-lB'c':lA
-lJ[1]){lB'b':if('r'l4
-2]&&'t'l4
-3])l0
-cCbrt]l1
-cCbrt
-l9
-lM'e':lK
-2]&&'l'l4
-3])l0
-cCeil]l1
-cCeil
-l9
-lM'o':if('s'l4
-2]&&'h'l4
-3])l0
-cCosh]l1
-cCosh
-l9
-l2
-l6
-4;}
-lB'e':lA
-lJ[1]){lB'v':if('a'l4
-2]&&'l'l4
-3])l0
-cEval]l1
-cEval
-l9
-lM'x':if('p'l4
-2]&&'2'l4
-3])l0
-cExp2]l1
-cExp2
-l9
-l2
-l6
-4;}
-lB'l':{lI'o','g','2'}
-;if(l8
-3)==0)l0
-cLog2]l1
-cLog2
-l9
-l2}
-lB's':lA
-lJ[1]){lB'i':if(lH
-2]&&'h'l4
-3])l0
-cSinh]l1
-cSinh
-l9
-lM'q':if('r'l4
-2]&&'t'l4
-3])l0
-cSqrt]l1
-cSqrt
-l9
-l2
-l6
-4;}
-lB't':{lI'a','n','h'}
-;if(l8
-3)==0)l0
-cTanh]l1
-cTanh
-l9
-l2}
-l6
-4;}
-lB
-5:lA
-lJ[0]){lB'a':lA
-lJ[1]){lB'c':{lI'o','s','h'}
-;if(lC
-2,tmp,3)==0)l0
-cAcosh]l1
-cAcosh
-l9
-lN's':{lI'i','n','h'}
-;if(lC
-2,tmp,3)==0)l0
-cAsinh]l1
-cAsinh
-l9
-lN't':if('a'l4
-2]){if(lH
-3]){lA
-lJ[4]){lB'2':l0
-cAtan2]l1
-cAtan2
-l9
-lD
-lB'h':l0
-cAtanh]l1
-cAtanh
-l9
-lD
-l6
-5;}
-}
-lF
-5;}
-lF
-5;l6
-5;}
-lB'f':{l5
-4]={'l','o','o','r'}
-;if(l8
-4)==0)l0
-cFloor]l1
-cFloor
-l9
-lN'h':{l5
-4]={'y','p','o','t'}
-;if(l8
-4)==0)l0
-cHypot]l1
-cHypot
-l9
-lN'l':{l5
-4]={'o','g','1','0'}
-;if(l8
-4)==0)l0
-cLog10]l1
-cLog10
-l9
-lN't':{l5
-4]={'r','u','n','c'}
-;if(l8
-4)==0)l0
-cTrunc]l1
-cTrunc
-l9
-l7
-l6
-5;}
-default:break;}
-lF
-nameLength;
\ No newline at end of file
diff --git a/fparser/fp_opcode_add.inc b/fparser/fp_opcode_add.inc
deleted file mode 100644
index 5b4b03d..0000000
--- a/fparser/fp_opcode_add.inc
+++ /dev/null
@@ -1,4214 +0,0 @@
-/* Function Parser for C++ v4.3
-
- NOTE:
- Do not include this file in your project. The fparser.cc file #includes
-this file internally and thus you don't need to do anything (other than keep
-this file in the same directory as fparser.cc).
-
- This file contains generated code and is thus not intended to be to
-be modified by hand. It was generated by util/bytecoderules_parser, which
-is available in the development package.
-*/
-#define FP_TRACE_BYTECODE_OPTIMIZATION(srcline,from,to,with) \
- /*std::cout << "Changing \"" from "\"\t(line " #srcline ")\n" \
- " into \"" to "\"\n" with << std::flush*/
-#define FP_TRACE_OPCODENAME(op) \
- (op < VarBegin \
- ? FP_GetOpcodeName(OPCODE(op)) \
- : findName(data->namePtrs,op,NameData<Value_t>::VARIABLE))
-#define FP_TRACE_BYTECODE_ADD(opcode) \
- /*std::cout << "Adding opcode: " << FP_TRACE_OPCODENAME(opcode) \
- << ", bytecode length " << data->ByteCode.size() \
- << ", pointer is " << (void*)ByteCodePtr \
- << ", code is " << (data->ByteCode.empty() \
- ? (void*)0 \
- : (void*)&data->ByteCode[0]) \
- << std::endl*/
-#define q91 wR","aD
-#define q81 w5 wL aY
-#define q71 w5"x"wE
-#define q61 <<", C "oY
-#define q51 q21 aD
-#define q41 q21 wS q21 aF
-#define q31 wR","w9
-#define q21 <<","
-#define q11 wR","aF
-#define q01 "B[B>=VarBegin] "
-#define mZ "= "<<
-#define mY (y dF
-#define mX g0 3]
-#define mW wY" "
-#define mV );g6
-#define mU gU Lqc
-#define mT g8=q7;
-#define mS gU Lnn;
-#define mR x hI oW
-#define mQ cInv:oW
-#define mP "cTan "
-#define mO "cSec "
-#define mN "cCeil"
-#define mM "cDup"
-#define mL oH oW
-#define mK gN oW
-#define mJ "[-x] "
-#define mI "y"wB
-#define mH "y "
-#define mG (x mV
-#define mF ){oW
-#define mE dM>qY oW
-#define mD mT qG d1 g1
-#define mC qF hK:oW
-#define mB "cFloor"
-#define mA "cExp"
-#define m9 hH qC oW
-#define m8 wG wB w2
-#define m7 h1==gF){
-#define m6 wQ"cSub"
-#define m5 wX wB wG
-#define m4 "cSqrt"
-#define m3 "cLess"
-#define m2 wT" "
-#define m1 aX m4
-#define m0 "cMin"
-#define aZ "cMax"
-#define aY "cDiv"
-#define aX wG" "
-#define aW a9" "
-#define aV mA" "
-#define aU "[y*x]"
-#define aT "cPow"
-#define aS "cLog"
-#define aR "cGreater"
-#define aQ "A "wY wE
-#define aP "cCosh"
-#define aO "A[A>=VarBegin]"
-#define aN aO wE
-#define aM aO" "
-#define aL " "wJ"cInv"
-#define aK "cAbsNot"
-#define aJ " cNot"
-#define aI oK B==A mF
-#define aH "cLessOrEq"
-#define aG "cAbs"
-#define aF " "w0
-#define aE " "wM
-#define aD " "wQ oY
-#define aC "[ y+x] "
-#define aB "cRDiv"wB w2
-#define aA " "aT
-#define a9 "cNeg"
-#define a8 =g8 oK qX oW
-#define a7 =g8 oK gK oW
-#define a6 q8 g1
-#define a5 "[-x]"w5
-#define a4 "cLog10"
-#define a3 "cNotNot"
-#define a2 "cLog2"
-#define a1 "cExp2"
-#define a0 "cGreaterOrEq"
-#define wZ "cEqual"
-#define wY "[x]"
-#define wX "cRSub"
-#define wW ==gF){h1 qC oW
-#define wV oC a8
-#define wU w5 aO
-#define wT "cSqr"
-#define wS wB mZ x
-#define wR " "oX
-#define wQ "B "
-#define wP aM aY
-#define wO "B[B==A] "
-#define wN "cNEqual"
-#define wM "with"w9
-#define wL "x[x!=Value_t(0)] "
-#define wK "B[B>=VarBegin] cSub"wB wG
-#define wJ mM" "
-#define wI "x[isInteger(x)]"aA
-#define wH "x[x>Value_t(0)]"
-#define wG "cAdd"
-#define wF wB"A[IsComparisonOpcode(A)]"
-#define wE " "w2
-#define wD "B[IsNeverNegativeValueOpcode(B)] "
-#define wC "x[x==Value_t(1)] "
-#define wB " x "
-#define wA <<"\n"
-#define w9 " A "oY
-#define w8 "B[IsBinaryOpcode(B)&&!HasInvalidRangesOpcode(B)] "oZ
-#define w7 "A[IsNeverNegativeValueOpcode(A)] "
-#define w6 wR"\n"
-#define w5 wE" "
-#define w4 "A[A>=VarBegin&&mData->mByteCode.size()>2] "
-#define w3 "x[x==Value_t(0)] "
-#define w2 "cMul"
-#define w1 FP_TRACE_BYTECODE_ADD
-#define w0 mH mZ y wA
-#define oZ "A[IsBinaryOpcode(A)&&!HasInvalidRangesOpcode(A)] "w3 w2
-#define oY mZ FP_TRACE_OPCODENAME
-#define oX " with"wS<<
-#define oW FP_TRACE_BYTECODE_OPTIMIZATION
-#define oV cLog10
-#define oU cTanh:
-#define oT cSinh:
-#define oS cAbs){
-#define oR *x;qS
-#define oQ qH y*x
-#define oP qH x);
-#define oO qF gC
-#define oN oM gJ
-#define oM q5 Ldl;
-#define oL incStackPtr();g4
-#define oK ;if(
-#define oJ gE oK
-#define oI qO if(
-#define oH hH qO
-#define oG qB oH
-#define oF B h3){
-#define oE =q0 gQ
-#define oD oC oE
-#define oC g7 A
-#define oB tmp-->
-#define oA qD-1)&&x
-#define o9 qD 1)
-#define o8 qQ d1 g1
-#define o7 qH qD
-#define o6 hV gH
-#define o5 Lcf;
-#define o4 qA h4
-#define o3 2;qJ
-#define o2 cPow
-#define o1 cTan
-#define o0 Lap;
-#define dZ fp_pow(
-#define dY hB qS 3
-#define dX cGreater
-#define dW qN 3]qO
-#define dV cRDiv:
-#define dU qR A);
-#define dT cNEqual
-#define dS cLess:
-#define dR cEqual
-#define dQ gX 1)){
-#define dP h1 hM
-#define dO .size()
-#define dN cRSub
-#define dM if(x
-#define dL Default6
-#define dK Default5
-#define dJ Default2
-#define dI Default1
-#define dH mImmed
-#define dG fp_log(
-#define dF dD Lba;
-#define dE cGreaterOrEq
-#define dD ,x gU
-#define dC cExp2
-#define dB cNotNot
-#define dA fp_log10(
-#define d9 cAbs);
-#define d8 fp_abs(x)
-#define d7 gZ]qC
-#define d6 [0]=cDup;
-#define d5 qL cAdd);
-#define d4 cLessOrEq
-#define d3 qU 2){
-#define d2 cAbs:
-#define d1 gF);
-#define d0 fp_log2(
-#define hZ q7:gI
-#define hY h7 hZ
-#define hX cSinCos
-#define hW 0.5)){
-#define hV }if(
-#define hU 4 qR d1
-#define hT Default4;h7
-#define hS pop_back();
-#define hR mData->
-#define hQ switch(
-#define hP Value_t
-#define hO gZ gS
-#define hN qI q7 gU
-#define hM ==cDup){
-#define hL 3]hM
-#define hK cSqr
-#define hJ hV x==
-#define hI ==o9){
-#define hH qN 1]
-#define hG g5 y+x;qS
-#define hF TailCall_cTan
-#define hE TailCall_cSub
-#define hD TailCall_cNeg
-#define hC unsigned
-#define hB q9 2;oB 0;)
-#define hA q9 o3 q0-=2;
-#define h9 hO hI
-#define h8 dD o0
-#define h7 case
-#define h6 ,y gU Lba;
-#define h5 cAdd:
-#define h4 cDup:
-#define h3 >=VarBegin
-#define h2 isEvenInteger(
-#define h1 qN 2]
-#define h0 =q0[0]oK
-#define gZ if(q0[0
-#define gY oC h0
-#define gX hJ qD
-#define gW fp_const_deg_to_rad<hP>()){
-#define gV fp_const_rad_to_deg<hP>()){
-#define gU );q5
-#define gT ,y gU o0
-#define gS ]qC dM
-#define gR h7 gF:qN 1 gS>qY
-#define gQ [0];qV
-#define gP gO oF
-#define gO B=oJ
-#define gN gO B==A){
-#define gM gQ){qP h4 gN
-#define gL DegreesToRadians(x);
-#define gK IsLogicalOpcode(A)){
-#define gJ }break;
-#define gI y=q2[-1];
-#define gH IsUnaryOpcode(
-#define gG IsAlwaysIntegerOpcode(A)){
-#define gF cMul
-#define gE g0 2]
-#define gD hQ gE){h7
-#define gC cNeg:
-#define gB q2[0]=
-#define gA gB-x;
-#define g9 IsNeverNegativeValueOpcode(B)){
-#define g8 g0 1]
-#define g7 default:
-#define g6 return;
-#define g5 q2[-1]=
-#define g4 --mStackPtr;q5
-#define g3 &&!HasInvalidRangesOpcode(
-#define g2 hR mByteCode
-#define g1 opcode=
-#define g0 q0[-
-#define qZ FP_ReDefinePointers();
-#define qY qD 0)){
-#define qX IsNeverNegativeValueOpcode(A)){
-#define qW g2 q6 q5
-#define qV if(A h3
-#define qU &&g2 dO>
-#define qT hR dH q6
-#define qS qT q9
-#define qR ;oB q3 q1
-#define qQ q9 2 qR
-#define qP hQ g8){h7
-#define qO ==q7){gI
-#define qN if(g0
-#define qM if(!q0){q4
-#define qL AddFunctionOpcode(
-#define qK q5 Default0;
-#define qJ oB q3 hS
-#define qI g2.push_back(
-#define qH hR dH.push_back(
-#define qG g2.q1
-#define qF gJ h7
-#define qE }}qK
-#define qD hP(
-#define qC ==q7){x=q2[0];
-#define qB h7 q7:x=q2[0];
-#define qA hQ q0[0]){h7
-#define q9 for(hC tmp=
-#define q8 g2 q6 q0-=1;
-#define q7 cImmed
-#define q6 .hS
-#define q5 goto
-#define q4 q5 Laa;}h7
-#define q3 0;)g2.
-#define q2 ImmedPtr
-#define q1 hS qL
-#define q0 ByteCodePtr
-hC*q0;hP*q2;
-#define FP_ReDefinePointers() q0=!g2.empty()?&g2[0]+g2 dO-1:0;q2=!hR dH.empty()?&hR dH[0]+hR dH dO-1:0;
-qZ
-w1(opcode);
-#if(!FP_FLOAT_VERSION)
-hP
-x;hC
-A;hP
-y;hC
-B;hC
-C;hC
-D;hQ
-opcode){TailCall_cAbs:qM
-d2
-qA
-gC
-oW(246,aW
-aG,aG,);q5
-Lab;qB
-oW(48,"x "
-aG,"[fp_abs(x)]"
-,w6);q5
-Lac;gY
-qX
-oW(307,w7
-aG,"A"
-,aE(A)wA);g6
-qE
-TailCall_cAdd:qM
-h5
-o4
-qP
-h5
-dP
-oW(194,wJ
-aX
-wJ
-wG,"[Value_t(4)]"
-wE,);q5
-Lad;qF
-gF:h1==cAdd){qN
-hL
-oW(195,wJ
-wG
-w5
-wJ
-wG,w2" [Value_t(4)]"
-wE,);q5
-Lae;}
-gJ}
-q5
-dI;h7
-gF:hH
-qC
-dP
-oW(197,wJ"x"
-w5
-wG,"[x+Value_t(1)]"
-wE,w6);q5
-Laf;}
-}
-q5
-dI;h7
-gC
-oW(253,aW
-wG,"cSub"
-,);q5
-Lag;qB
-qP
-h5
-h1
-qO
-oW(187,mH
-wG
-wB
-wG,"[y+x] "
-wG,q11);q5
-Lah;qF
-dN:gD
-h5
-dW
-oW(129,mH
-aX
-m5,aC
-aX
-wX,q11);q5
-Lai;oO
-oW(130,aW
-m5,mJ
-aX
-wX,w6);q5
-Laj;hY
-oW(128,mH
-m5,aC
-wX,q11);q5
-Lak;qF
-cSub:gP
-hQ
-mX){h7
-h5
-qN
-4]qO
-oW(123,mH
-aX
-wK,aC
-aX
-m6,q91(B)q21
-aF);q5
-Lal;oO
-oW(124,aW
-wK,mJ
-aX
-m6,q91(B)wA);q5
-Lam;hY
-oW(122,mH
-wK,aC
-m6,q91(B)q21
-aF);q5
-Lan;}
-qF
-hZ
-oW(84,mI
-wG,"[y+x]"
-,q11);q5
-Lao;hJ
-qY
-oW(83,w3
-wG,,w6);q5
-o0
-gJ
-g7
-dI:;A
-oE){hH==dN){h1
-qC
-oW(121,"x "
-wX" "
-aM
-wG,"[DO_STACKPLUS1] A "
-mW
-aX
-wX,aE(A)q21
-wS
-wA);oL
-Laq;}
-oW(126,wX" "
-aM
-wG,"[DO_STACKPLUS1] A "
-aX
-wX,aE(A)wA);oL
-Lba;}
-qE
-TailCall_cAnd:qM
-cAnd:o4
-oW(426,wJ"cAnd"
-,a3,);q5
-Lbb;oG
-oW(177,mI"cAnd"
-,"[fp_and(x,y)]"
-,q11);q5
-Lbc;gJ}
-qK
-TailCall_cCos:qM
-cCos:A
-oE
-d3
-qP
-cSec:mK(434,wO
-mO
-w4"cCos"
-,wQ"cSec"
-aL,aE(A)q51(B)wA);q5
-Lbd;qF
-cSin:mK(428,wO"cSin "
-w4"cCos"
-,wQ"cSinCos"
-,aE(A)q51(B)wA);q5
-Lbe;gJ
-qE
-TailCall_cCot:qM
-cCot:A
-oE
-d3
-hH==o1){mK(432,wO
-mP
-w4"cCot"
-,wQ"cTan"
-aL,aE(A)q51(B)wA);q5
-Lbd;}
-qE
-TailCall_cCsc:qM
-cCsc:A
-oE
-d3
-hH==cSin){mK(430,wO"cSin "
-w4"cCsc"
-,wQ"cSin"
-aL,aE(A)q51(B)wA);q5
-Lbd;}
-qE
-TailCall_cDiv:qM
-cDiv:o4
-oW(167,wJ
-aY,"[Value_t(0)]"
-w5"[Value_t(1)] "
-wG,);q5
-Lbf;h7
-hX:oW(436,"cSinCos "
-aY,"cTan"
-,);q5
-Lbg;qB
-dM!=qY
-qP
-gC
-oW(185,aW
-wL
-aY,mJ
-aY,w6);q5
-Lbh;hY
-oW(81,mH
-wL
-aY,"[y/x]"
-,q11);q5
-Lbi;}
-dQ
-oW(80,wC
-aY,,w6);q5
-o0
-gJ}
-qK
-TailCall_cEqual:qM
-dR:h9
-A
-a7(335,"A[IsLogicalOpcode(A)] "
-wC
-wZ,"A"
-,q31(A)wA);q5
-o0}
-}
-mL(175,mI
-wZ,"[fp_equal(y,x)]"
-,q11);q5
-Lbj;hJ
-qY
-qP
-d2
-oW(265,aG" "
-w3
-wZ,mW
-wZ,w6);q5
-Lbk;h7
-hK:oW(267,m2
-w3
-wZ,mW
-wZ,w6);q5
-Lbk;}
-oW(325,w3
-wZ,"cNot"
-,w6);q5
-Lbl;qE
-TailCall_cGreater:qM
-dX:hO==qY
-qP
-d2
-oW(327,aG" "
-w3
-aR,a3,w6);q5
-Lbm;wV(331,w7
-w3
-aR,"A "
-a3,q31(A)wA);q5
-Lbn;}
-}
-}
-mL(173,mI
-aR,"[fp_less(x,y)]"
-,q11);q5
-Lbo;qE
-TailCall_cGreaterOrEq:qM
-dE:h9
-qP
-d2
-oW(328,aG" "
-wC
-a0,a3,w6);q5
-Lbm;wV(332,w7
-wC
-a0,"A "
-a3,q31(A)wA);q5
-Lbn;}
-}
-}
-mL(174,mI
-a0,"[fp_lessOrEq(x,y)]"
-,q11);q5
-Lbp;qE
-TailCall_cInv:qM
-cInv:qA
-cSqrt:oW(75,m4" cInv"
-,"cRSqrt"
-,);q5
-Lbq;qB
-dM!=qY
-oW(77,wL"cInv"
-,"[Value_t(1)/x]"
-,w6);q5
-Lca;gJ}
-qK
-TailCall_cLess:qM
-dS
-hO==qY
-A
-a8(132,w7
-w3
-m3,aQ,q31(A)wA);q5
-Lcb;}
-dQ
-qP
-d2
-oW(329,aG" "
-wC
-m3,"cNot"
-,w6);q5
-Lcc;wV(333,w7
-wC
-m3,"A"
-aJ,q31(A)wA);q5
-Lbl;}
-}
-}
-mL(171,mI
-m3,"[fp_less(y,x)]"
-,q11);q5
-Lcd;qE
-TailCall_cLessOrEq:qM
-d4:hO==qY
-qP
-d2
-oW(330,aG" "
-w3
-aH,"cNot"
-,w6);q5
-Lcc;wV(334,w7
-w3
-aH,"A"
-aJ,q31(A)wA);q5
-Lbl;}
-}
-}
-mL(172,mI
-aH,"[fp_lessOrEq(y,x)]"
-,q11);q5
-Lce;qE
-TailCall_cMax:qM
-cMax:o4
-oW(157,wJ
-aZ,,);q5
-o5
-oG
-oW(90,mI
-aZ,"[fp_max(x,y)]"
-,q11);q5
-Lcg;gJ
-oC=q0
-gM
-oW(159,wO
-wJ
-aM
-aZ,wQ
-mM,aE(A)q51(B)wA);q5
-o5
-qF
-cMax:mK(161,wO
-aZ" "
-aM
-aZ,wQ
-aZ,aE(A)q51(B)wA);q5
-o5
-gJ}
-qE
-TailCall_cMin:qM
-cMin:o4
-oW(156,wJ
-m0,,);q5
-o5
-oG
-oW(89,mI
-m0,"[fp_min(x,y)]"
-,q11);q5
-Lch;gJ
-oC=q0
-gM
-oW(158,wO
-wJ
-aM
-m0,wQ
-mM,aE(A)q51(B)wA);q5
-o5
-qF
-cMin:mK(160,wO
-m0" "
-aM
-m0,wQ
-m0,aE(A)q51(B)wA);q5
-o5
-gJ}
-qE
-TailCall_cMod:qM
-cMod:hO!=qY
-mL(82,mH
-wL"cMod"
-,"[fp_mod(y,x)]"
-,q11);q5
-Lci;}
-qE
-TailCall_cMul:qM
-gF:o4
-oW(402,mM
-wE,wT,);q5
-Lcj;h7
-gC
-qP
-h4
-oW(394,wJ
-a9
-wE,m2
-a9,);q5
-Lck;oC=g8;qV){m7
-B=mX
-aI(400,"B[B==A]"
-wU" "
-a9
-wE,wQ
-wT
-w5
-a9,aE(A)q51(B)wA);q5
-Lcl;}
-}
-}
-}
-q5
-dJ;h7
-o2:hH
-qC
-dP
-oW(198,mM
-wB
-aT
-wE,"[x+Value_t(1)]"
-aA,w6);q5
-Lcm;}
-}
-q5
-dJ;qB
-dM==qY
-qP
-gF:A=gE;qV
-mF(141,aO
-w5
-w3
-w2,wY
-wE,q31(A)wA);q5
-Lcn;}
-q5
-Default3;g7
-Default3:;A=g8
-oK
-IsBinaryOpcode(A)g3
-A)){gD
-hZ
-oW(140,mH
-oZ,wY
-wE,q31(A)q21
-aF);q5
-Lco;g7
-gO
-IsBinaryOpcode(B)g3
-B)){hQ
-mX){hY
-oW(144,mH
-w8,aQ,q31(A)q51(B)q21
-aF);q5
-Lcp;g7
-C=mX
-oK
-C
-h3
-mF(142,"C[C>=VarBegin] "
-w8,aQ,q31(A)q51(B)q61(C)wA);q5
-Lcq;o6
-C)g3
-C)mF(143,"C[IsUnaryOpcode(C)&&!HasInvalidRangesOpcode(C)] "
-w8,wQ
-aQ,q31(A)q51(B)q61(C)wA);q5
-Lda;}
-}
-hV
-oF
-oW(138,q01
-oZ,wY
-wE,q31(A)q51(B)wA);q5
-Lcn;o6
-B)g3
-B)mF(139,"B[IsUnaryOpcode(B)&&!HasInvalidRangesOpcode(B)] "
-oZ,aQ,q31(A)q51(B)wA);q5
-Ldb;}
-}
-}
-qV
-mF(136,aM
-w3
-w2,wY,q31(A)wA);q5
-Ldc;o6
-A)g3
-A)mF(137,"A[IsUnaryOpcode(A)&&!HasInvalidRangesOpcode(A)] "
-w3
-w2,wY
-wE,q31(A)wA);q5
-Ldd;}
-}
-}
-qP
-h5
-gD
-h4
-oW(203,wJ
-m8,"[x+x]"
-wE,w6);q5
-Lde;h7
-gF:dW
-A=g0
-4];qV
-mF(292,aM"y"
-w5
-m8,wY
-w5"A "
-aU
-w5
-wG,wR", "
-mH
-mZ
-y
-q21
-w9(A)wA);q5
-Ldf;}
-qF
-hZ
-oW(291,mH
-m8,wY
-w5
-aU" "
-wG,q11);q5
-Ldg;qF
-gF:gD
-h5
-qN
-hL
-oW(205,wJ
-wG
-q71,w2" [x+x]"
-wE,w6);q5
-Ldh;qF
-hZ
-if(y*mR(192,"y[y*x==Value_t(1)]"
-q71,,q11);q5
-Ldi;}
-oW(193,"y"
-q71,aU
-wE,q11);q5
-Ldj;oO
-oW(182,a9
-wB
-w2,"[-x]"
-wE,w6);q5
-Ldk;h7
-cSub:m7
-dW
-A=g0
-4];qV
-mF(293,aM"y"
-w5"cSub"
-wB
-w2,wY
-w5"A "
-aU
-w5"cSub"
-,wR", "
-mH
-mZ
-y
-q21
-w9(A)wA);oM}
-}
-qF
-hZ
-oW(79,mI
-w2,aU,q11);q5
-Ldm;dQ
-oW(78,wC
-w2,,w6);q5
-o0
-gX
-2)mF(146,"x[x==Value_t(2)]"
-wE,wJ
-wG,w6);q5
-Ldn;gX-1)mF(184,"x[x==Value_t(-1)]"
-wE,a9,w6);q5
-Ldo;gJ
-g7
-dJ:;A
-oE){qP
-gF:gD
-gC
-B=mX
-aI(397,wO
-a9
-wU
-wE,wQ
-wT
-w5
-a9,aE(A)q51(B)wA);q5
-Lcl;}
-q5
-Default4;g7
-Default4:;mK(388,"B[B==A]"
-wU
-wE,wQ
-wT
-wE,aE(A)q51(B)wA);q5
-Ldp;}
-}
-q5
-dK;h7
-gC
-mK(391,wO
-aW
-aN,wQ
-m2
-a9,aE(A)q51(B)wA);q5
-Lck;}
-q5
-dK;g7
-dK:;B=g8
-aI(385,wO
-aN,wQ
-wT,aE(A)q51(B)wA);q5
-Lcj;}
-}
-o6
-A)){B=g8
-oK
-B
-h3
-qU
-1){m7
-C=mX
-oK
-C==A){D=g0
-4]oK
-D==B
-mF(408,"D[D==B] C[C==A]"
-w5"B[B>=VarBegin&&mData->mByteCode.size()>1] A[IsUnaryOpcode(A)]"
-wE,"D C "
-wT
-wE,aE(A)q51(B)q61(C)<<", D "
-oY(D)wA);q5
-Ldq;}
-}
-}
-}
-qE
-TailCall_cNEqual:qM
-dT:h9
-A
-a7(336,"A[IsLogicalOpcode(A)] "
-wC
-wN,"A"
-aJ,q31(A)wA);q5
-Lbl;}
-}
-mL(176,mI
-wN,"[fp_nequal(y,x)]"
-,q11);q5
-Lea;hJ
-qY
-qP
-d2
-oW(266,aG" "
-w3
-wN,mW
-wN,w6);q5
-Leb;h7
-hK:oW(268,m2
-w3
-wN,mW
-wN,w6);q5
-Leb;}
-oW(326,w3
-wN,a3,w6);q5
-Lbn;qE
-hD:qM
-gC
-qA
-gF:m9(183,"x"
-w5
-a9,"[-x]"
-wE,w6);q5
-Lec;oO
-oW(248,aW
-a9,,);q5
-o5
-qB
-oW(76,"x "
-a9,"[-x]"
-,w6);q5
-Led;}
-qK
-TailCall_cNot:qM
-cNot:qA
-d2
-oW(296,aG
-aJ,"cNot"
-,);q5
-Lee;h7
-cAbsNot:A
-a7(303,"A[IsLogicalOpcode(A)] "
-aK
-aJ,"A"
-,aE(A)wA);q5
-o5
-hV
-A!=q7
-mF(304,"A[A!=cImmed] "
-aK
-aJ,"A cAbsNotNot"
-,aE(A)wA);q5
-Lef;}
-q5
-dL;h7
-cAbsNotNot:oW(299,"cAbsNotNot"
-aJ,aK,);q5
-Leg;h7
-h5
-m9(338,"x "
-wG
-aJ,mJ
-wZ,w6);q5
-Leh;}
-q5
-dL;h7
-dR:oW(262,wZ
-aJ,wN,);q5
-Lei;h7
-dX:oW(260,aR
-aJ,aH,);q5
-Lej;h7
-dE:oW(261,a0
-aJ,m3,);q5
-Lek;h7
-dS
-oW(258,m3
-aJ,a0,);q5
-Lel;h7
-d4:oW(259,aH
-aJ,aR,);q5
-Lem;h7
-dT:oW(263,wN
-aJ,wZ,);q5
-Len;h7
-gC
-oW(295,a9
-aJ,"cNot"
-,);q5
-Lee;h7
-cNot:oW(297,"cNot"
-aJ,a3,);q5
-Lbb;h7
-dB:oW(298,a3
-aJ,"cNot"
-,);q5
-Lee;qB
-oW(93,"x"
-aJ,"[fp_not(x)]"
-,w6);q5
-Leo;g7
-dL:;A
-h0
-qX
-oW(305,w7"cNot"
-,"A "
-aK,aE(A)wA);q5
-Lep;qE
-TailCall_cNotNot:qM
-dB:qA
-h5
-m9(337,"x "
-aX
-a3,mJ
-wN,w6);q5
-Leq;qF
-cNot:oW(300,"cNot "
-a3,"cNot"
-,);g6}
-qK
-TailCall_cOr:qM
-cOr:o4
-oW(425,wJ"cOr"
-,a3,);q5
-Lbb;oG
-oW(178,mI"cOr"
-,"[fp_or(x,y)]"
-,q11);q5
-Lfa;gJ}
-qK
-TailCall_cRDiv:qM
-dV
-qA
-hX:oW(437,"cSinCos cRDiv"
-,"cCot"
-,);q5
-Lfb;qB
-dM
-hI
-oW(99,wC"cRDiv"
-,"cInv"
-,w6);q5
-Lfc;gJ}
-qK
-TailCall_cRSub:qM
-dN:gZ]hM
-oW(200,wJ
-wX,"[Value_t(0)]"
-wE,);q5
-Lfd;}
-qK
-TailCall_cSec:qM
-cSec:A
-oE
-d3
-qP
-cCos:mK(431,wO"cCos "
-w4"cSec"
-,wQ"cCos"
-aL,aE(A)q51(B)wA);q5
-Lbd;qF
-cSin:mK(429,wO"cSin "
-w4"cSec"
-,wQ"cSinCos cInv"
-,aE(A)q51(B)wA);q5
-Lfe;gJ
-qE
-TailCall_cSin:qM
-cSin:A
-oE
-d3
-hH==cCsc){mK(433,wO"cCsc "
-w4"cSin"
-,wQ"cCsc"
-aL,aE(A)q51(B)wA);q5
-Lbd;}
-qE
-TailCall_cSqr:qM
-hK:qA
-d2
-oW(404,aG" "
-wT,wT,);q5
-Lff;h7
-gC
-oW(403,aW
-wT,wT,);q5
-Lff;}
-qK
-TailCall_cSqrt:qM
-cSqrt:gZ]==cAdd){hH==hK){A=gE;qV){qN
-3]==hK
-mF(439,m2
-aM
-m2
-m1,"A cHypot"
-,aE(A)wA);q5
-Lfg;}
-}
-gO
-gH
-B)){A=mX;qV){qN
-4]==hK
-mF(440,m2
-aM"B[IsUnaryOpcode(B)] "
-m2
-m1,"A "
-wQ"cHypot"
-," with"
-aD(B)q21
-w9(A)wA);q5
-Lfh;}
-}
-}
-qE
-hE:qM
-cSub:o4
-oW(199,wJ"cSub"
-,"[Value_t(0)]"
-wE,);q5
-Lfd;h7
-gC
-oW(254,aW"cSub"
-,wG,);q5
-Lfi;qB
-dM==qY
-oW(85,w3"cSub"
-,,w6);q5
-o0}
-mL(86,mI"cSub"
-,"[y-x]"
-,q11);q5
-Lfj;}
-oW(216,"x cSub"
-,mJ
-wG,w6);q5
-Lfk;oD){hH==dN){h1
-qC
-oW(120,"x "
-wX" "
-aM"cSub"
-,"A "
-aX
-mW
-wX,aE(A)q21
-wS
-wA);q5
-Lfl;}
-oW(127,wX" "
-aM"cSub"
-,"[DO_STACKPLUS1] A cSub "
-wX,aE(A)wA);oL
-Lfm;}
-qE
-hF:qM
-o1:A
-oE
-d3
-hH==cCot){mK(435,wO"cCot "
-w4"cTan"
-,wQ"cCot"
-aL,aE(A)q51(B)wA);q5
-Lbd;}
-qE
-g7
-Default0:;A=opcode
-oK
-IsComparisonOpcode(A)){d7
-qP
-h5
-h1
-qO
-oW(270,mH
-wG
-wF,"[x-y] A"
-,aE(A)q41);q5
-Lfn;oO
-oW(271,a9
-wF,mJ"{OppositeComparisonOpcode(A)}"
-,aE(A)q21
-wS
-wA);q5
-Lfo;}
-}
-}
-qV
-qU
-0){B
-h0
-B==A
-mF(406,wO"A[A>=VarBegin&&mData->mByteCode.size()>0]"
-,wQ
-mM,aE(A)q51(B)wA);q5
-Lfp;}
-o6
-A)){B
-h0
-B
-h3
-qU
-1){C=g8
-oK
-C==A){D=oJ
-D==B
-mF(407,"D[D==B] C[C==A] B[B>=VarBegin&&mData->mByteCode.size()>1] A[IsUnaryOpcode(A)]"
-,"D C "
-mM,aE(A)q51(B)q61(C)<<", D "
-oY(D)wA);q5
-Lfq;}
-}
-}
-}
-}
-q5
-Laa;Laa:qI
-opcode
-mV
-Lab:q8
-w1(cAbs);q5
-TailCall_cAbs;Lac:gB
-d8;g6
-Lad:o7
-4));gE=q7;hA
-Lga:g1
-gF;Lgb:qZ
-Lgc:w1(cMul);q5
-TailCall_cMul;Lae:q9
-hU
-o7
-4));hN
-Lga;Laf:gB
-x+o9;gE=q7;hA
-Lcb:g1
-gF;q5
-Lgc;Lag:a6
-cSub;Lgd:w1(cSub);q5
-hE;Lah:hG
-o3
-Lge:qZ
-Lgf:w1(cAdd);q5
-TailCall_cAdd;Lai:hG
-3;qJ
-Lgg:d5
-Lgh:g1
-dN;qZ
-w1(cRSub);q5
-TailCall_cRSub;Laj:gA
-gE=q7;q9
-o3
-q5
-Lgg;Lak:hG
-o3
-q5
-Lgh;Lal:hG
-4;qJ
-Lgi:d5
-Lgj:qL
-B);Lgk:g1
-cSub;qZ
-q5
-Lgd;Lam:gA
-mX=q7;q9
-3;qJ
-q5
-Lgi;Lan:hG
-3;qJ
-q5
-Lgj;Lao:g5
-y+x;Lap:qT
-Lcf:g2
-q6
-g6
-Laq:qS
-3
-dU
-oP
-hN
-Lgg;Lba:qQ
-A
-gU
-Lgg;Lbb:a6
-dB;Lgl:w1(cNotNot);q5
-TailCall_cNotNot;Lbc:g5
-fp_and(x
-gT
-Lbd:q0
-d6
-g1
-cInv;Lgm:w1(cInv);q5
-TailCall_cInv;Lbe:qQ
-hX
-mV
-Lbf:o7
-0));q0[0]=q7;qL
-d1
-o7
-1));Lgn:qI
-q7);Lgo:g1
-cAdd;q5
-Lge;Lbg:a6
-o1;w1(cTan);q5
-hF;Lbh:gA
-mT
-q8
-w1(cDiv);q5
-TailCall_cDiv;Lbi:g5
-y/x;q5
-o0
-Lbj:g5
-fp_equal(y
-h8
-Lbk:mT
-q8
-Lgp:w1(cEqual);q5
-TailCall_cEqual;Lbl:qT
-g2
-q6
-Lgq:g1
-cNot;qZ
-Lha:w1(cNot);q5
-TailCall_cNot;Lbm:qS
-o3
-Lhb:g1
-dB;qZ
-q5
-Lgl;Lbn:qT
-qW
-Lhb;Lbo:g5
-fp_less(x
-gT
-Lbp:g5
-fp_lessOrEq(x
-gT
-Lbq:qG
-cRSqrt
-mV
-Lca:gB
-o9/x;g6
-Lcc:qS
-o3
-q5
-Lgq;Lcd:g5
-fp_less(y
-h8
-Lce:g5
-fp_lessOrEq(y
-h8
-Lcg:g5
-fp_max(x
-gT
-Lch:g5
-fp_min(x
-gT
-Lci:g5
-fp_mod(y
-h8
-Lcj:a6
-hK;Lhc:w1(cSqr);q5
-TailCall_cSqr;Lck:qQ
-hK);Lhd:g1
-cNeg;qZ
-w1(cNeg);q5
-hD;Lcl:q9
-3
-qR
-hK);qL
-gF
-gU
-Lhd;Lcm:gB
-x+o9;gE=q7;qQ
-o2
-mV
-Lcn:gE=q7;hA
-q5
-Lgc;Lco:g5
-x;Lhe:qS
-o3
-q5
-Lgb;Lcp:hB
-qT
-Lhf:q9
-4;qJ
-Lhg:qL
-A);oP
-Lhh:hN
-Lgb;Lcq:qT
-q5
-Lhf;Lda:qS
-4
-qR
-B
-gU
-Lhg;Ldb:qS
-3;qJ
-q5
-Lhg;Ldc:mT
-q5
-o5
-Ldd:mT
-q8
-q5
-Lgc;Lde:gB
-x+x;q5
-Lcn;Ldf:g5
-x;g0
-4]=q7;qS
-hU
-qL
-A);oQ);qI
-q7);qL
-gF
-gU
-Lgo;Ldg:g5
-x;qT
-qQ
-d1
-oQ
-gU
-Lgn;Ldh:qS
-hU
-qH
-x+x
-gU
-Lhh;Ldi:dY;qJ
-g6
-Ldj:g5
-y*x;q5
-Lhe;Ldk:gA
-q5
-Ldd;Ldl:g5
-x;g0
-4]=q7;qS
-hU
-qL
-A);oQ);qI
-q7);qL
-gF
-gU
-Lgk;Ldm:g5
-y*x;q5
-o0
-Ldn:q0
-d6
-q2-=1;qT
-Lhi:g1
-cAdd;q5
-Lgf;Ldo:qT
-qW
-Lhd;Ldp:q9
-o3
-Lhj:qL
-hK
-gU
-Lgb;Ldq:q9
-3;qJ
-q5
-Lhj;Lea:g5
-fp_nequal(y
-h8
-Leb:mT
-q8
-Lhk:w1(cNEqual);q5
-TailCall_cNEqual;Lec:gA
-q8
-q5
-Lcb;Led:gA
-g6
-Lee:q8
-q5
-Lha;Lef:qG
-cAbsNotNot
-mV
-Leg:g2
-q6
-Lep:qL
-cAbsNot
-mV
-Leh:gA
-Len:a6
-dR;q5
-Lgp;Lei:a6
-dT;q5
-Lhk;Lej:a6
-d4;w1(cLessOrEq);q5
-TailCall_cLessOrEq;Lek:a6
-cLess;w1(cLess);q5
-TailCall_cLess;Lel:a6
-dE;w1(cGreaterOrEq);q5
-TailCall_cGreaterOrEq;Lem:a6
-dX;w1(cGreater);q5
-TailCall_cGreater;Leo:gB
-fp_not
-mG
-Leq:gA
-q5
-Lei;Lfa:g5
-fp_or(x
-gT
-Lfb:a6
-cCot;w1(cCot);q5
-TailCall_cCot;Lfc:qT
-g2
-q6
-Lhl:g1
-cInv;qZ
-q5
-Lgm;Lfd:o7
-0));q0[0]=q7;q5
-Lga;Lfe:qQ
-hX
-gU
-Lhl;Lff:q8
-q5
-Lhc;Lfg:q9
-4
-dU
-Lhm:qL
-cHypot
-mV
-Lfh:q9
-5
-dU
-qL
-B
-gU
-Lhm;Lfi:q8
-q5
-Lhi;Lfj:g5
-y-x;q5
-o0
-Lfk:gA
-q5
-Lhi;Lfl:qS
-3
-dU
-d5
-oP
-hN
-Lgh;Lfm:qQ
-A);qL
-cSub
-gU
-Lgh;Lfn:g5
-x-y;qT
-qQ
-A
-mV
-Lfo:gA
-mT
-qG
-OppositeComparisonOpcode(A)mV
-Lfp:qI
-cDup
-mV
-Lfq:q0
-d6
-g6
-g6
-q5
-TailCall_cAnd;q5
-TailCall_cCos;q5
-TailCall_cCsc;q5
-TailCall_cMax;q5
-TailCall_cMin;q5
-TailCall_cMod;q5
-hD;q5
-TailCall_cOr;q5
-TailCall_cRDiv;q5
-TailCall_cSec;q5
-TailCall_cSin;q5
-TailCall_cSqrt;q5
-hE;q5
-hF;
-#endif
-#if(FP_FLOAT_VERSION)
-hP
-x;hC
-A;hP
-y;hC
-B;hC
-C;hC
-D;hQ
-opcode){TailCall_cAbs:qM
-d2
-qA
-gC
-oW(246,aW
-aG,aG,);q5
-Lab;qB
-oW(48,"x "
-aG,"[fp_abs(x)]"
-,w6);q5
-Lac;gY
-qX
-oW(307,w7
-aG,"A"
-,aE(A)wA);g6
-qE
-TailCall_cAcos:qM
-cAcos:hO>=oA<=o9
-mF(52,"x[x>=Value_t(-1)&&x<=Value_t(1)] cAcos"
-,"[fp_acos(x)]"
-,w6);q5
-Lad;qE
-TailCall_cAcosh:qM
-cAcosh:hO>=o9
-mF(49,"x[x>=Value_t(1)] cAcosh"
-,"[fp_acosh(x)]"
-,w6);q5
-Lae;qE
-TailCall_cAdd:qM
-h5
-o4
-qP
-h5
-dP
-oW(194,wJ
-aX
-wJ
-wG,"[Value_t(4)]"
-wE,);q5
-Laf;qF
-gF:h1==cAdd){qN
-hL
-oW(195,wJ
-wG
-w5
-wJ
-wG,w2" [Value_t(4)]"
-wE,);q5
-Lag;}
-gJ}
-q5
-dI;h7
-gF:hH
-qC
-dP
-oW(197,wJ"x"
-w5
-wG,"[x+Value_t(1)]"
-wE,w6);q5
-Lah;}
-}
-q5
-dI;h7
-gC
-oW(253,aW
-wG,"cSub"
-,);q5
-Lai;qB
-qP
-h5
-h1
-qO
-oW(187,mH
-wG
-wB
-wG,"[y+x] "
-wG,q11);q5
-Laj;qF
-dN:gD
-h5
-dW
-oW(129,mH
-aX
-m5,aC
-aX
-wX,q11);q5
-Lak;oO
-oW(130,aW
-m5,mJ
-aX
-wX,w6);q5
-Lal;hY
-oW(128,mH
-m5,aC
-wX,q11);q5
-Lam;qF
-cSub:gP
-hQ
-mX){h7
-h5
-qN
-4]qO
-oW(123,mH
-aX
-wK,aC
-aX
-m6,q91(B)q21
-aF);q5
-Lan;oO
-oW(124,aW
-wK,mJ
-aX
-m6,q91(B)wA);q5
-Lao;hY
-oW(122,mH
-wK,aC
-m6,q91(B)q21
-aF);q5
-o0}
-qF
-hZ
-oW(84,mI
-wG,"[y+x]"
-,q11);q5
-Laq;hJ
-qY
-oW(83,w3
-wG,,w6);q5
-Lba;gJ
-g7
-dI:;A
-oE){hH==dN){h1
-qC
-oW(121,"x "
-wX" "
-aM
-wG,"[DO_STACKPLUS1] A "
-mW
-aX
-wX,aE(A)q21
-wS
-wA);oL
-Lbb;}
-oW(126,wX" "
-aM
-wG,"[DO_STACKPLUS1] A "
-aX
-wX,aE(A)wA);oL
-Lbc;}
-qE
-TailCall_cAnd:qM
-cAnd:o4
-oW(426,wJ"cAnd"
-,a3,);q5
-Lbd;oG
-oW(177,mI"cAnd"
-,"[fp_and(x,y)]"
-,q11);q5
-Lbe;gJ}
-qK
-TailCall_cAsin:qM
-cAsin:hO>=oA<=o9
-mF(53,"x[x>=Value_t(-1)&&x<=Value_t(1)] cAsin"
-,"[fp_asin(x)]"
-,w6);q5
-Lbf;qE
-TailCall_cAsinh:qM
-cAsinh:d7
-oW(50,"x cAsinh"
-,"[fp_asinh(x)]"
-,w6);q5
-Lbg;}
-qK
-TailCall_cAtan:qM
-cAtan:d7
-oW(54,"x cAtan"
-,"[fp_atan(x)]"
-,w6);q5
-Lbh;}
-qK
-TailCall_cAtan2:qM
-cAtan2:d7
-mL(91,mI"cAtan2"
-,"[fp_atan2(y,x)]"
-,q11);q5
-Lbi;qE
-TailCall_cAtanh:qM
-cAtanh:hO>oA<o9
-mF(51,"x[x>Value_t(-1)&&x<Value_t(1)] cAtanh"
-,"[fp_atanh(x)]"
-,w6);q5
-Lbj;qE
-TailCall_cCbrt:qM
-cCbrt:d7
-oW(55,"x cCbrt"
-,"[fp_cbrt(x)]"
-,w6);q5
-Lbk;}
-qK
-TailCall_cCeil:qM
-cCeil:qA
-gC
-oW(316,aW
-mN,mB" "
-a9,);q5
-Lbl;qB
-oW(56,"x "
-mN,"[fp_ceil(x)]"
-,w6);q5
-Lbm;gY
-gG
-oW(310,"A[IsAlwaysIntegerOpcode(A)] "
-mN,"A"
-,aE(A)wA);g6
-qE
-TailCall_cCos:qM
-cCos:qA
-d2
-oW(351,aG" cCos"
-,"cCos"
-,);q5
-Lbn;h7
-gC
-oW(353,aW"cCos"
-,"cCos"
-,);q5
-Lbn;qB
-oW(57,"x cCos"
-,"[fp_cos(x)]"
-,w6);q5
-Lbo;oD
-d3
-qP
-cSec:mK(434,wO
-mO
-w4"cCos"
-,wQ"cSec"
-aL,aE(A)q51(B)wA);q5
-Lbp;qF
-cSin:mK(428,wO"cSin "
-w4"cCos"
-,wQ"cSinCos"
-,aE(A)q51(B)wA);q5
-Lbq;gJ}
-qE
-TailCall_cCosh:qM
-cCosh:qA
-d2
-oW(352,aG" "
-aP,aP,);q5
-Lca;h7
-cAsinh:oW(365,"cAsinh "
-aP,"[DO_STACKPLUS1] "
-m2"[Value_t(1)] "
-m1,);oL
-Lcb;h7
-gC
-oW(354,aW
-aP,aP,);q5
-Lca;qB
-oW(58,"x "
-aP,"[fp_cosh(x)]"
-,w6);q5
-Lcc;}
-qK
-TailCall_cCot:qM
-cCot:A
-oE
-d3
-hH==o1){mK(432,wO
-mP
-w4"cCot"
-,wQ"cTan"
-aL,aE(A)q51(B)wA);q5
-Lbp;}
-qE
-TailCall_cCsc:qM
-cCsc:A
-oE
-d3
-hH==cSin){mK(430,wO"cSin "
-w4"cCsc"
-,wQ"cSin"
-aL,aE(A)q51(B)wA);q5
-Lbp;}
-qE
-TailCall_cDeg:qM
-cDeg:d7
-oW(73,"x cDeg"
-,"[RadiansToDegrees(x)]"
-,w6);q5
-Lcd;}
-qK
-TailCall_cDiv:qM
-cDiv:qA
-cCos:oW(368,"cCos "
-aY,"cSec"
-wE,);q5
-Lce;h7
-cCot:oW(372,"cCot "
-aY,"cTan"
-wE,);q5
-o5
-h7
-cCsc:oW(370,"cCsc "
-aY,"cSin"
-wE,);q5
-Lcg;h7
-h4
-oW(167,wJ
-aY,"[Value_t(0)]"
-w5"[Value_t(1)] "
-wG,);q5
-Lch;h7
-cExp:oW(322,aV
-aY,aW
-mA
-wE,);q5
-Lci;h7
-dC:oW(323,a1" "
-aY,aW
-a1
-wE,);q5
-Lcj;h7
-mQ(251,"cInv "
-aY,w2,);q5
-Lck;h7
-o2:oW(321,aT" "
-aY,a9
-aA
-wE,);q5
-Lcl;h7
-cSec:oW(371,mO
-aY,"cCos"
-wE,);q5
-Lcm;h7
-cSin:oW(367,"cSin "
-aY,"cCsc"
-wE,);q5
-Lcn;h7
-hX:oW(436,"cSinCos "
-aY,"cTan"
-,);q5
-Lco;h7
-o1:oW(369,mP
-aY,"cCot"
-wE,);q5
-Lcp;qB
-dM
-hI
-oW(80,wC
-aY,,w6);q5
-Lba;hV
-x!=qY
-qP
-gF:h1
-oI(y/x)==gV
-oW(207,"y[(y/x)==fp_const_rad_to_deg<Value_t>()]"
-q81,"cDeg"
-,q11);q5
-Lcq;hV(y/x)==gW
-oW(208,"y[(y/x)==fp_const_deg_to_rad<Value_t>()]"
-q81,"cRad"
-,q11);q5
-Lda;}
-oW(209,"y"
-q81,"[y/x]"
-wE,q11);q5
-Ldb;oO
-oW(185,aW
-wL
-aY,mJ
-aY,w6);q5
-Ldc;hY
-oW(81,mH
-wL
-aY,"[y/x]"
-,q11);q5
-Ldd;}
-oW(211,wL
-aY,"[Value_t(1)/x]"
-wE,w6);q5
-Lde;gJ
-oD){qP
-cDiv:gP
-oW(102,q01
-aY" "
-wP,"[DO_STACKPLUS1] "
-wQ"A"
-w5
-aY,aE(A)q51(B)wA);oL
-Ldf;qF
-dV
-hQ
-gE){qB
-oW(97,"x cRDiv "
-wP,"A"
-w5
-mW"cRDiv"
-,aE(A)q21
-wS
-wA);q5
-Ldg;g7
-gP
-oW(96,"B[B>=VarBegin] cRDiv "
-wP,"A"
-w5
-wQ"cRDiv"
-,aE(A)q51(B)wA);q5
-Ldh;}
-gJ}
-qE
-TailCall_cEqual:qM
-dR:hO==qY
-qP
-d2
-oW(265,aG" "
-w3
-wZ,mW
-wZ,w6);q5
-Ldi;h7
-hK:oW(267,m2
-w3
-wZ,mW
-wZ,w6);q5
-Ldi;}
-}
-mL(175,mI
-wZ,"[fp_equal(y,x)]"
-,q11);q5
-Ldj;qE
-TailCall_cExp:qM
-cExp:qA
-h5
-m9(318,"x "
-aX
-mA,aV"[fp_exp(x)]"
-wE,w6);q5
-Ldk;qF
-cLog:A
-a8(231,w7
-aS" "
-mA,"A"
-,aE(A)wA);oN
-qB
-oW(59,"x "
-mA,"[fp_exp(x)]"
-,w6);q5
-Ldm;}
-qK
-TailCall_cExp2:qM
-dC:qA
-h5
-m9(319,"x "
-aX
-a1,a1" [fp_exp2(x)]"
-wE,w6);q5
-Ldn;qF
-cLog2:A
-a8(232,w7
-a2" "
-a1,"A"
-,aE(A)wA);oN
-qB
-oW(60,"x "
-a1,"[fp_exp2(x)]"
-,w6);q5
-Ldo;}
-oW(410,a1,"[DO_STACKPLUS1] [fp_log(Value_t(2))]"
-w5
-mA,);oL
-Ldp;TailCall_cFloor:qM
-cFloor:qA
-gC
-oW(315,aW
-mB,mN" "
-a9,);q5
-Ldq;qB
-oW(61,"x "
-mB,"[fp_floor(x)]"
-,w6);q5
-Lea;gY
-gG
-oW(309,"A[IsAlwaysIntegerOpcode(A)] "
-mB,"A"
-,aE(A)wA);g6
-qE
-TailCall_cGreater:qM
-dX:d7
-mL(173,mI
-aR,"[fp_less(x,y)]"
-,q11);q5
-Leb;gX-hW
-oW(345,"x[x==Value_t(-0.5)] "
-aR,aW
-aK,w6);q5
-Lec;qE
-TailCall_cGreaterOrEq:qM
-dE:hO!=qY
-hH==oS
-oW(341,aG" "
-wL
-a0,"[Value_t(0.5)/x]"
-w5
-a3,w6);q5
-Led;}
-}
-mL(174,mI
-a0,"[fp_lessOrEq(x,y)]"
-,q11);q5
-Lee;gX
-hW
-oW(344,"x[x==Value_t(0.5)] "
-a0,"cAbsNotNot"
-,w6);q5
-Lef;qE
-TailCall_cInt:qM
-cInt:qA
-q7:x=q2[0];oW(62,"x cInt"
-,"[fp_int(x)]"
-,w6);q5
-Leg;gY
-gG
-oW(311,"A[IsAlwaysIntegerOpcode(A)] cInt"
-,"A"
-,aE(A)wA);g6
-qE
-TailCall_cInv:qM
-cInv:qA
-cCos:oW(374,"cCos cInv"
-,"cSec"
-,);q5
-Leh;h7
-cCot:oW(378,"cCot cInv"
-,"cTan"
-,);q5
-Lco;h7
-cCsc:oW(376,"cCsc cInv"
-,"cSin"
-,);q5
-Lei;h7
-mQ(247,"cInv cInv"
-,,);oM
-h7
-o2:oW(249,aT" cInv"
-,a9
-aA,);q5
-Lej;h7
-cSec:oW(377,mO"cInv"
-,"cCos"
-,);q5
-Lek;h7
-cSin:oW(373,"cSin cInv"
-,"cCsc"
-,);q5
-Lel;h7
-cSqrt:oW(75,m4" cInv"
-,"cRSqrt"
-,);q5
-Lem;h7
-o1:oW(375,mP"cInv"
-,"cCot"
-,);q5
-Len;qB
-dM!=qY
-oW(77,wL"cInv"
-,"[Value_t(1)/x]"
-,w6);q5
-Leo;gJ}
-qK
-TailCall_cLess:qM
-dS
-hO==qY
-A
-a8(132,w7
-w3
-m3,aQ,q31(A)wA);q5
-Lep;}
-hV
-x!=qY
-hH==oS
-oW(340,aG" "
-wL
-m3,"[Value_t(0.5)/x]"
-w5"cNot"
-,w6);q5
-Leq;}
-}
-mL(171,mI
-m3,"[fp_less(y,x)]"
-,q11);q5
-Lfa;gX
-hW
-oW(343,"x[x==Value_t(0.5)] "
-m3,aK,w6);q5
-Lfb;qE
-TailCall_cLessOrEq:qM
-d4:d7
-mL(172,mI
-aH,"[fp_lessOrEq(y,x)]"
-,q11);q5
-Lfc;gX-hW
-oW(346,"x[x==Value_t(-0.5)] "
-aH,aW"cAbsNotNot"
-,w6);q5
-Lfd;qE
-TailCall_cLog:qM
-cLog:qA
-cExp:oW(234,aV
-aS,,);oM
-gR
-oW(422,wH
-w5
-aS,aS" [fp_log(x)] "
-wG,w6);q5
-Lfe;}
-mC(149,m2
-aS,aG" "
-aS" "
-wJ
-wG,);q5
-Lff;qB
-mE(63,wH" "
-aS,"[fp_log(x)]"
-,w6);q5
-Lfg;gJ}
-qK
-TailCall_cLog10:qM
-oV:qA
-cExp:oW(412,aV
-a4,"[DO_STACKPLUS1] [fp_log10(fp_const_e<Value_t>())]"
-wE,);oL
-Lfh;gR
-oW(423,wH
-w5
-a4,a4" [fp_log10(x)] "
-wG,w6);q5
-Lfi;}
-mC(151,m2
-a4,aG" "
-a4" "
-wJ
-wG,);q5
-Lfj;qB
-mE(64,wH" "
-a4,"[fp_log10(x)]"
-,w6);q5
-Lfk;gJ}
-qK
-TailCall_cLog2:qM
-cLog2:qA
-cExp:oW(411,aV
-a2,"[DO_STACKPLUS1] [fp_log2(fp_const_e<Value_t>())]"
-wE,);oL
-Lfl;h7
-dC:oW(235,a1" "
-a2,,);oM
-gR
-oW(421,wH
-w5
-a2,a2" [fp_log2(x)] "
-wG,w6);q5
-Lfm;}
-mC(150,m2
-a2,aG" "
-a2" "
-wJ
-wG,);q5
-Lfn;qB
-mE(65,wH" "
-a2,"[fp_log2(x)]"
-,w6);q5
-Lfo;gJ}
-qK
-TailCall_cMax:qM
-cMax:o4
-oW(157,wJ
-aZ,,);oM
-oG
-oW(90,mI
-aZ,"[fp_max(x,y)]"
-,q11);q5
-Lfp;gJ
-oC=q0
-gM
-oW(159,wO
-wJ
-aM
-aZ,wQ
-mM,aE(A)q51(B)wA);oM
-qF
-cMax:mK(161,wO
-aZ" "
-aM
-aZ,wQ
-aZ,aE(A)q51(B)wA);oN}
-qE
-TailCall_cMin:qM
-cMin:o4
-oW(156,wJ
-m0,,);oM
-oG
-oW(89,mI
-m0,"[fp_min(x,y)]"
-,q11);q5
-Lfq;gJ
-oC=q0
-gM
-oW(158,wO
-wJ
-aM
-m0,wQ
-mM,aE(A)q51(B)wA);oM
-qF
-cMin:mK(160,wO
-m0" "
-aM
-m0,wQ
-m0,aE(A)q51(B)wA);oN}
-qE
-TailCall_cMod:qM
-cMod:hO!=qY
-mL(82,mH
-wL"cMod"
-,"[fp_mod(y,x)]"
-,q11);q5
-Lga;}
-qE
-TailCall_cMul:qM
-gF:o4
-oW(402,mM
-wE,wT,);q5
-Lgb;h7
-mQ(252,"cInv"
-wE,aY,);q5
-Lgc;h7
-gC
-qP
-h4
-oW(394,wJ
-a9
-wE,m2
-a9,);q5
-Lgd;oC=g8;qV){m7
-B=mX
-aI(400,"B[B==A]"
-wU" "
-a9
-wE,wQ
-wT
-w5
-a9,aE(A)q51(B)wA);q5
-Lge;}
-}
-}
-}
-q5
-dJ;h7
-o2:hH
-qC
-dP
-oW(198,mM
-wB
-aT
-wE,"[x+Value_t(1)]"
-aA,w6);q5
-Lgf;}
-}
-q5
-dJ;qB
-dM==qY
-qP
-gF:A=gE;qV
-mF(141,aO
-w5
-w3
-w2,wY
-wE,q31(A)wA);q5
-Lgg;}
-q5
-Default3;g7
-Default3:;A=g8
-oK
-IsBinaryOpcode(A)g3
-A)){gD
-hZ
-oW(140,mH
-oZ,wY
-wE,q31(A)q21
-aF);q5
-Lgh;g7
-gO
-IsBinaryOpcode(B)g3
-B)){hQ
-mX){hY
-oW(144,mH
-w8,aQ,q31(A)q51(B)q21
-aF);q5
-Lgi;g7
-C=mX
-oK
-C
-h3
-mF(142,"C[C>=VarBegin] "
-w8,aQ,q31(A)q51(B)q61(C)wA);q5
-Lgj;o6
-C)g3
-C)mF(143,"C[IsUnaryOpcode(C)&&!HasInvalidRangesOpcode(C)] "
-w8,wQ
-aQ,q31(A)q51(B)q61(C)wA);q5
-Lgk;}
-}
-hV
-oF
-oW(138,q01
-oZ,wY
-wE,q31(A)q51(B)wA);q5
-Lgg;o6
-B)g3
-B)mF(139,"B[IsUnaryOpcode(B)&&!HasInvalidRangesOpcode(B)] "
-oZ,aQ,q31(A)q51(B)wA);q5
-Lgl;}
-}
-}
-qV
-mF(136,aM
-w3
-w2,wY,q31(A)wA);q5
-Lgm;o6
-A)g3
-A)mF(137,"A[IsUnaryOpcode(A)&&!HasInvalidRangesOpcode(A)] "
-w3
-w2,wY
-wE,q31(A)wA);q5
-Lgn;}
-}
-}
-qP
-h5
-gD
-h4
-dM+mR(202,"cDup[x+x==Value_t(1)] "
-m8,,w6);q5
-Lgo;}
-oW(203,wJ
-m8,"[x+x]"
-wE,w6);q5
-Lgp;h7
-gF:dW
-A=g0
-4];qV
-mF(292,aM"y"
-w5
-m8,wY
-w5"A "
-aU
-w5
-wG,wR", "
-mH
-mZ
-y
-q21
-w9(A)wA);q5
-Lgq;}
-qF
-hZ
-oW(291,mH
-m8,wY
-w5
-aU" "
-wG,q11);q5
-Lha;qF
-cDeg:oW(152,"cDeg"
-wB
-w2,"[RadiansToDegrees(x)]"
-wE,w6);q5
-Lhb;h7
-cDiv:gP
-hQ
-mX){h7
-gF:qN
-4]qO
-oW(109,"y"
-w5
-q01
-aY
-wB
-w2,aU
-w5
-wQ
-aY,q91(B)q21
-aF);q5
-Lhc;oO
-oW(110,aW
-q01
-aY
-wB
-w2,a5
-wQ
-aY,q91(B)wA);q5
-Lhd;hY
-oW(108,mH
-q01
-aY
-wB
-w2,aU" "
-wQ
-aY,q91(B)q21
-aF);q5
-Lhe;}
-qF
-gF:gD
-h5
-qN
-hL
-dM+mR(204,"cDup[x+x==Value_t(1)] "
-wG
-q71,w2,w6);q5
-Lhf;}
-oW(205,wJ
-wG
-q71,w2" [x+x]"
-wE,w6);q5
-Lhg;qF
-hZ
-if((y*x)==gV
-oW(189,"y[(y*x)==fp_const_rad_to_deg<Value_t>()]"
-q71,"cDeg"
-,q11);q5
-Lcq;hV(y*x)==gW
-oW(190,"y[(y*x)==fp_const_deg_to_rad<Value_t>()]"
-q71,"cRad"
-,q11);q5
-Lda;hV
-y*mR(192,"y[y*x==Value_t(1)]"
-q71,,q11);q5
-Lhh;}
-oW(193,"y"
-q71,aU
-wE,q11);q5
-Lhi;oO
-oW(182,a9
-wB
-w2,"[-x]"
-wE,w6);q5
-Lhj;h7
-dV
-gD
-gF:dW
-oW(116,"y"
-w5
-aB,aU
-w5"cRDiv"
-,q11);q5
-Lhk;oO
-oW(117,aW
-aB,a5"cRDiv"
-,w6);q5
-Lhl;hY
-oW(115,mH
-aB,aU" cRDiv"
-,q11);q5
-Lhm;qF
-cRad:oW(153,"cRad"
-wB
-w2,"[DegreesToRadians(x)]"
-wE,w6);q5
-Lhn;h7
-cSub:m7
-dW
-A=g0
-4];qV
-mF(293,aM"y"
-w5"cSub"
-wB
-w2,wY
-w5"A "
-aU
-w5"cSub"
-,wR", "
-mH
-mZ
-y
-q21
-w9(A)wA);q5
-Lho;}
-}
-qF
-hZ
-oW(79,mI
-w2,aU,q11);q5
-Lhp;dQ
-oW(78,wC
-w2,,w6);q5
-Lba;gX
-2)mF(146,"x[x==Value_t(2)]"
-wE,wJ
-wG,w6);q5
-Lhq;hJ
-gV
-oW(147,"x[x==fp_const_rad_to_deg<Value_t>()]"
-wE,"cDeg"
-,w6);q5
-Lia;hJ
-gW
-oW(148,"x[x==fp_const_deg_to_rad<Value_t>()]"
-wE,"cRad"
-,w6);q5
-Lib;gX-1)mF(184,"x[x==Value_t(-1)]"
-wE,a9,w6);q5
-Lic;gJ
-g7
-dJ:;A
-oE){qP
-cDiv:gP
-oW(105,q01
-aY" "
-aN,"[DO_STACKPLUS1] A"
-w5
-wQ
-aY,aE(A)q51(B)wA);oL
-Lid;}
-q5
-hT
-gF:gD
-gC
-B=mX
-aI(397,wO
-a9
-wU
-wE,wQ
-wT
-w5
-a9,aE(A)q51(B)wA);q5
-Lge;}
-q5
-dK;g7
-dK:;mK(388,"B[B==A]"
-wU
-wE,wQ
-wT
-wE,aE(A)q51(B)wA);q5
-Lie;}
-}
-q5
-hT
-gC
-mK(391,wO
-aW
-aN,wQ
-m2
-a9,aE(A)q51(B)wA);q5
-Lgd;}
-q5
-hT
-dV
-h1
-qC
-oW(98,"x cRDiv "
-aN,"[DO_STACKPLUS1] A "
-wY
-w5"cRDiv"
-,aE(A)q21
-wS
-wA);oL
-Lif;}
-oW(112,"cRDiv "
-aN,"[DO_STACKPLUS1] A"
-w5"cRDiv"
-,aE(A)wA);oL
-Lig;g7
-Default4:;B=g8
-aI(385,wO
-aN,wQ
-wT,aE(A)q51(B)wA);q5
-Lgb;}
-}
-o6
-A)){B=g8
-oK
-B
-h3
-qU
-1){m7
-C=mX
-oK
-C==A){D=g0
-4]oK
-D==B
-mF(408,"D[D==B] C[C==A]"
-w5"B[B>=VarBegin&&mData->mByteCode.size()>1] A[IsUnaryOpcode(A)]"
-wE,"D C "
-wT
-wE,aE(A)q51(B)q61(C)<<", D "
-oY(D)wA);q5
-Lih;}
-}
-}
-}
-qE
-TailCall_cNEqual:qM
-dT:hO==qY
-qP
-d2
-oW(266,aG" "
-w3
-wN,mW
-wN,w6);q5
-Lii;h7
-hK:oW(268,m2
-w3
-wN,mW
-wN,w6);q5
-Lii;}
-}
-mL(176,mI
-wN,"[fp_nequal(y,x)]"
-,q11);q5
-Lij;qE
-hD:qM
-gC
-qA
-gF:m9(183,"x"
-w5
-a9,"[-x]"
-wE,w6);q5
-Lik;oO
-oW(248,aW
-a9,,);oM
-h7
-cSin:hH
-wW(359,"x"
-w5"cSin "
-a9,a5"cSin"
-,w6);q5
-Lil;}
-qF
-oT
-hH
-wW(360,"x"
-w5"cSinh "
-a9,a5"cSinh"
-,w6);q5
-Lim;}
-qF
-o1:hH
-wW(361,"x"
-w5
-mP
-a9,a5"cTan"
-,w6);q5
-Lin;}
-qF
-oU
-hH
-wW(362,"x"
-w5"cTanh "
-a9,a5"cTanh"
-,w6);q5
-Lio;}
-gJ
-qB
-oW(76,"x "
-a9,"[-x]"
-,w6);q5
-Lip;}
-qK
-TailCall_cNot:qM
-cNot:qA
-d2
-oW(296,aG
-aJ,"cNot"
-,);q5
-Liq;h7
-cAbsNot:A
-a7(303,"A[IsLogicalOpcode(A)] "
-aK
-aJ,"A"
-,aE(A)wA);oM
-hV
-A!=q7
-mF(304,"A[A!=cImmed] "
-aK
-aJ,"A cAbsNotNot"
-,aE(A)wA);q5
-Lja;}
-q5
-dL;h7
-cAbsNotNot:oW(299,"cAbsNotNot"
-aJ,aK,);q5
-Ljb;h7
-dR:oW(262,wZ
-aJ,wN,);q5
-Ljc;h7
-dX:oW(260,aR
-aJ,aH,);q5
-Ljd;h7
-dE:oW(261,a0
-aJ,m3,);q5
-Lje;h7
-dS
-oW(258,m3
-aJ,a0,);q5
-Ljf;h7
-d4:oW(259,aH
-aJ,aR,);q5
-Ljg;h7
-dT:oW(263,wN
-aJ,wZ,);q5
-Ljh;h7
-gC
-oW(295,a9
-aJ,"cNot"
-,);q5
-Liq;h7
-cNot:oW(297,"cNot"
-aJ,a3,);q5
-Lbd;h7
-dB:oW(298,a3
-aJ,"cNot"
-,);q5
-Liq;qB
-oW(93,"x"
-aJ,"[fp_not(x)]"
-,w6);q5
-Lji;g7
-dL:;A
-h0
-qX
-oW(305,w7"cNot"
-,"A "
-aK,aE(A)wA);q5
-Ljj;qE
-TailCall_cNotNot:qM
-dB:gZ]==cNot
-mF(300,"cNot "
-a3,"cNot"
-,);g6}
-qK
-TailCall_cOr:qM
-cOr:o4
-oW(425,wJ"cOr"
-,a3,);q5
-Lbd;oG
-oW(178,mI"cOr"
-,"[fp_or(x,y)]"
-,q11);q5
-Ljk;gJ}
-qK
-TailCall_cPow:qM
-o2:d7
-if(!h2
-x+x)){hH==hK
-mF(22,m2"x[!isEvenInteger(x+x)]"
-aA,aG" [x+x]"
-aA,w6);q5
-Ljl;}
-hV
-isInteger(x)){qP
-cExp:oW(43,aV
-wI,wY
-w5
-mA,w6);q5
-Ljm;h7
-dC:oW(44,a1" "
-wI,wY
-w5
-a1,w6);q5
-Ljn;h7
-o2:h1
-oI!isInteger(y)mF(42,"y[!isInteger(y)]"
-aA" "
-wI,aU
-aA,q11);q5
-Ljo;}
-}
-oW(45,aT" "
-wI,wY
-w5
-aT,w6);q5
-Ljp;}
-hV
-h2
-x)){qP
-d2
-oW(348,aG" x[isEvenInteger(x)]"
-aA,wY
-aA,w6);q5
-Ljq;h7
-gF:h1==oS
-oW(349,aG
-w5"x[isEvenInteger(x)]"
-aA,w2" "
-wY
-aA,w6);q5
-Lka;gJ}
-hJ
-qY
-oW(169,w3
-aT,"[Value_t(0)]"
-w5"[Value_t(1)] "
-wG,w6);q5
-Lkb;gX
-hW
-oW(223,"x[x==Value_t(0.5)]"
-aA,m4,w6);q5
-Lkc;gX
-1)/qD
-3)mF(224,"x[x==Value_t(1)/Value_t(3)]"
-aA,"cCbrt"
-,w6);q5
-Lkd;gX
-1)/qD-3)mF(225,"x[x==Value_t(1)/Value_t(-3)]"
-aA,"cCbrt cInv"
-,w6);q5
-Lke;gX-hW
-oW(226,"x[x==Value_t(-0.5)]"
-aA,"cRSqrt"
-,w6);q5
-Lkf;gX-1)mF(227,"x[x==Value_t(-1)]"
-aA,"cInv"
-,w6);q5
-Lkg;}
-qP
-o2:h1
-oI
-h2
-y)&&!h2
-x*y)mF(21,"y[isEvenInteger(y)&&!isEvenInteger(x*y)]"
-aA
-wB
-aT,aG" "
-aU
-aA,q11);q5
-Lkh;}
-oW(221,"y"
-aA
-wB
-aT,aU
-aA,q11);q5
-Ljo;mC(46,wT
-wB
-aT,"[x+x]"
-aA,w6);q5
-Lki;hY
-if(y!=qD
-0)||x>=qY
-oW(92,"y[y!=Value_t(0)||x>=Value_t(0)]"
-wB
-aT,"[fp_pow(y,x)]"
-,q11);q5
-Lkj;gJ}
-oW(382,"x"
-aA,"[DO_POWI]"
-,w6)oK
-TryCompilePowi(x))g6}
-qK
-TailCall_cRDiv:qM
-dV
-qA
-hX:oW(437,"cSinCos cRDiv"
-,"cCot"
-,);q5
-Len;qB
-dM
-hI
-oW(99,wC"cRDiv"
-,"cInv"
-,w6);q5
-Lkg;gJ}
-qK
-TailCall_cRSub:qM
-dN:gZ]hM
-oW(200,wJ
-wX,"[Value_t(0)]"
-wE,);q5
-Lkk;}
-qK
-TailCall_cRad:qM
-cRad:qA
-gF:m9(154,"x"
-w5"cRad"
-,"[DegreesToRadians(x)]"
-wE,w6);q5
-Lkl;gJ
-qB
-oW(74,"x cRad"
-,"[DegreesToRadians(x)]"
-,w6);q5
-Lkm;}
-qK
-TailCall_cSec:qM
-cSec:A
-oE
-d3
-qP
-cCos:mK(431,wO"cCos "
-w4"cSec"
-,wQ"cCos"
-aL,aE(A)q51(B)wA);q5
-Lbp;qF
-cSin:mK(429,wO"cSin "
-w4"cSec"
-,wQ"cSinCos cInv"
-,aE(A)q51(B)wA);q5
-Lkn;gJ
-qE
-TailCall_cSin:qM
-cSin:qA
-gC
-oW(355,aW"cSin"
-,"cSin "
-a9,);q5
-Lko;qB
-oW(66,"x cSin"
-,"[fp_sin(x)]"
-,w6);q5
-Lkp;oD
-d3
-hH==cCsc){mK(433,wO"cCsc "
-w4"cSin"
-,wQ"cCsc"
-aL,aE(A)q51(B)wA);q5
-Lbp;}
-}
-qE
-TailCall_cSinh:qM
-oT
-qA
-cAcosh:oW(364,"cAcosh cSinh"
-,"[DO_STACKPLUS1] "
-m2"[Value_t(-1)] "
-m1,);oL
-Lkq;h7
-cAsinh:oW(240,"cAsinh cSinh"
-,,);oM
-h7
-gC
-oW(356,aW"cSinh"
-,"cSinh "
-a9,);q5
-Lla;qB
-oW(67,"x cSinh"
-,"[fp_sinh(x)]"
-,w6);q5
-Llb;}
-qK
-TailCall_cSqr:qM
-hK:qA
-d2
-oW(404,aG" "
-wT,wT,);q5
-Llc;h7
-gC
-oW(403,aW
-wT,wT,);q5
-Llc;h7
-cSqrt:A
-a8(229,w7
-m4" "
-wT,"A"
-,aE(A)wA);oN}
-qK
-TailCall_cSqrt:qM
-cSqrt:qA
-h5
-hH==hK){A=gE;qV){qN
-3]==hK
-mF(439,m2
-aM
-m2
-m1,"A cHypot"
-,aE(A)wA);q5
-Lld;}
-}
-gO
-gH
-B)){A=mX;qV){qN
-4]==hK
-mF(440,m2
-aM"B[IsUnaryOpcode(B)] "
-m2
-m1,"A "
-wQ"cHypot"
-," with"
-aD(B)q21
-w9(A)wA);q5
-Lle;}
-}
-}
-mC(23,m2
-m4,aG,);q5
-Llf;qB
-dM>=qY
-oW(68,"x[x>=Value_t(0)] "
-m4,"[fp_sqrt(x)]"
-,w6);q5
-Llg;gJ}
-qK
-hE:qM
-cSub:o4
-oW(199,wJ"cSub"
-,"[Value_t(0)]"
-wE,);q5
-Lkk;h7
-gC
-oW(254,aW"cSub"
-,wG,);q5
-Llh;qB
-dM==qY
-oW(85,w3"cSub"
-,,w6);q5
-Lba;}
-mL(86,mI"cSub"
-,"[y-x]"
-,q11);q5
-Lli;}
-oW(216,"x cSub"
-,mJ
-wG,w6);q5
-Llj;oD){hH==dN){h1
-qC
-oW(120,"x "
-wX" "
-aM"cSub"
-,"A "
-aX
-mW
-wX,aE(A)q21
-wS
-wA);q5
-Llk;}
-oW(127,wX" "
-aM"cSub"
-,"[DO_STACKPLUS1] A cSub "
-wX,aE(A)wA);oL
-Lll;}
-qE
-hF:qM
-o1:qA
-cAtan2:oW(245,"cAtan2 cTan"
-,aY,);q5
-Lgc;h7
-gC
-oW(357,aW"cTan"
-,mP
-a9,);q5
-Llm;qB
-oW(70,"x cTan"
-,"[fp_tan(x)]"
-,w6);q5
-Lln;oD
-d3
-hH==cCot){mK(435,wO"cCot "
-w4"cTan"
-,wQ"cCot"
-aL,aE(A)q51(B)wA);q5
-Lbp;}
-}
-qE
-TailCall_cTanh:qM
-oU
-qA
-gC
-oW(358,aW"cTanh"
-,"cTanh "
-a9,);q5
-Llo;qB
-oW(71,"x cTanh"
-,"[fp_tanh(x)]"
-,w6);q5
-Llp;}
-qK
-TailCall_cTrunc:qM
-cTrunc:qA
-q7:x=q2[0];oW(72,"x cTrunc"
-,"[fp_trunc(x)]"
-,w6);q5
-Llq;gY
-gG
-oW(308,"A[IsAlwaysIntegerOpcode(A)] cTrunc"
-,"A"
-,aE(A)wA);g6
-qE
-g7
-Default0:;A=opcode
-oK
-IsComparisonOpcode(A)){d7
-qP
-h5
-h1
-qO
-oW(270,mH
-wG
-wF,"[x-y] A"
-,aE(A)q41);q5
-Lma;qF
-cAtan:if(d8<fp_const_pi<hP>()*qD
-hW
-oW(286,"cAtan[fp_abs(x)<fp_const_pi<Value_t>()*Value_t(0.5)]"
-wF,"[fp_tan(x)] A"
-,aE(A)q21
-wS
-wA);q5
-Lmb;qF
-cExp:mE(276,"cExp[x>Value_t(0)]"
-wF,"[fp_log(x)] A"
-,aE(A)q21
-wS
-wA);q5
-Lmc;qF
-dC:mE(277,"cExp2[x>Value_t(0)]"
-wF,"[fp_log2(x)] A"
-,aE(A)q21
-wS
-wA);q5
-Lmd;qF
-cLog:gO
-g9
-oW(279,wD
-aS
-wF,wQ"[fp_exp(x)] A"
-,aE(A)q21
-wS
-q51(B)wA);q5
-Lme;qF
-oV:gO
-g9
-oW(281,wD
-a4
-wF,wQ"[fp_pow(Value_t(10),x)] A"
-,aE(A)q21
-wS
-q51(B)wA);q5
-Lmf;qF
-cLog2:gO
-g9
-oW(280,wD
-a2
-wF,wQ"[fp_exp2(x)] A"
-,aE(A)q21
-wS
-q51(B)wA);q5
-Lmg;qF
-gF:h1
-oI
-y>qY
-oW(272,"y[y>Value_t(0)]"
-w5"x A[IsComparisonOpcode(A)]"
-,"[x/y] A"
-,aE(A)q41);q5
-Lmh;hV
-y<qY
-oW(273,"y[y<Value_t(0)]"
-w5"x A[IsComparisonOpcode(A)]"
-,"[x/y] {OppositeComparisonOpcode(A)}"
-,aE(A)q41);q5
-Lmi;}
-oO
-oW(271,a9
-wF,mJ"{OppositeComparisonOpcode(A)}"
-,aE(A)q21
-wS
-wA);q5
-Lmj;h7
-o2:dM>qY
-h1
-oI
-y>qY
-oW(274,"y[y>Value_t(0)] cPow[x>Value_t(0)]"
-wF,"[fp_pow(x,1/y)] A"
-,aE(A)q41);q5
-Lmk;}
-}
-qF
-oT
-oW(287,"cSinh"
-wF,"[fp_asinh(x)] A"
-,aE(A)q21
-wS
-wA);q5
-Lml;h7
-hK:mE(275,"cSqr[x>Value_t(0)]"
-wF,aG" [fp_sqrt(x)] A"
-,aE(A)q21
-wS
-wA);q5
-Lmm;qF
-oU
-if(d8<o9
-mF(288,"cTanh[fp_abs(x)<Value_t(1)]"
-wF,"[fp_atanh(x)] A"
-,aE(A)q21
-wS
-wA);q5
-Lmn;gJ}
-}
-}
-qV
-qU
-0){B
-h0
-B==A
-mF(406,wO"A[A>=VarBegin&&mData->mByteCode.size()>0]"
-,wQ
-mM,aE(A)q51(B)wA);q5
-Lmo;}
-o6
-A)){B
-h0
-B
-h3
-qU
-1){C=g8
-oK
-C==A){D=oJ
-D==B
-mF(407,"D[D==B] C[C==A] B[B>=VarBegin&&mData->mByteCode.size()>1] A[IsUnaryOpcode(A)]"
-,"D C "
-mM,aE(A)q51(B)q61(C)<<", D "
-oY(D)wA);q5
-Lmp;}
-}
-}
-}
-}
-q5
-Laa;Laa:qI
-opcode
-mV
-Lab:q8
-Lmq:w1(cAbs);q5
-TailCall_cAbs;Lac:gB
-d8;g6
-Lad:gB
-fp_acos
-mG
-Lae:gB
-fp_acosh
-mG
-Laf:o7
-4));gE=q7;hA
-Lna:g1
-gF;Lnb:qZ
-Lnc:w1(cMul);q5
-TailCall_cMul;Lag:q9
-hU
-o7
-4));Lnd:hN
-Lna;Lah:gB
-x+o9;gE=q7;hA
-Lep:g1
-gF;q5
-Lnc;Lai:a6
-cSub;Lne:w1(cSub);q5
-hE;Laj:hG
-o3
-Lnf:qZ
-Lng:w1(cAdd);q5
-TailCall_cAdd;Lak:hG
-3;qJ
-Lnh:d5
-Lni:g1
-dN;qZ
-w1(cRSub);q5
-TailCall_cRSub;Lal:gA
-gE=q7;q9
-o3
-q5
-Lnh;Lam:hG
-o3
-q5
-Lni;Lan:hG
-4;qJ
-Lnj:d5
-Lnk:qL
-B);Lnl:g1
-cSub;qZ
-q5
-Lne;Lao:gA
-mX=q7;q9
-3;qJ
-q5
-Lnj;Lap:hG
-3;qJ
-q5
-Lnk;Laq:g5
-y+x;Lba:qT
-Ldl:g2
-q6
-g6
-Lbb:qS
-3
-dU
-oP
-hN
-Lnh;Lbc:qQ
-A
-gU
-Lnh;Lbd:a6
-dB;Lnm:w1(cNotNot);q5
-TailCall_cNotNot;Lbe:g5
-fp_and(x
-h6
-Lbf:gB
-fp_asin
-mG
-Lbg:gB
-fp_asinh
-mG
-Lbh:gB
-fp_atan
-mG
-Lbi:g5
-fp_atan2
-mY
-Lbj:gB
-fp_atanh
-mG
-Lbk:gB
-fp_cbrt
-mG
-Lbl:qG
-cFloor);Lnn:g1
-cNeg;qZ
-w1(cNeg);q5
-hD;Lbm:gB
-fp_ceil
-mG
-Lbn:q8
-Lno:w1(cCos);q5
-TailCall_cCos;Lbo:gB
-fp_cos
-mG
-Lbp:q0
-d6
-g1
-cInv;Lnp:w1(cInv);q5
-TailCall_cInv;Lbq:qQ
-hX
-mV
-Lca:q8
-w1(cCosh);q5
-TailCall_cCosh;Lcb:qG
-hK);o7
-1));Lnq:qI
-q7);d5
-Loa:g1
-cSqrt;qZ
-w1(cSqrt);q5
-TailCall_cSqrt;Lcc:gB
-fp_cosh
-mG
-Lcd:gB
-RadiansToDegrees
-mG
-Lce:qG
-cSec
-gU
-Lna;Lcf:qG
-o1
-gU
-Lna;Lcg:qG
-cSin
-gU
-Lna;Lch:o7
-0));q0[0]=q7;Lob:qL
-d1
-o7
-1));Loc:qI
-q7);Lod:g1
-cAdd;q5
-Lnf;Lci:qG
-cNeg);qL
-cExp
-gU
-Lna;Lcj:qG
-cNeg);qL
-dC
-gU
-Lna;Lck:q8
-q5
-Lep;Lcl:qG
-cNeg);qL
-o2
-gU
-Lna;Lcm:qG
-cCos
-gU
-Lna;Lcn:qG
-cCsc
-gU
-Lna;Lco:a6
-o1;Loe:w1(cTan);q5
-hF;Lcp:qG
-cCot
-gU
-Lna;Lcq:dY;qJ
-Lof:g1
-cDeg;qZ
-w1(cDeg);q5
-TailCall_cDeg;Lda:dY;qJ
-Log:g1
-cRad;qZ
-w1(cRad);q5
-TailCall_cRad;Ldb:g5
-y/x;qS
-o3
-q5
-Lna;Ldc:gA
-mT
-q8
-Loh:w1(cDiv);q5
-TailCall_cDiv;Ldd:g5
-y/x;q5
-Lba;Lde:gB
-o9/x;q5
-Lep;Ldf:qQ
-A);qL
-d1
-Loi:qZ
-q5
-Loh;Ldg:qS
-3
-dU
-qL
-d1
-oP
-qI
-q7);Loj:g1
-cRDiv;qZ
-w1(cRDiv);q5
-TailCall_cRDiv;Ldh:q9
-3
-dU
-qL
-d1
-qL
-B
-gU
-Loj;Ldi:mT
-q8
-Lok:w1(cEqual);q5
-TailCall_cEqual;Ldj:g5
-fp_equal
-mY
-Ldk:qT
-qQ
-cExp);qH
-fp_exp(x)gU
-Lnd;Ldm:gB
-fp_exp
-mG
-Ldn:qT
-qQ
-dC);qH
-fp_exp2(x)gU
-Lnd;Ldo:gB
-fp_exp2
-mG
-Ldp:qH
-dG
-qD
-2)));qI
-q7);Lol:qL
-d1
-g1
-cExp;qZ
-w1(cExp);q5
-TailCall_cExp;Ldq:qG
-cCeil
-mS
-Lea:gB
-fp_floor
-mG
-Leb:g5
-fp_less(x
-h6
-Lec:qT
-qG
-cNeg);Ljj:qL
-cAbsNot
-mV
-Led:gB
-qD
-0.5)/x;mD
-dB;qZ
-q5
-Lnm;Lee:g5
-fp_lessOrEq(x
-h6
-Lef:qT
-Lja:g2
-q6
-Lom:qL
-cAbsNotNot
-mV
-Leg:gB
-fp_int
-mG
-Leh:a6
-cSec;w1(cSec);q5
-TailCall_cSec;Lei:a6
-cSin;Lon:w1(cSin);q5
-TailCall_cSin;Lej:qG
-cNeg);g1
-o2;Loo:qZ
-Lop:w1(cPow);q5
-TailCall_cPow;Lek:a6
-cCos;q5
-Lno;Lel:a6
-cCsc;w1(cCsc);q5
-TailCall_cCsc;Lem:qG
-cRSqrt
-mV
-Len:a6
-cCot;w1(cCot);q5
-TailCall_cCot;Leo:gB
-o9/x;g6
-Leq:gB
-qD
-0.5)/x;mD
-cNot;qZ
-Loq:w1(cNot);q5
-TailCall_cNot;Lfa:g5
-fp_less
-mY
-Lfb:qT
-Ljb:qW
-Ljj;Lfc:g5
-fp_lessOrEq
-mY
-Lfd:qT
-qG
-cNeg
-gU
-Lom;Lfe:qT
-qQ
-cLog);qH
-dG
-x)gU
-Loc;Lff:qG
-d9
-qL
-cLog);Lpa:qI
-cDup
-gU
-Lod;Lfg:gB
-dG
-x
-mV
-Lfh:qH
-dA
-fp_const_e<hP>()));Lpb:q0[0]=q7;q5
-Lna;Lfi:qT
-qQ
-oV);qH
-dA
-x)gU
-Loc;Lfj:qG
-d9
-qL
-oV
-gU
-Lpa;Lfk:gB
-dA
-x
-mV
-Lfl:qH
-d0
-fp_const_e<hP>())gU
-Lpb;Lfm:qT
-qQ
-cLog2);qH
-d0
-x)gU
-Loc;Lfn:qG
-d9
-qL
-cLog2
-gU
-Lpa;Lfo:gB
-d0
-x
-mV
-Lfp:g5
-fp_max(x
-h6
-Lfq:g5
-fp_min(x
-h6
-Lga:g5
-fp_mod
-mY
-Lgb:a6
-hK;Lpc:w1(cSqr);q5
-TailCall_cSqr;Lgc:a6
-cDiv;q5
-Loh;Lgd:qQ
-hK
-mS
-Lge:q9
-3
-qR
-hK);qL
-gF
-mS
-Lgf:gB
-x+o9;gE=q7;hA
-g1
-o2;q5
-Lop;Lgg:gE=q7;hA
-q5
-Lnc;Lgh:g5
-x;Lpd:qS
-o3
-q5
-Lnb;Lgi:hB
-qT
-Lpe:q9
-4;qJ
-Lpf:qL
-A);oP
-Lpg:hN
-Lnb;Lgj:qT
-q5
-Lpe;Lgk:qS
-4
-qR
-B
-gU
-Lpf;Lgl:qS
-3;qJ
-q5
-Lpf;Lgm:mT
-oM
-Lgn:mT
-q8
-q5
-Lnc;Lgo:qT
-Lph:q9
-3;qJ
-g6
-Lgp:gB
-x+x;q5
-Lgg;Lgq:g5
-x;g0
-4]=q7;qS
-hU
-qL
-A);oQ);qI
-q7);qL
-gF
-gU
-Lod;Lha:g5
-x;qT
-qQ
-d1
-oQ
-gU
-Loc;Lhb:gB
-RadiansToDegrees(x
-gU
-Lgn;Lhc:g5
-y
-oR
-4;qJ
-Lpi:qL
-d1
-Lpj:qL
-B);g1
-cDiv;q5
-Loi;Lhd:gA
-mX=q7;q9
-3;qJ
-q5
-Lpi;Lhe:g5
-y
-oR
-3;qJ
-q5
-Lpj;Lhf:qS
-4;qJ
-q5
-Lnb;Lhg:qS
-hU
-qH
-x+x
-gU
-Lpg;Lhh:hB
-qT
-q5
-Lph;Lhi:g5
-y*x;q5
-Lpd;Lhj:gA
-q5
-Lgn;Lhk:g5
-y
-oR
-3;qJ
-Lpk:qL
-gF
-gU
-Loj;Lhl:gA
-gE=q7;q9
-o3
-q5
-Lpk;Lhm:g5
-y
-oR
-o3
-q5
-Loj;Lhn:gB
-gL
-q5
-Lgn;Lho:g5
-x;g0
-4]=q7;qS
-hU
-qL
-A);oQ);qI
-q7);qL
-gF
-gU
-Lnl;Lhp:g5
-y*x;q5
-Lba;Lhq:q0
-d6
-q2-=1;qT
-Lpl:g1
-cAdd;q5
-Lng;Lia:qT
-qW
-Lof;Lib:qT
-qW
-Log;Lic:qT
-qW
-Lnn;Lid:q9
-3
-qR
-A
-gU
-Lpi;Lie:q9
-o3
-Lpm:qL
-hK
-gU
-Lnb;Lif:qS
-3
-dU
-oP
-hN
-Lpk;Lig:qQ
-A
-gU
-Lpk;Lih:q9
-3;qJ
-q5
-Lpm;Lii:mT
-q8
-Lpn:w1(cNEqual);q5
-TailCall_cNEqual;Lij:g5
-fp_nequal
-mY
-Lik:gA
-q5
-Lck;Lil:gA
-o8
-cSin;qZ
-q5
-Lon;Lim:gA
-o8
-cSinh;qZ
-w1(cSinh);q5
-TailCall_cSinh;Lin:gA
-o8
-o1;qZ
-q5
-Loe;Lio:gA
-o8
-cTanh;qZ
-w1(cTanh);q5
-TailCall_cTanh;Lip:gA
-g6
-Liq:q8
-q5
-Loq;Ljc:a6
-dT;q5
-Lpn;Ljd:a6
-d4;w1(cLessOrEq);q5
-TailCall_cLessOrEq;Lje:a6
-cLess;w1(cLess);q5
-TailCall_cLess;Ljf:a6
-dE;w1(cGreaterOrEq);q5
-TailCall_cGreaterOrEq;Ljg:a6
-dX;w1(cGreater);q5
-TailCall_cGreater;Ljh:a6
-dR;q5
-Lok;Lji:gB
-fp_not
-mG
-Ljk:g5
-fp_or(x
-h6
-Ljl:qT
-qQ
-d9
-qH
-x+x);Lpo:hN
-Loo;Ljm:mT
-qW
-Lol;Ljn:mD
-dC;qZ
-w1(cExp2);q5
-TailCall_cExp2;Ljo:g5
-y
-oR
-o3
-q5
-Loo;Ljp:mT
-qG
-gF
-gU
-Loo;Ljq:mT
-q8
-q5
-Lop;Lka:qS
-3
-qR
-d1
-qH
-x
-gU
-Lpo;Lkb:gB
-qD
-0
-gU
-Lob;Lkc:qT
-qW
-Loa;Lkd:qT
-g2
-q6
-g1
-cCbrt;qZ
-w1(cCbrt);q5
-TailCall_cCbrt;Lke:qT
-qG
-cCbrt);Lpp:g1
-cInv;qZ
-q5
-Lnp;Lkf:qT
-q5
-Lem;Lkg:qT
-qW
-Lpp;Lkh:dY
-qR
-d9
-oQ
-gU
-Lpo;Lki:gB
-x+x;q5
-Ljq;Lkj:g5
-dZ
-y
-dF
-Lkk:o7
-0)gU
-Lpb;Lkl:gB
-gL
-q5
-Lck;Lkm:gB
-gL
-g6
-Lkn:qQ
-hX
-gU
-Lpp;Lko:qG
-cSin
-mS
-Lkp:gB
-fp_sin
-mG
-Lkq:qG
-hK);o7-1)gU
-Lnq;Lla:qG
-cSinh
-mS
-Llb:gB
-fp_sinh
-mG
-Llc:q8
-q5
-Lpc;Lld:q9
-4
-dU
-Lpq:qL
-cHypot
-mV
-Lle:q9
-5
-dU
-qL
-B
-gU
-Lpq;Llf:a6
-cAbs;q5
-Lmq;Llg:gB
-fp_sqrt
-mG
-Llh:q8
-q5
-Lpl;Lli:g5
-y-x;q5
-Lba;Llj:gA
-q5
-Lpl;Llk:qS
-3
-dU
-d5
-oP
-hN
-Lni;Lll:qQ
-A);qL
-cSub
-gU
-Lni;Llm:qG
-o1
-mS
-Lln:gB
-fp_tan
-mG
-Llo:qG
-cTanh
-mS
-Llp:gB
-fp_tanh
-mG
-Llq:gB
-fp_trunc
-mG
-Lma:g5
-x-y;Lqa:qS
-o3
-Lqb:qL
-A
-mV
-Lmb:gB
-fp_tan(x);Lqc:mT
-qW
-Lqb;Lmc:gB
-dG
-x
-mU;Lmd:gB
-d0
-x
-mU;Lme:gB
-fp_exp(x
-mU;Lmf:gB
-dZ
-qD
-10)dD
-Lqc;Lmg:gB
-fp_exp2(x
-mU;Lmh:g5
-x/y;q5
-Lqa;Lmi:g5
-x/y;qS
-o3
-Lqd:qL
-OppositeComparisonOpcode(A)mV
-Lmj:gA
-mT
-qW
-Lqd;Lmk:g5
-dZ
-x,1/y
-gU
-Lqa;Lml:gB
-fp_asinh(x
-mU;Lmm:qT
-qQ
-d9
-qH
-fp_sqrt(x));hN
-Lqb;Lmn:gB
-fp_atanh(x
-mU;Lmo:qI
-cDup
-mV
-Lmp:q0
-d6
-g6
-g6
-q5
-TailCall_cAcos;q5
-TailCall_cAcosh;q5
-TailCall_cAnd;q5
-TailCall_cAsin;q5
-TailCall_cAsinh;q5
-TailCall_cAtan;q5
-TailCall_cAtan2;q5
-TailCall_cAtanh;q5
-TailCall_cCeil;q5
-TailCall_cFloor;q5
-TailCall_cInt;q5
-TailCall_cLog;q5
-TailCall_cLog10;q5
-TailCall_cLog2;q5
-TailCall_cMax;q5
-TailCall_cMin;q5
-TailCall_cMod;q5
-TailCall_cOr;q5
-TailCall_cRDiv;q5
-TailCall_cRad;q5
-TailCall_cSec;q5
-TailCall_cSin;q5
-TailCall_cSinh;q5
-TailCall_cSqrt;q5
-hE;q5
-hF;q5
-TailCall_cTanh;q5
-TailCall_cTrunc;
-#endif
-#undef FP_ReDefinePointers
-#undef FP_TRACE_BYTECODE_OPTIMIZATION
-#undef FP_TRACE_OPCODENAME
diff --git a/fparser/fparser.cc b/fparser/fparser.cc
deleted file mode 100644
index 49e6ae0..0000000
--- a/fparser/fparser.cc
+++ /dev/null
@@ -1,3482 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen, Joel Yliluoma *|
-|* *|
-|* This library is distributed under the terms of the *|
-|* GNU Lesser General Public License version 3. *|
-|* (See lgpl.txt and gpl.txt for the license text.) *|
-\***************************************************************************/
-
-#include "fpconfig.hh"
-#include "fparser.hh"
-
-#include <set>
-#include <cstdlib>
-#include <cstring>
-#include <cctype>
-#include <cmath>
-#include <cassert>
-#include <limits>
-using namespace std;
-
-#include "fptypes.hh"
-using namespace FUNCTIONPARSERTYPES;
-
-#ifdef FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA
-#ifndef FP_USE_THREAD_SAFE_EVAL
-#define FP_USE_THREAD_SAFE_EVAL
-#endif
-#endif
-
-#ifdef __GNUC__
-# define likely(x) __builtin_expect(!!(x), 1)
-# define unlikely(x) __builtin_expect(!!(x), 0)
-#else
-# define likely(x) (x)
-# define unlikely(x) (x)
-#endif
-
-
-//=========================================================================
-// Opcode analysis functions
-//=========================================================================
-// These functions are used by the Parse() bytecode optimizer (mostly from
-// code in fp_opcode_add.inc).
-
-bool FUNCTIONPARSERTYPES::IsLogicalOpcode(unsigned op)
-{
- switch(op)
- {
- case cAnd: case cAbsAnd:
- case cOr: case cAbsOr:
- case cNot: case cAbsNot:
- case cNotNot: case cAbsNotNot:
- case cEqual: case cNEqual:
- case cLess: case cLessOrEq:
- case cGreater: case cGreaterOrEq:
- return true;
- default: break;
- }
- return false;
-}
-
-bool FUNCTIONPARSERTYPES::IsComparisonOpcode(unsigned op)
-{
- switch(op)
- {
- case cEqual: case cNEqual:
- case cLess: case cLessOrEq:
- case cGreater: case cGreaterOrEq:
- return true;
- default: break;
- }
- return false;
-}
-
-unsigned FUNCTIONPARSERTYPES::OppositeComparisonOpcode(unsigned op)
-{
- switch(op)
- {
- case cLess: return cGreater;
- case cGreater: return cLess;
- case cLessOrEq: return cGreaterOrEq;
- case cGreaterOrEq: return cLessOrEq;
- }
- return op;
-}
-
-bool FUNCTIONPARSERTYPES::IsNeverNegativeValueOpcode(unsigned op)
-{
- switch(op)
- {
- case cAnd: case cAbsAnd:
- case cOr: case cAbsOr:
- case cNot: case cAbsNot:
- case cNotNot: case cAbsNotNot:
- case cEqual: case cNEqual:
- case cLess: case cLessOrEq:
- case cGreater: case cGreaterOrEq:
- case cSqrt: case cRSqrt: case cSqr:
- case cHypot:
- case cAbs:
- case cAcos: case cCosh:
- return true;
- default: break;
- }
- return false;
-}
-
-bool FUNCTIONPARSERTYPES::IsAlwaysIntegerOpcode(unsigned op)
-{
- switch(op)
- {
- case cAnd: case cAbsAnd:
- case cOr: case cAbsOr:
- case cNot: case cAbsNot:
- case cNotNot: case cAbsNotNot:
- case cEqual: case cNEqual:
- case cLess: case cLessOrEq:
- case cGreater: case cGreaterOrEq:
- case cInt: case cFloor: case cCeil: case cTrunc:
- return true;
- default: break;
- }
- return false;
-}
-
-bool FUNCTIONPARSERTYPES::IsUnaryOpcode(unsigned op)
-{
- switch(op)
- {
- case cInv: case cNeg:
- case cNot: case cAbsNot:
- case cNotNot: case cAbsNotNot:
- case cSqr: case cRSqrt:
- case cDeg: case cRad:
- return true;
- }
- return (op < FUNC_AMOUNT && Functions[op].params == 1);
-}
-
-bool FUNCTIONPARSERTYPES::IsBinaryOpcode(unsigned op)
-{
- switch(op)
- {
- case cAdd: case cSub: case cRSub:
- case cMul: case cDiv: case cRDiv:
- case cMod:
- case cEqual: case cNEqual: case cLess:
- case cLessOrEq: case cGreater: case cGreaterOrEq:
- case cAnd: case cAbsAnd:
- case cOr: case cAbsOr:
- return true;
- }
- return (op < FUNC_AMOUNT && Functions[op].params == 2);
-}
-
-bool FUNCTIONPARSERTYPES::HasInvalidRangesOpcode(unsigned op)
-{
-#ifndef FP_NO_EVALUATION_CHECKS
- // Returns true, if the given opcode has a range of
- // input values that gives an error.
- switch(op)
- {
- case cAcos: // allowed range: |x| <= 1
- case cAsin: // allowed range: |x| <= 1
- case cAcosh: // allowed range: x >= 1
- case cAtanh: // allowed range: |x| < 1
- //case cCot: // note: no range, just separate values
- //case cCsc: // note: no range, just separate values
- case cLog: // allowed range: x > 0
- case cLog2: // allowed range: x > 0
- case cLog10: // allowed range: x > 0
-#ifdef FP_SUPPORT_OPTIMIZER
- case cLog2by: // allowed range: x > 0
-#endif
- //case cPow: // note: no range, just separate values
- //case cSec: // note: no range, just separate values
- case cSqrt: // allowed range: x >= 0
- case cRSqrt: // allowed range: x > 0
- //case cDiv: // note: no range, just separate values
- //case cRDiv: // note: no range, just separate values
- //case cInv: // note: no range, just separate values
- return true;
- }
-#endif
- return false;
-}
-
-
-//=========================================================================
-// Mathematical template functions
-//=========================================================================
-/* fp_pow() is a wrapper for std::pow()
- * that produces an identical value for
- * exp(1) ^ 2.0 (0x4000000000000000)
- * as exp(2.0) (0x4000000000000000)
- * - std::pow() on x86_64
- * produces 2.0 (0x3FFFFFFFFFFFFFFF) instead!
- * See comments below for other special traits.
- */
-namespace
-{
- template<typename ValueT>
- inline ValueT fp_pow_with_exp_log(const ValueT& x, const ValueT& y)
- {
- // Exponentiation using exp(log(x)*y).
- // See http://en.wikipedia.org/wiki/Exponentiation#Real_powers
- // Requirements: x > 0.
- return fp_exp(fp_log(x) * y);
- }
-
- template<typename ValueT>
- inline ValueT fp_powi(ValueT x, unsigned long y)
- {
- // Fast binary exponentiation algorithm
- // See http://en.wikipedia.org/wiki/Exponentiation_by_squaring
- // Requirements: y is non-negative integer.
- ValueT result(1);
- while(y != 0)
- {
- if(y & 1) { result *= x; y -= 1; }
- else { x *= x; y /= 2; }
- }
- return result;
- }
-}
-
-template<typename ValueT>
-ValueT FUNCTIONPARSERTYPES::fp_pow(const ValueT& x, const ValueT& y)
-{
- if(x == ValueT(1)) return ValueT(1);
- // y is now zero or positive
- if(isLongInteger(y))
- {
- // Use fast binary exponentiation algorithm
- if(y >= ValueT(0))
- return fp_powi(x, makeLongInteger(y));
- else
- return ValueT(1) / fp_powi(x, -makeLongInteger(y));
- }
- if(y >= ValueT(0))
- {
- // y is now positive. Calculate using exp(log(x)*y).
- if(x > ValueT(0)) return fp_pow_with_exp_log(x, y);
- if(x == ValueT(0)) return ValueT(0);
- // At this point, y > 0.0 and x is known to be < 0.0,
- // because positive and zero cases are already handled.
- if(!isInteger(y*ValueT(16)))
- return -fp_pow_with_exp_log(-x, y);
- // ^This is not technically correct, but it allows
- // functions such as cbrt(x^5), that is, x^(5/3),
- // to be evaluated when x is negative.
- // It is too complicated (and slow) to test whether y
- // is a formed from a ratio of an integer to an odd integer.
- // (And due to floating point inaccuracy, pointless too.)
- // For example, x^1.30769230769... is
- // actually x^(17/13), i.e. (x^17) ^ (1/13).
- // (-5)^(17/13) gives us now -8.204227562330453.
- // To see whether the result is right, we can test the given
- // root: (-8.204227562330453)^13 gives us the value of (-5)^17,
- // which proves that the expression was correct.
- //
- // The y*16 check prevents e.g. (-4)^(3/2) from being calculated,
- // as it would confuse functioninfo when pow() returns no error
- // but sqrt() does when the formula is converted into sqrt(x)*x.
- //
- // The errors in this approach are:
- // (-2)^sqrt(2) should produce NaN
- // or actually sqrt(2)I + 2^sqrt(2),
- // produces -(2^sqrt(2)) instead.
- // (Impact: Neglible)
- // Thus, at worst, we're changing a NaN (or complex)
- // result into a negative real number result.
- }
- else
- {
- // y is negative. Utilize the x^y = 1/(x^-y) identity.
- if(x > ValueT(0)) return fp_pow_with_exp_log(ValueT(1) / x, -y);
- if(x < ValueT(0))
- {
- if(!isInteger(y*ValueT(-16)))
- return -fp_pow_with_exp_log(ValueT(-1) / x, -y);
- // ^ See comment above.
- }
- // Remaining case: 0.0 ^ negative number
- }
- // This is reached when:
- // x=0, and y<0
- // x<0, and y*16 is either positive or negative integer
- // It is used for producing error values and as a safe fallback.
- return fp_pow_base(x, y);
-}
-
-
-//=========================================================================
-// Elementary (atom) parsing functions
-//=========================================================================
-namespace
-{
- /* Reads an UTF8-encoded sequence which forms a valid identifier name from
- the given input string and returns its length. If bit 31 is set, the
- return value also contains the internal function opcode (defined in
- fptypes.hh) that matches the name.
- */
- unsigned readIdentifierForFloatType(const char* input)
- {
- /* Assuming unsigned = 32 bits:
- 76543210 76543210 76543210 76543210
- Return value if built-in function:
- 1PPPPPPP PPPPPPPP LLLLLLLL LLLLLLLL
- P = function opcode (15 bits)
- L = function name length (16 bits)
- Return value if not built-in function:
- 0LLLLLLL LLLLLLLL LLLLLLLL LLLLLLLL
- L = identifier length (31 bits)
- If unsigned has more than 32 bits, the other
- higher order bits are to be assumed zero.
- */
-#include "fp_identifier_parser.inc"
- return 0;
- }
-
- inline unsigned readIdentifierForIntType(const char* input)
- {
- const unsigned value = readIdentifierForFloatType(input);
- if((value & 0x80000000U) != 0 &&
- !Functions[(value >> 16) & 0x7FFF].okForInt())
- return value & 0xFFFF;
- return value;
- }
-
- template<typename Value_t>
- inline unsigned readIdentifier(const char* input)
- {
- return IsIntType<Value_t>::result
- ? readIdentifierForIntType(input)
- : readIdentifierForFloatType(input);
- }
-
- // Returns true if the entire string is a valid identifier
- template<typename Value_t>
- bool containsOnlyValidIdentifierChars(const std::string& name)
- {
- if(name.empty()) return false;
- return readIdentifier<Value_t>(name.c_str()) == (unsigned) name.size();
- }
-
-
- // -----------------------------------------------------------------------
- // Wrappers for strto... functions
- // -----------------------------------------------------------------------
- template<typename Value_t>
- inline Value_t fp_parseLiteral(const char* str, char** endptr)
- {
- return strtod(str, endptr);
- }
-
-#ifdef FP_SUPPORT_FLOAT_TYPE
- template<>
- inline float fp_parseLiteral<float>(const char* str, char** endptr)
- {
- return strtof(str, endptr);
- }
-#endif
-
-#ifdef FP_SUPPORT_LONG_DOUBLE_TYPE
- template<>
- inline long double fp_parseLiteral<long double>(const char* str,
- char** endptr)
- {
- return strtold(str, endptr);
- }
-#endif
-
-#ifdef FP_SUPPORT_LONG_INT_TYPE
- template<>
- inline long fp_parseLiteral<long>(const char* str, char** endptr)
- {
- return strtol(str, endptr, 10);
- }
-#endif
-
-
- // -----------------------------------------------------------------------
- // Hexadecimal floating point literal parsing
- // -----------------------------------------------------------------------
- inline int testXdigit(unsigned c)
- {
- if((c-'0') < 10u) return c&15; // 0..9
- if(((c|0x20)-'a') < 6u) return 9+(c&15); // A..F or a..f
- return -1; // Not a hex digit
- }
-
- template<typename elem_t, unsigned n_limbs, unsigned limb_bits>
- inline void addXdigit(elem_t* buffer, unsigned nibble)
- {
- for(unsigned p=0; p<n_limbs; ++p)
- {
- unsigned carry = unsigned( buffer[p] >> (elem_t)(limb_bits-4) );
- buffer[p] = (buffer[p] << 4) | nibble;
- nibble = carry;
- }
- }
-
- template<typename Value_t>
- Value_t parseHexLiteral(const char* str, char** endptr)
- {
- const unsigned bits_per_char = 8;
-
- const int MantissaBits =
- std::numeric_limits<Value_t>::radix == 2
- ? std::numeric_limits<Value_t>::digits
- : (((sizeof(Value_t) * bits_per_char) &~ 3) - 4);
-
- typedef unsigned long elem_t;
- const int ExtraMantissaBits = 4 + ((MantissaBits+3)&~3); // Store one digit more for correct rounding
- const unsigned limb_bits = sizeof(elem_t) * bits_per_char;
- const unsigned n_limbs = (ExtraMantissaBits + limb_bits-1) / limb_bits;
- elem_t mantissa_buffer[n_limbs] = { 0 };
-
- int n_mantissa_bits = 0; // Track the number of bits
- int exponent = 0; // The exponent that will be used to multiply the mantissa
- // Read integer portion
- while(true)
- {
- int xdigit = testXdigit(*str);
- if(xdigit < 0) break;
- addXdigit<elem_t,n_limbs,limb_bits> (mantissa_buffer, xdigit);
- ++str;
-
- n_mantissa_bits += 4;
- if(n_mantissa_bits >= ExtraMantissaBits)
- {
- // Exhausted the precision. Parse the rest (until exponent)
- // normally but ignore the actual digits.
- for(; testXdigit(*str) >= 0; ++str)
- exponent += 4;
- // Read but ignore decimals
- if(*str == '.')
- for(++str; testXdigit(*str) >= 0; ++str)
- {}
- goto read_exponent;
- }
- }
- // Read decimals
- if(*str == '.')
- for(++str; ; )
- {
- int xdigit = testXdigit(*str);
- if(xdigit < 0) break;
- addXdigit<elem_t,n_limbs,limb_bits> (mantissa_buffer, xdigit);
- ++str;
-
- exponent -= 4;
- n_mantissa_bits += 4;
- if(n_mantissa_bits >= ExtraMantissaBits)
- {
- // Exhausted the precision. Skip the rest
- // of the decimals, until the exponent.
- while(testXdigit(*str) >= 0)
- ++str;
- break;
- }
- }
-
- // Read exponent
- read_exponent:
- if(*str == 'p' || *str == 'P')
- {
- const char* str2 = str+1;
- long p_exponent = strtol(str2, (char**) &str2, 10);
- if(str2 != str+1 && p_exponent == (long)(int)p_exponent)
- {
- exponent += (int)p_exponent;
- str = str2;
- }
- }
-
- if(endptr) *endptr = (char*) str;
-
- Value_t result = ldexp(Value_t(mantissa_buffer[0]), exponent);
- for(unsigned p=1; p<n_limbs; ++p)
- {
- exponent += limb_bits;
- result += ldexp(Value_t(mantissa_buffer[p]), exponent);
- }
- return result;
- }
-
-#ifdef FP_SUPPORT_LONG_INT_TYPE
- template<>
- long parseHexLiteral<long>(const char* str, char** endptr)
- {
- return strtol(str, endptr, 16);
- }
-#endif
-}
-
-//=========================================================================
-// Utility functions
-//=========================================================================
-namespace
-{
- // -----------------------------------------------------------------------
- // Add a new identifier to the specified identifier map
- // -----------------------------------------------------------------------
- // Return value will be false if the name already existed
- template<typename Value_t>
- bool addNewNameData(NamePtrsMap<Value_t>& namePtrs,
- std::pair<NamePtr, NameData<Value_t> >& newName,
- bool isVar)
- {
- typename NamePtrsMap<Value_t>::iterator nameIter =
- namePtrs.lower_bound(newName.first);
-
- if(nameIter != namePtrs.end() && newName.first == nameIter->first)
- {
- // redefining a var is not allowed.
- if(isVar) return false;
-
- // redefining other tokens is allowed, if the type stays the same.
- if(nameIter->second.type != newName.second.type)
- return false;
-
- // update the data
- nameIter->second = newName.second;
- return true;
- }
-
- if(!isVar)
- {
- // Allocate a copy of the name (pointer stored in the map key)
- // However, for VARIABLEs, the pointer points to VariableString,
- // which is managed separately. Thusly, only done when !IsVar.
- char* namebuf = new char[newName.first.nameLength];
- memcpy(namebuf, newName.first.name, newName.first.nameLength);
- newName.first.name = namebuf;
- }
-
- namePtrs.insert(nameIter, newName);
- return true;
- }
-}
-
-
-//=========================================================================
-// Data struct implementation
-//=========================================================================
-template<typename Value_t>
-FunctionParserBase<Value_t>::Data::Data():
- mReferenceCounter(1),
- mVariablesAmount(0),
- mStackSize(0)
-{}
-
-template<typename Value_t>
-FunctionParserBase<Value_t>::Data::Data(const Data& rhs):
- mReferenceCounter(0),
- mVariablesAmount(rhs.mVariablesAmount),
- mVariablesString(rhs.mVariablesString),
- mNamePtrs(),
- mFuncPtrs(rhs.mFuncPtrs),
- mFuncParsers(rhs.mFuncParsers),
- mByteCode(rhs.mByteCode),
- mImmed(rhs.mImmed),
-#ifndef FP_USE_THREAD_SAFE_EVAL
- mStack(rhs.mStackSize),
-#endif
- mStackSize(rhs.mStackSize)
-{
- for(typename NamePtrsMap<Value_t>::const_iterator i = rhs.mNamePtrs.begin();
- i != rhs.mNamePtrs.end();
- ++i)
- {
- if(i->second.type == NameData<Value_t>::VARIABLE)
- {
- const size_t variableStringOffset =
- i->first.name - rhs.mVariablesString.c_str();
- std::pair<NamePtr, NameData<Value_t> > tmp
- (NamePtr(&mVariablesString[variableStringOffset],
- i->first.nameLength),
- i->second);
- mNamePtrs.insert(mNamePtrs.end(), tmp);
- }
- else
- {
- std::pair<NamePtr, NameData<Value_t> > tmp
- (NamePtr(new char[i->first.nameLength], i->first.nameLength),
- i->second );
- memcpy(const_cast<char*>(tmp.first.name), i->first.name,
- tmp.first.nameLength);
- mNamePtrs.insert(mNamePtrs.end(), tmp);
- }
- }
-}
-
-template<typename Value_t>
-FunctionParserBase<Value_t>::Data::~Data()
-{
- for(typename NamePtrsMap<Value_t>::iterator i = mNamePtrs.begin();
- i != mNamePtrs.end();
- ++i)
- {
- if(i->second.type != NameData<Value_t>::VARIABLE)
- delete[] i->first.name;
- }
-}
-
-
-//=========================================================================
-// FunctionParser constructors, destructor and assignment
-//=========================================================================
-template<typename Value_t>
-FunctionParserBase<Value_t>::FunctionParserBase():
- mDelimiterChar(0),
- mParseErrorType(NO_FUNCTION_PARSED_YET), mEvalErrorType(0),
- mData(new Data),
- mUseDegreeConversion(false),
- mEvalRecursionLevel(0),
- mStackPtr(0), mErrorLocation(0)
-{
-}
-
-template<typename Value_t>
-FunctionParserBase<Value_t>::~FunctionParserBase()
-{
- if(--(mData->mReferenceCounter) == 0)
- delete mData;
-}
-
-template<typename Value_t>
-FunctionParserBase<Value_t>::FunctionParserBase(const FunctionParserBase& cpy):
- mDelimiterChar(cpy.mDelimiterChar),
- mParseErrorType(cpy.mParseErrorType),
- mEvalErrorType(cpy.mEvalErrorType),
- mData(cpy.mData),
- mUseDegreeConversion(cpy.mUseDegreeConversion),
- mEvalRecursionLevel(0),
- mStackPtr(0), mErrorLocation(0)
-{
- ++(mData->mReferenceCounter);
-}
-
-template<typename Value_t>
-FunctionParserBase<Value_t>&
-FunctionParserBase<Value_t>::operator=(const FunctionParserBase& cpy)
-{
- if(mData != cpy.mData)
- {
- if(--(mData->mReferenceCounter) == 0) delete mData;
-
- mDelimiterChar = cpy.mDelimiterChar;
- mParseErrorType = cpy.mParseErrorType;
- mEvalErrorType = cpy.mEvalErrorType;
- mData = cpy.mData;
- mUseDegreeConversion = cpy.mUseDegreeConversion;
- mEvalRecursionLevel = cpy.mEvalRecursionLevel;
-
- ++(mData->mReferenceCounter);
- }
-
- return *this;
-}
-
-
-template<typename Value_t>
-void FunctionParserBase<Value_t>::setDelimiterChar(char c)
-{
- mDelimiterChar = c;
-}
-
-
-//---------------------------------------------------------------------------
-// Copy-on-write method
-//---------------------------------------------------------------------------
-template<typename Value_t>
-void FunctionParserBase<Value_t>::CopyOnWrite()
-{
- if(mData->mReferenceCounter > 1)
- {
- Data* oldData = mData;
- mData = new Data(*oldData);
- --(oldData->mReferenceCounter);
- mData->mReferenceCounter = 1;
- }
-}
-
-template<typename Value_t>
-void FunctionParserBase<Value_t>::ForceDeepCopy()
-{
- CopyOnWrite();
-}
-
-
-//=========================================================================
-// User-defined identifier addition functions
-//=========================================================================
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::AddConstant(const std::string& name,
- Value_t value)
-{
- if(!containsOnlyValidIdentifierChars<Value_t>(name)) return false;
-
- CopyOnWrite();
- std::pair<NamePtr, NameData<Value_t> > newName
- (NamePtr(name.data(), unsigned(name.size())),
- NameData<Value_t>(NameData<Value_t>::CONSTANT, value));
-
- return addNewNameData(mData->mNamePtrs, newName, false);
-}
-
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::AddUnit(const std::string& name,
- Value_t value)
-{
- if(!containsOnlyValidIdentifierChars<Value_t>(name)) return false;
-
- CopyOnWrite();
- std::pair<NamePtr, NameData<Value_t> > newName
- (NamePtr(name.data(), unsigned(name.size())),
- NameData<Value_t>(NameData<Value_t>::UNIT, value));
- return addNewNameData(mData->mNamePtrs, newName, false);
-}
-
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::AddFunction
-(const std::string& name, FunctionPtr ptr, unsigned paramsAmount)
-{
- if(!containsOnlyValidIdentifierChars<Value_t>(name)) return false;
-
- CopyOnWrite();
- std::pair<NamePtr, NameData<Value_t> > newName
- (NamePtr(name.data(), unsigned(name.size())),
- NameData<Value_t>(NameData<Value_t>::FUNC_PTR,
- unsigned(mData->mFuncPtrs.size())));
-
- const bool success = addNewNameData(mData->mNamePtrs, newName, false);
- if(success)
- {
- mData->mFuncPtrs.push_back(typename Data::FuncPtrData());
- mData->mFuncPtrs.back().mFuncPtr = ptr;
- mData->mFuncPtrs.back().mParams = paramsAmount;
- }
- return success;
-}
-
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::CheckRecursiveLinking
-(const FunctionParserBase* fp) const
-{
- if(fp == this) return true;
- for(unsigned i = 0; i < fp->mData->mFuncParsers.size(); ++i)
- if(CheckRecursiveLinking(fp->mData->mFuncParsers[i].mParserPtr))
- return true;
- return false;
-}
-
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::AddFunction(const std::string& name,
- FunctionParserBase& fp)
-{
- if(!containsOnlyValidIdentifierChars<Value_t>(name) ||
- CheckRecursiveLinking(&fp))
- return false;
-
- CopyOnWrite();
- std::pair<NamePtr, NameData<Value_t> > newName
- (NamePtr(name.data(), unsigned(name.size())),
- NameData<Value_t>(NameData<Value_t>::PARSER_PTR,
- unsigned(mData->mFuncParsers.size())));
-
- const bool success = addNewNameData(mData->mNamePtrs, newName, false);
- if(success)
- {
- mData->mFuncParsers.push_back(typename Data::FuncPtrData());
- mData->mFuncParsers.back().mParserPtr = &fp;
- mData->mFuncParsers.back().mParams = fp.mData->mVariablesAmount;
- }
- return success;
-}
-
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::RemoveIdentifier(const std::string& name)
-{
- CopyOnWrite();
-
- NamePtr namePtr(name.data(), unsigned(name.size()));
-
- typename NamePtrsMap<Value_t>::iterator
- nameIter = mData->mNamePtrs.find(namePtr);
-
- if(nameIter != mData->mNamePtrs.end())
- {
- if(nameIter->second.type == NameData<Value_t>::VARIABLE)
- {
- // Illegal attempt to delete variables
- return false;
- }
- delete[] nameIter->first.name;
- mData->mNamePtrs.erase(nameIter);
- return true;
- }
- return false;
-}
-
-
-//=========================================================================
-// Function parsing
-//=========================================================================
-namespace
-{
- // Error messages returned by ErrorMsg():
- const char* const ParseErrorMessage[]=
- {
- "Syntax error", // 0
- "Mismatched parenthesis", // 1
- "Missing ')'", // 2
- "Empty parentheses", // 3
- "Syntax error: Operator expected", // 4
- "Not enough memory", // 5
- "An unexpected error occurred. Please make a full bug report "
- "to the author", // 6
- "Syntax error in parameter 'Vars' given to "
- "FunctionParser::Parse()", // 7
- "Illegal number of parameters to function", // 8
- "Syntax error: Premature end of string", // 9
- "Syntax error: Expecting ( after function", // 10
- "Syntax error: Unknown identifier", // 11
- "(No function has been parsed yet)",
- ""
- };
-
- template<typename Value_t>
- inline typename FunctionParserBase<Value_t>::ParseErrorType
- noCommaError(char c)
- {
- return c == ')' ?
- FunctionParserBase<Value_t>::ILL_PARAMS_AMOUNT :
- FunctionParserBase<Value_t>::SYNTAX_ERROR;
- }
-
- template<typename Value_t>
- inline typename FunctionParserBase<Value_t>::ParseErrorType
- noParenthError(char c)
- {
- return c == ',' ?
- FunctionParserBase<Value_t>::ILL_PARAMS_AMOUNT :
- FunctionParserBase<Value_t>::MISSING_PARENTH;
- }
-
- template<unsigned offset>
- struct IntLiteralMask
- {
- enum { mask =
- // ( 1UL << ('-'-offset)) |
- (0x3FFUL << ('0'-offset)) }; /* 0x3FF = 10 bits worth "1" */
- // Note: If you change fparser to support negative numbers parsing
- // (as opposed to parsing them as cNeg followed by literal),
- // enable the '-' line above, and change the offset value
- // in BeginsLiteral() to '-' instead of '.'.
- };
-
- template<typename Value_t, unsigned offset>
- struct LiteralMask
- {
- enum { mask =
- ( 1UL << ('.'-offset)) |
- IntLiteralMask<offset>::mask };
- };
-#ifdef FP_SUPPORT_LONG_INT_TYPE
- template<unsigned offset>
- struct LiteralMask<long, offset>: public IntLiteralMask<offset>
- {
- };
-#endif
-#ifdef FP_SUPPORT_GMP_INT_TYPE
- template<unsigned offset>
- struct LiteralMask<GmpInt, offset>: public IntLiteralMask<offset>
- {
- };
-#endif
-
- template<unsigned offset>
- struct SimpleSpaceMask
- {
- enum { mask =
- (1UL << ('\r'-offset)) |
- (1UL << ('\n'-offset)) |
- (1UL << ('\v'-offset)) |
- (1UL << ('\t'-offset)) |
- (1UL << (' ' -offset)) };
- };
-
- template<typename Value_t>
- inline bool BeginsLiteral(unsigned byte)
- {
- const unsigned n = sizeof(unsigned long)>=8 ? 0 : '.';
- byte -= n;
- if(byte > (unsigned char)('9'-n)) return false;
- unsigned long shifted = 1UL << byte;
- const unsigned long mask = LiteralMask<Value_t, n>::mask;
- return (mask & shifted) != 0;
- }
-
- template<typename CharPtr>
- inline void SkipSpace(CharPtr& function)
- {
-/*
- Space characters in unicode:
-U+0020 SPACE Depends on font, often adjusted (see below)
-U+00A0 NO-BREAK SPACE As a space, but often not adjusted
-U+2000 EN QUAD 1 en (= 1/2 em)
-U+2001 EM QUAD 1 em (nominally, the height of the font)
-U+2002 EN SPACE 1 en (= 1/2 em)
-U+2003 EM SPACE 1 em
-U+2004 THREE-PER-EM SPACE 1/3 em
-U+2005 FOUR-PER-EM SPACE 1/4 em
-U+2006 SIX-PER-EM SPACE 1/6 em
-U+2007 FIGURE SPACE Tabular width, the width of digits
-U+2008 PUNCTUATION SPACE The width of a period .
-U+2009 THIN SPACE 1/5 em (or sometimes 1/6 em)
-U+200A HAIR SPACE Narrower than THIN SPACE
-U+200B ZERO WIDTH SPACE Nominally no width, but may expand
-U+202F NARROW NO-BREAK SPACE Narrower than NO-BREAK SPACE (or SPACE)
-U+205F MEDIUM MATHEMATICAL SPACE 4/18 em
-U+3000 IDEOGRAPHIC SPACE The width of ideographic (CJK) characters.
- Also:
-U+000A \n
-U+000D \r
-U+0009 \t
-U+000B \v
- As UTF-8 sequences:
- 09
- 0A
- 0B
- 0D
- 20
- C2 A0
- E2 80 80-8B
- E2 80 AF
- E2 81 9F
- E3 80 80
-*/
- while(true)
- {
- const unsigned n = sizeof(unsigned long)>=8 ? 0 : '\t';
- typedef signed char schar;
- unsigned byte = (unsigned char)*function;
- byte -= n;
- // ^Note: values smaller than n intentionally become
- // big values here due to integer wrap. The
- // comparison below thus excludes them, making
- // the effective range 0x09..0x20 (32-bit)
- // or 0x00..0x20 (64-bit) within the if-clause.
- if(byte <= (unsigned char)(' '-n))
- {
- unsigned long shifted = 1UL << byte;
- const unsigned long mask = SimpleSpaceMask<n>::mask;
- if(mask & shifted)
- { ++function; continue; } // \r, \n, \t, \v and space
- break;
- }
- if(likely(byte < 0xC2-n)) break;
-
- if(byte == 0xC2-n && function[1] == char(0xA0))
- { function += 2; continue; } // U+00A0
- if(byte == 0xE3-n &&
- function[1] == char(0x80) && function[2] == char(0x80))
- { function += 3; continue; } // U+3000
- if(byte == 0xE2-n)
- {
- if(function[1] == char(0x81))
- {
- if(function[2] != char(0x9F)) break;
- function += 3; // U+205F
- continue;
- }
- if(function[1] == char(0x80))
- if(function[2] == char(0xAF) || // U+202F
- schar(function[2]) <= schar(0x8B) // U+2000..U+200B
- )
- {
- function += 3;
- continue;
- }
- }
- break;
- } // while(true)
- } // SkipSpace(CharPtr& function)
-}
-
-// ---------------------------------------------------------------------------
-// Return parse error message
-// ---------------------------------------------------------------------------
-template<typename Value_t>
-const char* FunctionParserBase<Value_t>::ErrorMsg() const
-{
- return ParseErrorMessage[mParseErrorType];
-}
-
-
-// ---------------------------------------------------------------------------
-// Parse variables
-// ---------------------------------------------------------------------------
-template<typename Value_t>
-bool FunctionParserBase<Value_t>::ParseVariables
-(const std::string& inputVarString)
-{
- if(mData->mVariablesString == inputVarString) return true;
-
- /* Delete existing variables from mNamePtrs */
- for(typename NamePtrsMap<Value_t>::iterator i =
- mData->mNamePtrs.begin();
- i != mData->mNamePtrs.end(); )
- {
- if(i->second.type == NameData<Value_t>::VARIABLE)
- {
- typename NamePtrsMap<Value_t>::iterator j (i);
- ++i;
- mData->mNamePtrs.erase(j);
- }
- else ++i;
- }
- mData->mVariablesString = inputVarString;
-
- const std::string& vars = mData->mVariablesString;
- const unsigned len = unsigned(vars.size());
-
- unsigned varNumber = VarBegin;
-
- const char* beginPtr = vars.c_str();
- const char* finalPtr = beginPtr + len;
- while(beginPtr < finalPtr)
- {
- SkipSpace(beginPtr);
- unsigned nameLength = readIdentifier<Value_t>(beginPtr);
- if(nameLength == 0 || (nameLength & 0x80000000U)) return false;
- const char* endPtr = beginPtr + nameLength;
- SkipSpace(endPtr);
- if(endPtr != finalPtr && *endPtr != ',') return false;
-
- std::pair<NamePtr, NameData<Value_t> > newName
- (NamePtr(beginPtr, nameLength),
- NameData<Value_t>(NameData<Value_t>::VARIABLE, varNumber++));
-
- if(!addNewNameData(mData->mNamePtrs, newName, true))
- {
- return false;
- }
-
- beginPtr = endPtr + 1;
- }
-
- mData->mVariablesAmount = varNumber - VarBegin;
- return true;
-}
-
-// ---------------------------------------------------------------------------
-// Parse() public interface functions
-// ---------------------------------------------------------------------------
-template<typename Value_t>
-int FunctionParserBase<Value_t>::Parse(const char* Function,
- const std::string& Vars,
- bool useDegrees)
-{
- CopyOnWrite();
-
- if(!ParseVariables(Vars))
- {
- mParseErrorType = INVALID_VARS;
- return int(strlen(Function));
- }
-
- return ParseFunction(Function, useDegrees);
-}
-
-template<typename Value_t>
-int FunctionParserBase<Value_t>::Parse(const std::string& Function,
- const std::string& Vars,
- bool useDegrees)
-{
- CopyOnWrite();
-
- if(!ParseVariables(Vars))
- {
- mParseErrorType = INVALID_VARS;
- return int(Function.size());
- }
-
- return ParseFunction(Function.c_str(), useDegrees);
-}
-
-
-// ---------------------------------------------------------------------------
-// Main parsing function
-// ---------------------------------------------------------------------------
-template<typename Value_t>
-int FunctionParserBase<Value_t>::ParseFunction(const char* function,
- bool useDegrees)
-{
- mUseDegreeConversion = useDegrees;
- mParseErrorType = FP_NO_ERROR;
-
- mData->mInlineVarNames.clear();
- mData->mByteCode.clear(); mData->mByteCode.reserve(128);
- mData->mImmed.clear(); mData->mImmed.reserve(128);
- mData->mStackSize = mStackPtr = 0;
-
- mHasByteCodeFlags = false;
-
- const char* ptr = Compile(function);
- mData->mInlineVarNames.clear();
-
- if(mHasByteCodeFlags)
- {
- for(unsigned i = unsigned(mData->mByteCode.size()); i-- > 0; )
- mData->mByteCode[i] &= ~0x80000000U;
- }
-
- if(mParseErrorType != FP_NO_ERROR) return int(mErrorLocation - function);
-
- assert(ptr); // Should never be null at this point. It's a bug otherwise.
- if(*ptr)
- {
- if(mDelimiterChar == 0 || *ptr != mDelimiterChar)
- mParseErrorType = EXPECT_OPERATOR;
- return int(ptr - function);
- }
-
-#ifndef FP_USE_THREAD_SAFE_EVAL
- mData->mStack.resize(mData->mStackSize);
-#endif
-
- return -1;
-}
-
-
-//=========================================================================
-// Parsing and bytecode compiling functions
-//=========================================================================
-template<typename Value_t>
-inline const char* FunctionParserBase<Value_t>::SetErrorType(ParseErrorType t,
- const char* pos)
-{
- mParseErrorType = t;
- mErrorLocation = pos;
- return 0;
-}
-
-template<typename Value_t>
-inline void FunctionParserBase<Value_t>::incStackPtr()
-{
- if(++mStackPtr > mData->mStackSize) ++(mData->mStackSize);
-}
-
-namespace
-{
- const unsigned char powi_factor_table[128] =
- {
- 0,1,0,0,0,0,0,0, 0, 0,0,0,0,0,0,3,/* 0 - 15 */
- 0,0,0,0,0,0,0,0, 0, 5,0,3,0,0,3,0,/* 16 - 31 */
- 0,0,0,0,0,0,0,3, 0, 0,0,0,0,5,0,0,/* 32 - 47 */
- 0,0,5,3,0,0,3,5, 0, 3,0,0,3,0,0,3,/* 48 - 63 */
- 0,0,0,0,0,0,0,0, 0, 0,0,3,0,0,3,0,/* 64 - 79 */
- 0,9,0,0,0,5,0,3, 0, 0,5,7,0,0,0,5,/* 80 - 95 */
- 0,0,0,3,5,0,3,0, 0, 3,0,0,3,0,5,3,/* 96 - 111 */
- 0,0,3,5,0,9,0,7, 3,11,0,3,0,5,3,0,/* 112 - 127 */
- };
-
- inline int get_powi_factor(long abs_int_exponent)
- {
- if(abs_int_exponent >= int(sizeof(powi_factor_table))) return 0;
- return powi_factor_table[abs_int_exponent];
- }
-
-#if 0
- int EstimatePowiComplexity(int abs_int_exponent)
- {
- int cost = 0;
- while(abs_int_exponent > 1)
- {
- int factor = get_powi_factor(abs_int_exponent);
- if(factor)
- {
- cost += EstimatePowiComplexity(factor);
- abs_int_exponent /= factor;
- continue;
- }
- if(!(abs_int_exponent & 1))
- {
- abs_int_exponent /= 2;
- cost += 3; // sqr
- }
- else
- {
- cost += 4; // dup+mul
- abs_int_exponent -= 1;
- }
- }
- return cost;
- }
-#endif
-
- bool IsEligibleIntPowiExponent(long int_exponent)
- {
- if(int_exponent == 0) return false;
- long abs_int_exponent = int_exponent;
- #if 0
- int cost = 0;
-
- if(abs_int_exponent < 0)
- {
- cost += 11;
- abs_int_exponent = -abs_int_exponent;
- }
-
- cost += EstimatePowiComplexity(abs_int_exponent);
-
- return cost < (10*3 + 4*4);
- #else
- if(abs_int_exponent < 0) abs_int_exponent = -abs_int_exponent;
-
- return (abs_int_exponent >= 1)
- && (abs_int_exponent <= 46 ||
- (abs_int_exponent <= 1024 &&
- (abs_int_exponent & (abs_int_exponent - 1)) == 0));
- #endif
- }
-
-#ifdef FP_EPSILON
- const double EpsilonOrZero = FP_EPSILON;
-#else
- const double EpsilonOrZero = 0.0;
-#endif
-
-}
-
-template<typename Value_t>
-inline void FunctionParserBase<Value_t>::AddImmedOpcode(Value_t value)
-{
- mData->mImmed.push_back(value);
- mData->mByteCode.push_back(cImmed);
-}
-
-template<typename Value_t>
-inline void FunctionParserBase<Value_t>::CompilePowi(long abs_int_exponent)
-{
- int num_muls=0;
- while(abs_int_exponent > 1)
- {
- long factor = get_powi_factor(abs_int_exponent);
- if(factor)
- {
- CompilePowi(factor);
- abs_int_exponent /= factor;
- continue;
- }
- if(!(abs_int_exponent & 1))
- {
- abs_int_exponent /= 2;
- mData->mByteCode.push_back(cSqr);
- // ^ Don't put AddFunctionOpcode here,
- // it would slow down a great deal.
- }
- else
- {
- mData->mByteCode.push_back(cDup);
- incStackPtr();
- abs_int_exponent -= 1;
- ++num_muls;
- }
- }
- if(num_muls > 0)
- {
- mData->mByteCode.resize(mData->mByteCode.size()+num_muls, cMul);
- mStackPtr -= num_muls;
- }
-}
-
-template<typename Value_t>
-inline bool FunctionParserBase<Value_t>::TryCompilePowi(Value_t original_immed)
-{
- Value_t changed_immed = original_immed;
- for(int sqrt_count=0; /**/; ++sqrt_count)
- {
- long int_exponent = makeLongInteger(changed_immed);
- if(isLongInteger(changed_immed) &&
- IsEligibleIntPowiExponent(int_exponent))
- {
- long abs_int_exponent = int_exponent;
- if(abs_int_exponent < 0)
- abs_int_exponent = -abs_int_exponent;
-
- mData->mImmed.pop_back(); mData->mByteCode.pop_back();
- --mStackPtr;
- // ^Though the above is accounted for by the procedure
- // that generates cPow, we need it for correct cFetch
- // indexes in CompilePowi().
-
- while(sqrt_count > 0)
- {
- int opcode = cSqrt;
- if(sqrt_count == 1 && int_exponent < 0)
- {
- opcode = cRSqrt;
- int_exponent = -int_exponent;
- }
- mData->mByteCode.push_back(opcode);
- --sqrt_count;
- }
- if((abs_int_exponent & 1) == 0)
- {
- // This special rule fixes the optimization
- // shortcoming of (-x)^2 with minimal overhead.
- AddFunctionOpcode(cSqr);
- abs_int_exponent >>= 1;
- }
- CompilePowi(abs_int_exponent);
- if(int_exponent < 0) mData->mByteCode.push_back(cInv);
- ++mStackPtr; // Needed because cPow adding will assume this.
- return true;
- }
- if(sqrt_count >= 4) break;
- changed_immed += changed_immed;
- }
-
- // When we don't know whether x >= 0, we still know that
- // x^y can be safely converted into exp(y * log(x))
- // when y is _not_ integer, because we know that x >= 0.
- // Otherwise either expression will give a NaN.
- if(/*!isInteger(original_immed) ||*/
- IsNeverNegativeValueOpcode(mData->mByteCode[mData->mByteCode.size()-2]))
- {
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- //--mStackPtr; - accounted for by the procedure that generates cPow
- AddFunctionOpcode(cLog);
- AddImmedOpcode(original_immed);
- //incStackPtr(); - this and the next are redundant because...
- AddFunctionOpcode(cMul);
- //--mStackPtr; - ...because the cImmed was popped earlier.
- AddFunctionOpcode(cExp);
- return true;
- }
- return false;
-}
-
-//#include "fpoptimizer/opcodename.hh"
-// ^ needed only if FP_TRACE_BYTECODE_OPTIMIZATION() is used
-
-template<typename Value_t>
-inline void FunctionParserBase<Value_t>::AddFunctionOpcode(unsigned opcode)
-{
-#define FP_FLOAT_VERSION 1
-#include "fp_opcode_add.inc"
-#undef FP_FLOAT_VERSION
-}
-
-#ifdef FP_SUPPORT_LONG_INT_TYPE
-template<>
-inline void FunctionParserBase<long>::AddFunctionOpcode(unsigned opcode)
-{
- typedef long Value_t;
-#define FP_FLOAT_VERSION 0
-#include "fp_opcode_add.inc"
-#undef FP_FLOAT_VERSION
-}
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-template<>
-inline void FunctionParserBase<GmpInt>::AddFunctionOpcode(unsigned opcode)
-{
- typedef GmpInt Value_t;
-#define FP_FLOAT_VERSION 0
-#include "fp_opcode_add.inc"
-#undef FP_FLOAT_VERSION
-}
-#endif
-
-template<typename Value_t>
-unsigned
-FunctionParserBase<Value_t>::ParseIdentifier(const char* function)
-{
- return readIdentifier<Value_t>(function);
-}
-
-template<typename Value_t>
-std::pair<const char*, Value_t>
-FunctionParserBase<Value_t>::ParseLiteral(const char* function)
-{
- char* endptr;
-#if 0 /* Profile the hex literal parser */
- if(function[0]=='0' && function[1]=='x')
- {
- // Parse hexadecimal literal if fp_parseLiteral didn't already
- Value_t val = parseHexLiteral<Value_t>(function+2, &endptr);
- if(endptr == function+2)
- return std::pair<const char*,Value_t> (function, Value_t());
- return std::pair<const char*, Value_t> (endptr, val);
- }
-#endif
- Value_t val = fp_parseLiteral<Value_t>(function, &endptr);
-
- if(endptr == function+1 && function[0] == '0' && function[1] == 'x')
- {
- // Parse hexadecimal literal if fp_parseLiteral didn't already
- val = parseHexLiteral<Value_t>(function+2, &endptr);
- if(endptr == function+2)
- return std::pair<const char*,Value_t> (function, Value_t());
- }
- else if(endptr == function)
- return std::pair<const char*,Value_t> (function, Value_t());
-
- return std::pair<const char*,Value_t> (endptr, val);
-}
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
-template<>
-std::pair<const char*, MpfrFloat>
-FunctionParserBase<MpfrFloat>::ParseLiteral(const char* function)
-{
- char* endPtr;
- const MpfrFloat val = MpfrFloat::parseString(function, &endPtr);
- if(endPtr == function)
- return std::pair<const char*,MpfrFloat> (function, MpfrFloat());
- return std::pair<const char*,MpfrFloat> (endPtr, val);
-}
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-template<>
-std::pair<const char*, GmpInt>
-FunctionParserBase<GmpInt>::ParseLiteral(const char* function)
-{
- char* endPtr;
- const GmpInt val = GmpInt::parseString(function, &endPtr);
- if(endPtr == function)
- return std::pair<const char*,GmpInt> (function, GmpInt());
- return std::pair<const char*,GmpInt> (endPtr, val);
-}
-#endif
-
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompileLiteral(const char* function)
-{
- std::pair<const char*, Value_t> result = ParseLiteral(function);
-
- if(result.first == function)
- return SetErrorType(SYNTAX_ERROR, result.first);
-
- AddImmedOpcode(result.second);
- incStackPtr();
- SkipSpace(result.first);
- return result.first;
-}
-
-template<typename Value_t>
-const char* FunctionParserBase<Value_t>::CompileIf(const char* function)
-{
- if(*function != '(') return SetErrorType(EXPECT_PARENTH_FUNC, function);
-
- function = CompileExpression(function+1);
- if(!function) return 0;
- if(*function != ',')
- return SetErrorType(noCommaError<Value_t>(*function), function);
-
- OPCODE opcode = cIf;
- if(mData->mByteCode.back() == cNotNot) mData->mByteCode.pop_back();
- if(IsNeverNegativeValueOpcode(mData->mByteCode.back()))
- {
- // If we know that the condition to be tested is always
- // a positive value (such as when produced by "x<y"),
- // we can use the faster opcode to evaluate it.
- // cIf tests whether fabs(cond) >= 0.5,
- // cAbsIf simply tests whether cond >= 0.5.
- opcode = cAbsIf;
- }
-
- mData->mByteCode.push_back(opcode);
- const unsigned curByteCodeSize = unsigned(mData->mByteCode.size());
- PushOpcodeParam<false>(0); // Jump index; to be set later
- PushOpcodeParam<true> (0); // Immed jump index; to be set later
-
- --mStackPtr;
-
- function = CompileExpression(function + 1);
- if(!function) return 0;
- if(*function != ',')
- return SetErrorType(noCommaError<Value_t>(*function), function);
-
- mData->mByteCode.push_back(cJump);
- const unsigned curByteCodeSize2 = unsigned(mData->mByteCode.size());
- const unsigned curImmedSize2 = unsigned(mData->mImmed.size());
- PushOpcodeParam<false>(0); // Jump index; to be set later
- PushOpcodeParam<true> (0); // Immed jump index; to be set later
-
- --mStackPtr;
-
- function = CompileExpression(function + 1);
- if(!function) return 0;
- if(*function != ')')
- return SetErrorType(noParenthError<Value_t>(*function), function);
-
- PutOpcodeParamAt<true> ( mData->mByteCode.back(), unsigned(mData->mByteCode.size()-1) );
- // ^Necessary for guarding against if(x,1,2)+1 being changed
- // into if(x,1,3) by fp_opcode_add.inc
-
- // Set jump indices
- PutOpcodeParamAt<false>( curByteCodeSize2+1, curByteCodeSize );
- PutOpcodeParamAt<false>( curImmedSize2, curByteCodeSize+1 );
- PutOpcodeParamAt<false>( unsigned(mData->mByteCode.size())-1, curByteCodeSize2);
- PutOpcodeParamAt<false>( unsigned(mData->mImmed.size()), curByteCodeSize2+1);
-
- ++function;
- SkipSpace(function);
- return function;
-}
-
-template<typename Value_t>
-const char* FunctionParserBase<Value_t>::CompileFunctionParams
-(const char* function, unsigned requiredParams)
-{
- if(*function != '(') return SetErrorType(EXPECT_PARENTH_FUNC, function);
-
- if(requiredParams > 0)
- {
- const char* function_end = CompileExpression(function+1);
- if(!function_end)
- {
- // If an error occurred, verify whether it was caused by ()
- ++function;
- SkipSpace(function);
- if(*function == ')')
- return SetErrorType(ILL_PARAMS_AMOUNT, function);
- // Not caused by (), use the error message given by CompileExpression()
- return 0;
- }
- function = function_end;
-
- for(unsigned i = 1; i < requiredParams; ++i)
- {
- if(*function != ',')
- return SetErrorType(noCommaError<Value_t>(*function), function);
-
- function = CompileExpression(function+1);
- if(!function) return 0;
- }
- // No need for incStackPtr() because each parse parameter calls it
- mStackPtr -= requiredParams-1;
- }
- else
- {
- incStackPtr(); // return value of function is pushed onto the stack
- ++function;
- SkipSpace(function);
- }
-
- if(*function != ')')
- return SetErrorType(noParenthError<Value_t>(*function), function);
- ++function;
- SkipSpace(function);
- return function;
-}
-
-template<typename Value_t>
-const char* FunctionParserBase<Value_t>::CompileElement(const char* function)
-{
- if(BeginsLiteral<Value_t>( (unsigned char) *function))
- return CompileLiteral(function);
-
- unsigned nameLength = readIdentifier<Value_t>(function);
- if(nameLength == 0)
- {
- // No identifier found
- if(*function == '(') return CompileParenthesis(function);
- if(*function == ')') return SetErrorType(MISM_PARENTH, function);
- return SetErrorType(SYNTAX_ERROR, function);
- }
-
- // Function, variable or constant
- if(nameLength & 0x80000000U) // Function
- {
- OPCODE func_opcode = OPCODE( (nameLength >> 16) & 0x7FFF );
- return CompileFunction(function + (nameLength & 0xFFFF), func_opcode);
- }
-
- NamePtr name(function, nameLength);
- const char* endPtr = function + nameLength;
- SkipSpace(endPtr);
-
- typename NamePtrsMap<Value_t>::iterator nameIter =
- mData->mNamePtrs.find(name);
- if(nameIter == mData->mNamePtrs.end())
- {
- // Check if it's an inline variable:
- for(typename Data::InlineVarNamesContainer::reverse_iterator iter =
- mData->mInlineVarNames.rbegin();
- iter != mData->mInlineVarNames.rend();
- ++iter)
- {
- if(name == iter->mName)
- {
- if( iter->mFetchIndex+1 == mStackPtr)
- {
- mData->mByteCode.push_back(cDup);
- }
- else
- {
- mData->mByteCode.push_back(cFetch);
- PushOpcodeParam<true>(iter->mFetchIndex);
- }
- incStackPtr();
- return endPtr;
- }
- }
-
- return SetErrorType(UNKNOWN_IDENTIFIER, function);
- }
-
- const NameData<Value_t>* nameData = &nameIter->second;
- switch(nameData->type)
- {
- case NameData<Value_t>::VARIABLE: // is variable
- if(unlikely(!mData->mByteCode.empty() &&
- mData->mByteCode.back() == nameData->index))
- mData->mByteCode.push_back(cDup);
- else
- mData->mByteCode.push_back(nameData->index);
- incStackPtr();
- return endPtr;
-
- case NameData<Value_t>::CONSTANT: // is constant
- AddImmedOpcode(nameData->value);
- incStackPtr();
- return endPtr;
-
- case NameData<Value_t>::UNIT: // is unit (error if appears here)
- break;
-
- case NameData<Value_t>::FUNC_PTR: // is C++ function
- function = CompileFunctionParams
- (endPtr, mData->mFuncPtrs[nameData->index].mParams);
- //if(!function) return 0;
- mData->mByteCode.push_back(cFCall);
- PushOpcodeParam<true>(nameData->index);
- return function;
-
- case NameData<Value_t>::PARSER_PTR: // is FunctionParser
- function = CompileFunctionParams
- (endPtr, mData->mFuncParsers[nameData->index].mParams);
- //if(!function) return 0;
- mData->mByteCode.push_back(cPCall);
- PushOpcodeParam<true>(nameData->index);
- return function;
- }
-
- // When it's an unit (or unrecognized type):
- return SetErrorType(SYNTAX_ERROR, function);
-}
-
-template<typename Value_t>
-inline const char* FunctionParserBase<Value_t>::CompileFunction
-(const char* function, unsigned func_opcode)
-{
- SkipSpace(function);
- const FuncDefinition& funcDef = Functions[func_opcode];
-
- if(func_opcode == cIf) // "if" is a special case
- return CompileIf(function);
-
- unsigned requiredParams = funcDef.params;
-#ifndef FP_DISABLE_EVAL
- if(func_opcode == cEval)
- requiredParams = mData->mVariablesAmount;
-#endif
-
- function = CompileFunctionParams(function, requiredParams);
- if(!function) return 0;
-
- if(mUseDegreeConversion)
- {
- if(funcDef.flags & FuncDefinition::AngleIn)
- AddFunctionOpcode(cRad);
-
- AddFunctionOpcode(func_opcode);
-
- if(funcDef.flags & FuncDefinition::AngleOut)
- AddFunctionOpcode(cDeg);
- }
- else
- {
- AddFunctionOpcode(func_opcode);
- }
- return function;
-}
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompileParenthesis(const char* function)
-{
- ++function; // Skip '('
-
- SkipSpace(function);
- if(*function == ')') return SetErrorType(EMPTY_PARENTH, function);
- function = CompileExpression(function);
- if(!function) return 0;
-
- if(*function != ')') return SetErrorType(MISSING_PARENTH, function);
- ++function; // Skip ')'
-
- SkipSpace(function);
- return function;
-}
-
-template<typename Value_t>
-const char*
-FunctionParserBase<Value_t>::CompilePossibleUnit(const char* function)
-{
- unsigned nameLength = readIdentifier<Value_t>(function);
- if(nameLength & 0x80000000U) return function; // built-in function name
- if(nameLength != 0)
- {
- NamePtr name(function, nameLength);
-
- typename NamePtrsMap<Value_t>::iterator nameIter =
- mData->mNamePtrs.find(name);
- if(nameIter != mData->mNamePtrs.end())
- {
- const NameData<Value_t>* nameData = &nameIter->second;
- if(nameData->type == NameData<Value_t>::UNIT)
- {
- AddImmedOpcode(nameData->value);
- incStackPtr();
- AddFunctionOpcode(cMul);
- --mStackPtr;
-
- const char* endPtr = function + nameLength;
- SkipSpace(endPtr);
- return endPtr;
- }
- }
- }
-
- return function;
-}
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompilePow(const char* function)
-{
- function = CompileElement(function);
- if(!function) return 0;
- function = CompilePossibleUnit(function);
-
- if(*function == '^')
- {
- ++function;
- SkipSpace(function);
-
- unsigned op = cPow;
- if(mData->mByteCode.back() == cImmed)
- {
- if(mData->mImmed.back() == fp_const_e<Value_t>())
- { op = cExp; mData->mByteCode.pop_back();
- mData->mImmed.pop_back(); --mStackPtr; }
- else if(mData->mImmed.back() == Value_t(2))
- { op = cExp2; mData->mByteCode.pop_back();
- mData->mImmed.pop_back(); --mStackPtr; }
- }
-
- function = CompileUnaryMinus(function);
- if(!function) return 0;
-
- // add opcode
- AddFunctionOpcode(op);
-
- if(op == cPow) --mStackPtr;
- }
- return function;
-}
-
-/* Currently the power operator is skipped for integral types because its
- usefulness with them is questionable, and in the case of GmpIng, for safety
- reasons.
- - With long int almost any power, except for very small ones, would
- overflow the result, so the usefulness of this is rather questionable.
- - With GmpInt the power operator could be easily abused to make the program
- run out of memory (think of a function like "10^10^10^10^1000000").
-*/
-#ifdef FP_SUPPORT_LONG_INT_TYPE
-template<>
-inline const char*
-FunctionParserBase<long>::CompilePow(const char* function)
-{
- function = CompileElement(function);
- if(!function) return 0;
- return CompilePossibleUnit(function);
-}
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-template<>
-inline const char*
-FunctionParserBase<GmpInt>::CompilePow(const char* function)
-{
- function = CompileElement(function);
- if(!function) return 0;
- return CompilePossibleUnit(function);
-}
-#endif
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompileUnaryMinus(const char* function)
-{
- char op = *function;
- switch(op)
- {
- case '-':
- case '!':
- ++function;
- SkipSpace(function);
-
- function = CompileUnaryMinus(function);
- if(!function) return 0;
-
- AddFunctionOpcode(op=='-' ? cNeg : cNot);
-
- return function;
- default: break;
- }
- return CompilePow(function);
-}
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompileMult(const char* function)
-{
- function = CompileUnaryMinus(function);
- if(!function) return 0;
-
- Value_t pending_immed(1);
- #define FP_FlushImmed(do_reset) \
- if(pending_immed != Value_t(1)) \
- { \
- unsigned op = cMul; \
- if(!IsIntType<Value_t>::result && mData->mByteCode.back() == cInv) \
- { \
- /* (...) cInv 5 cMul -> (...) 5 cRDiv */ \
- /* ^ ^ | */ \
- mData->mByteCode.pop_back(); \
- op = cRDiv; \
- } \
- AddImmedOpcode(pending_immed); \
- incStackPtr(); \
- AddFunctionOpcode(op); \
- --mStackPtr; \
- if(do_reset) pending_immed = Value_t(1); \
- }
- while(true)
- {
- char c = *function;
- if(c == '%')
- {
- FP_FlushImmed(true);
- ++function;
- SkipSpace(function);
- function = CompileUnaryMinus(function);
- if(!function) return 0;
- AddFunctionOpcode(cMod);
- --mStackPtr;
- continue;
- }
- if(c != '*' && c != '/') break;
-
- bool safe_cumulation = (c == '*' || !IsIntType<Value_t>::result);
- if(!safe_cumulation)
- {
- FP_FlushImmed(true);
- }
-
- ++function;
- SkipSpace(function);
- if(mData->mByteCode.back() == cImmed
- && (safe_cumulation
- || mData->mImmed.back() == Value_t(1)))
- {
- // 5 (...) cMul --> (...) ||| 5 cMul
- // 5 (...) cDiv --> (...) cInv ||| 5 cMul
- // ^ | ^
- pending_immed *= mData->mImmed.back();
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- --mStackPtr;
- function = CompileUnaryMinus(function);
- if(!function) return 0;
- if(c == '/')
- AddFunctionOpcode(cInv);
- continue;
- }
- if(safe_cumulation
- && mData->mByteCode.back() == cMul
- && mData->mByteCode[mData->mByteCode.size()-2] == cImmed)
- {
- // (:::) 5 cMul (...) cMul -> (:::) (...) cMul ||| 5 cMul
- // (:::) 5 cMul (...) cDiv -> (:::) (...) cDiv ||| 5 cMul
- // ^ ^
- pending_immed *= mData->mImmed.back();
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- mData->mByteCode.pop_back();
- }
- // cDiv is not tested here because the bytecode
- // optimizer will convert this kind of cDivs into cMuls.
- bool lhs_inverted = false;
- if(!IsIntType<Value_t>::result && c == '*'
- && mData->mByteCode.back() == cInv)
- {
- // (:::) cInv (...) cMul -> (:::) (...) cRDiv
- // (:::) cInv (...) cDiv -> (:::) (...) cMul cInv
- // ^ ^ |
- mData->mByteCode.pop_back();
- lhs_inverted = true;
- }
- function = CompileUnaryMinus(function);
- if(!function) return 0;
- if(safe_cumulation
- && mData->mByteCode.back() == cMul
- && mData->mByteCode[mData->mByteCode.size()-2] == cImmed)
- {
- // (:::) (...) 5 cMul cMul -> (:::) (...) cMul ||| 5 Mul
- // (:::) (...) 5 cMul cDiv -> (:::) (...) cDiv ||| /5 Mul
- // ^ ^
- if(c == '*')
- pending_immed *= mData->mImmed.back();
- else
- pending_immed /= mData->mImmed.back();
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- mData->mByteCode.pop_back();
- }
- else
- if(safe_cumulation
- && mData->mByteCode.back() == cRDiv
- && mData->mByteCode[mData->mByteCode.size()-2] == cImmed)
- {
- // (:::) (...) 5 cRDiv cMul -> (:::) (...) cDiv ||| 5 cMul
- // (:::) (...) 5 cRDiv cDiv -> (:::) (...) cMul ||| /5 cMul
- // ^ ^
- if(c == '*')
- { c = '/'; pending_immed *= mData->mImmed.back(); }
- else
- { c = '*'; pending_immed /= mData->mImmed.back(); }
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- mData->mByteCode.pop_back();
- }
- if(!lhs_inverted) // if (/x/y) was changed to /(x*y), add missing cInv
- {
- AddFunctionOpcode(c == '*' ? cMul : cDiv);
- --mStackPtr;
- }
- else if(c == '*') // (/x)*y -> rdiv(x,y)
- {
- AddFunctionOpcode(cRDiv);
- --mStackPtr;
- }
- else // (/x)/y -> /(x*y)
- {
- AddFunctionOpcode(cMul);
- --mStackPtr;
- AddFunctionOpcode(cInv);
- }
- }
- FP_FlushImmed(false);
- #undef FP_FlushImmed
- return function;
-}
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompileAddition(const char* function)
-{
- function = CompileMult(function);
- if(!function) return 0;
-
- Value_t pending_immed(0);
- #define FP_FlushImmed(do_reset) \
- if(pending_immed != Value_t(0)) \
- { \
- unsigned op = cAdd; \
- if(mData->mByteCode.back() == cNeg) \
- { \
- /* (...) cNeg 5 cAdd -> (...) 5 cRSub */ \
- /* ^ ^ | */ \
- mData->mByteCode.pop_back(); \
- op = cRSub; \
- } \
- AddImmedOpcode(pending_immed); \
- incStackPtr(); \
- AddFunctionOpcode(op); \
- --mStackPtr; \
- if(do_reset) pending_immed = Value_t(0); \
- }
- while(true)
- {
- char c = *function;
- if(c != '+' && c != '-') break;
- ++function;
- SkipSpace(function);
- if(mData->mByteCode.back() == cImmed)
- {
- // 5 (...) cAdd --> (...) ||| 5 cAdd
- // 5 (...) cSub --> (...) cNeg ||| 5 cAdd
- // ^ | ^
- pending_immed += mData->mImmed.back();
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- --mStackPtr;
- function = CompileMult(function);
- if(!function) return 0;
- if(c == '-')
- AddFunctionOpcode(cNeg);
- continue;
- }
- if(mData->mByteCode.back() == cAdd
- && mData->mByteCode[mData->mByteCode.size()-2] == cImmed)
- {
- // (:::) 5 cAdd (...) cAdd -> (:::) (...) cAdd ||| 5 cAdd
- // (:::) 5 cAdd (...) cSub -> (:::) (...) cSub ||| 5 cAdd
- // ^ ^
- pending_immed += mData->mImmed.back();
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- mData->mByteCode.pop_back();
- }
- // cSub is not tested here because the bytecode
- // optimizer will convert this kind of cSubs into cAdds.
- bool lhs_negated = false;
- if(mData->mByteCode.back() == cNeg)
- {
- // (:::) cNeg (...) cAdd -> (:::) (...) cRSub
- // (:::) cNeg (...) cSub -> (:::) (...) cAdd cNeg
- // ^ ^ |
- mData->mByteCode.pop_back();
- lhs_negated = true;
- }
- function = CompileMult(function);
- if(!function) return 0;
- if(mData->mByteCode.back() == cAdd
- && mData->mByteCode[mData->mByteCode.size()-2] == cImmed)
- {
- // (:::) (...) 5 cAdd cAdd -> (:::) (...) cAdd ||| 5 Add
- // (:::) (...) 5 cAdd cSub -> (:::) (...) cSub ||| -5 Add
- // ^ ^
- if(c == '+')
- pending_immed += mData->mImmed.back();
- else
- pending_immed -= mData->mImmed.back();
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- mData->mByteCode.pop_back();
- }
- else
- if(mData->mByteCode.back() == cRSub
- && mData->mByteCode[mData->mByteCode.size()-2] == cImmed)
- {
- // (:::) (...) 5 cRSub cAdd -> (:::) (...) cSub ||| 5 cAdd
- // (:::) (...) 5 cRSub cSub -> (:::) (...) cAdd ||| -5 cAdd
- // ^ ^
- if(c == '+')
- { c = '-'; pending_immed += mData->mImmed.back(); }
- else
- { c = '+'; pending_immed -= mData->mImmed.back(); }
- mData->mImmed.pop_back();
- mData->mByteCode.pop_back();
- mData->mByteCode.pop_back();
- }
- if(!lhs_negated) // if (-x-y) was changed to -(x+y), add missing cNeg
- {
- AddFunctionOpcode(c == '+' ? cAdd : cSub);
- --mStackPtr;
- }
- else if(c == '+') // (-x)+y -> rsub(x,y)
- {
- AddFunctionOpcode(cRSub);
- --mStackPtr;
- }
- else // (-x)-y -> -(x+y)
- {
- AddFunctionOpcode(cAdd);
- --mStackPtr;
- AddFunctionOpcode(cNeg);
- }
- }
- FP_FlushImmed(false);
- #undef FP_FlushImmed
- return function;
-}
-
-template<typename Value_t>
-inline const char*
-FunctionParserBase<Value_t>::CompileComparison(const char* function)
-{
- unsigned op=0;
- while(true)
- {
- function = CompileAddition(function);
- if(!function) return 0;
-
- if(op)
- {
- AddFunctionOpcode(op);
- --mStackPtr;
- }
- switch(*function)
- {
- case '=':
- ++function; op = cEqual; break;
- case '!':
- if(function[1] == '=')
- { function += 2; op = cNEqual; break; }
- // If '=' does not follow '!', a syntax error will
- // be generated at the outermost parsing level
- return function;
- case '<':
- if(function[1] == '=')
- { function += 2; op = cLessOrEq; break; }
- ++function; op = cLess; break;
- case '>':
- if(function[1] == '=')
- { function += 2; op = cGreaterOrEq; break; }
- ++function; op = cGreater; break;
- default: return function;
- }
- SkipSpace(function);
- }
- return function;
-}
-
-template<typename Value_t>
-inline const char* FunctionParserBase<Value_t>::CompileAnd(const char* function)
-{
- size_t param0end=0;
- while(true)
- {
- function = CompileComparison(function);
- if(!function) return 0;
-
- if(param0end)
- {
- if(mData->mByteCode.back() == cNotNot) mData->mByteCode.pop_back();
-
- AddFunctionOpcode(cAnd);
- --mStackPtr;
- }
- if(*function != '&') break;
- ++function;
- SkipSpace(function);
- param0end = mData->mByteCode.size();
- }
- return function;
-}
-
-template<typename Value_t>
-const char* FunctionParserBase<Value_t>::CompileExpression(const char* function)
-{
- size_t param0end=0;
- while(true)
- {
- SkipSpace(function);
- function = CompileAnd(function);
- if(!function) return 0;
-
- if(param0end)
- {
- if(mData->mByteCode.back() == cNotNot) mData->mByteCode.pop_back();
-
- AddFunctionOpcode(cOr);
- --mStackPtr;
- }
- if(*function != '|') break;
- ++function;
- param0end = mData->mByteCode.size();
- }
- return function;
-}
-
-template<typename Value_t>
-const char* FunctionParserBase<Value_t>::Compile(const char* function)
-{
- while(true)
- {
- // Check if an identifier appears as first token:
- SkipSpace(function);
- unsigned nameLength = readIdentifier<Value_t>(function);
- if(nameLength > 0 && !(nameLength & 0x80000000U))
- {
- typename Data::InlineVariable inlineVar =
- { NamePtr(function, nameLength), 0 };
-
- // Check if it's an unknown identifier:
- typename NamePtrsMap<Value_t>::iterator nameIter =
- mData->mNamePtrs.find(inlineVar.mName);
- if(nameIter == mData->mNamePtrs.end())
- {
- const char* function2 = function + nameLength;
- SkipSpace(function2);
-
- // Check if ":=" follows the unknown identifier:
- if(function2[0] == ':' && function2[1] == '=')
- {
- // Parse the expression that follows and create the
- // inline variable:
- function2 = CompileExpression(function2 + 2);
- if(!function2) return 0;
- if(*function2 != ';') return function2;
-
- inlineVar.mFetchIndex = mStackPtr - 1;
- mData->mInlineVarNames.push_back(inlineVar);
-
- // Continue with the expression after the ';':
- function = function2 + 1;
- continue;
- }
- }
- }
- break;
- }
-
- return CompileExpression(function);
-}
-
-template<typename Value_t> template<bool PutFlag>
-inline void FunctionParserBase<Value_t>::PushOpcodeParam
- (unsigned value)
-{
- mData->mByteCode.push_back(value | (PutFlag ? 0x80000000U : 0u));
- if(PutFlag) mHasByteCodeFlags = true;
-}
-
-template<typename Value_t> template<bool PutFlag>
-inline void FunctionParserBase<Value_t>::PutOpcodeParamAt
- (unsigned value, unsigned offset)
-{
- mData->mByteCode[offset] = value | (PutFlag ? 0x80000000U : 0u);
- if(PutFlag) mHasByteCodeFlags = true;
-}
-
-//===========================================================================
-// Function evaluation
-//===========================================================================
-template<typename Value_t>
-Value_t FunctionParserBase<Value_t>::Eval(const Value_t* Vars)
-{
- if(mParseErrorType != FP_NO_ERROR) return Value_t(0);
-
- const unsigned* const byteCode = &(mData->mByteCode[0]);
- const Value_t* const immed = mData->mImmed.empty() ? 0 : &(mData->mImmed[0]);
- const unsigned byteCodeSize = unsigned(mData->mByteCode.size());
- unsigned IP, DP=0;
- int SP=-1;
-
-#ifdef FP_USE_THREAD_SAFE_EVAL
- /* If Eval() may be called by multiple threads simultaneously,
- * then Eval() must allocate its own stack.
- */
-#ifdef FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA
- /* alloca() allocates room from the hardware stack.
- * It is automatically freed when the function returns.
- */
- Value_t* const Stack = (Value_t*)alloca(mData->mStackSize*sizeof(Value_t));
-#else
- /* Allocate from the heap. Ensure that it is freed
- * automatically no matter which exit path is taken.
- */
- struct AutoDealloc
- {
- Value_t* ptr;
- ~AutoDealloc() { delete[] ptr; }
- } AutoDeallocStack = { new Value_t[mData->mStackSize] };
- Value_t*& Stack = AutoDeallocStack.ptr;
-#endif
-#else
- /* No thread safety, so use a global stack. */
- std::vector<Value_t>& Stack = mData->mStack;
-#endif
-
- for(IP=0; IP<byteCodeSize; ++IP)
- {
- switch(byteCode[IP])
- {
-// Functions:
- case cAbs: Stack[SP] = fp_abs(Stack[SP]); break;
-
- case cAcos:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] < Value_t(-1) || Stack[SP] > Value_t(1))
- { mEvalErrorType=4; return Value_t(0); }
-# endif
- Stack[SP] = fp_acos(Stack[SP]); break;
-
- case cAcosh:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] < Value_t(1))
- { mEvalErrorType=4; return Value_t(0); }
-# endif
- Stack[SP] = fp_acosh(Stack[SP]); break;
-
- case cAsin:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] < Value_t(-1) || Stack[SP] > Value_t(1))
- { mEvalErrorType=4; return Value_t(0); }
-# endif
- Stack[SP] = fp_asin(Stack[SP]); break;
-
- case cAsinh: Stack[SP] = fp_asinh(Stack[SP]); break;
-
- case cAtan: Stack[SP] = fp_atan(Stack[SP]); break;
-
- case cAtan2: Stack[SP-1] = fp_atan2(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cAtanh:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] <= Value_t(-1) || Stack[SP] >= Value_t(1))
- { mEvalErrorType=4; return Value_t(0); }
-# endif
- Stack[SP] = fp_atanh(Stack[SP]); break;
-
- case cCbrt: Stack[SP] = fp_cbrt(Stack[SP]); break;
-
- case cCeil: Stack[SP] = fp_ceil(Stack[SP]); break;
-
- case cCos: Stack[SP] = fp_cos(Stack[SP]); break;
-
- case cCosh: Stack[SP] = fp_cosh(Stack[SP]); break;
-
- case cCot:
- {
- const Value_t t = fp_tan(Stack[SP]);
-# ifndef FP_NO_EVALUATION_CHECKS
- if(t == Value_t(0)) { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP] = Value_t(1)/t; break;
- }
-
- case cCsc:
- {
- const Value_t s = fp_sin(Stack[SP]);
-# ifndef FP_NO_EVALUATION_CHECKS
- if(s == 0) { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP] = Value_t(1)/s; break;
- }
-
-
-# ifndef FP_DISABLE_EVAL
- case cEval:
- {
- const unsigned varAmount = mData->mVariablesAmount;
- Value_t retVal = Value_t(0);
- if(mEvalRecursionLevel == FP_EVAL_MAX_REC_LEVEL)
- {
- mEvalErrorType = 5;
- }
- else
- {
- ++mEvalRecursionLevel;
-# ifndef FP_USE_THREAD_SAFE_EVAL
- /* Eval() will use mData->mStack for its storage.
- * Swap the current stack with an empty one.
- * This is the not-thread-safe method.
- */
- std::vector<Value_t> tmpStack(Stack.size());
- mData->mStack.swap(tmpStack);
- retVal = Eval(&tmpStack[SP - varAmount + 1]);
- mData->mStack.swap(tmpStack);
-# else
- /* Thread safety mode. We don't need to
- * worry about stack reusing here, because
- * each instance of Eval() will allocate
- * their own stack.
- */
- retVal = Eval(&Stack[SP - varAmount + 1]);
-# endif
- --mEvalRecursionLevel;
- }
- SP -= varAmount-1;
- Stack[SP] = retVal;
- break;
- }
-# endif
-
- case cExp: Stack[SP] = fp_exp(Stack[SP]); break;
-
- case cExp2: Stack[SP] = fp_exp2(Stack[SP]); break;
-
- case cFloor: Stack[SP] = fp_floor(Stack[SP]); break;
-
- case cHypot:
- Stack[SP-1] = fp_hypot(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cIf:
- if(fp_truth(Stack[SP--]))
- IP += 2;
- else
- {
- const unsigned* buf = &byteCode[IP+1];
- IP = buf[0];
- DP = buf[1];
- }
- break;
-
- case cInt: Stack[SP] = fp_int(Stack[SP]); break;
-
- case cLog:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(!(Stack[SP] > Value_t(0)))
- { mEvalErrorType=3; return Value_t(0); }
-# endif
- Stack[SP] = fp_log(Stack[SP]); break;
-
- case cLog10:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(!(Stack[SP] > Value_t(0)))
- { mEvalErrorType=3; return Value_t(0); }
-# endif
- Stack[SP] = fp_log10(Stack[SP]);
- break;
-
- case cLog2:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(!(Stack[SP] > Value_t(0)))
- { mEvalErrorType=3; return Value_t(0); }
-# endif
- Stack[SP] = fp_log2(Stack[SP]);
- break;
-
- case cMax: Stack[SP-1] = fp_max(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cMin: Stack[SP-1] = fp_min(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cPow:
-# ifndef FP_NO_EVALUATION_CHECKS
- // x:Negative ^ y:NonInteger is failure,
- // except when the reciprocal of y forms an integer
- /*if(Stack[SP-1] < Value_t(0) &&
- !isInteger(Stack[SP]) &&
- !isInteger(1.0 / Stack[SP]))
- { mEvalErrorType=3; return Value_t(0); }*/
- // x:0 ^ y:negative is failure
- if(Stack[SP-1] == Value_t(0) &&
- Stack[SP] < Value_t(0))
- { mEvalErrorType=3; return Value_t(0); }
-# endif
- Stack[SP-1] = fp_pow(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cTrunc: Stack[SP] = fp_trunc(Stack[SP]); break;
-
- case cSec:
- {
- const Value_t c = fp_cos(Stack[SP]);
-# ifndef FP_NO_EVALUATION_CHECKS
- if(c == Value_t(0)) { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP] = Value_t(1)/c; break;
- }
-
- case cSin: Stack[SP] = fp_sin(Stack[SP]); break;
-
- case cSinh: Stack[SP] = fp_sinh(Stack[SP]); break;
-
- case cSqrt:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] < Value_t(0)) { mEvalErrorType=2; return Value_t(0); }
-# endif
- Stack[SP] = fp_sqrt(Stack[SP]); break;
-
- case cTan: Stack[SP] = fp_tan(Stack[SP]); break;
-
- case cTanh: Stack[SP] = fp_tanh(Stack[SP]); break;
-
-
-// Misc:
- case cImmed: Stack[++SP] = immed[DP++]; break;
-
- case cJump:
- {
- const unsigned* buf = &byteCode[IP+1];
- IP = buf[0];
- DP = buf[1];
- break;
- }
-
-// Operators:
- case cNeg: Stack[SP] = -Stack[SP]; break;
- case cAdd: Stack[SP-1] += Stack[SP]; --SP; break;
- case cSub: Stack[SP-1] -= Stack[SP]; --SP; break;
- case cMul: Stack[SP-1] *= Stack[SP]; --SP; break;
-
- case cDiv:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# else
- if(IsIntType<Value_t>::result && Stack[SP] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP-1] /= Stack[SP]; --SP; break;
-
- case cMod:
- if(Stack[SP] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
- Stack[SP-1] = fp_mod(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cEqual:
- Stack[SP-1] = fp_equal(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cNEqual:
- Stack[SP-1] = fp_nequal(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cLess:
- Stack[SP-1] = fp_less(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cLessOrEq:
- Stack[SP-1] = fp_lessOrEq(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cGreater:
- Stack[SP-1] = fp_less(Stack[SP], Stack[SP-1]);
- --SP; break;
-
- case cGreaterOrEq:
- Stack[SP-1] = fp_lessOrEq(Stack[SP], Stack[SP-1]);
- --SP; break;
-
- case cNot: Stack[SP] = fp_not(Stack[SP]); break;
-
- case cNotNot: Stack[SP] = fp_notNot(Stack[SP]); break;
-
- case cAnd:
- Stack[SP-1] = fp_and(Stack[SP-1], Stack[SP]);
- --SP; break;
-
- case cOr:
- Stack[SP-1] = fp_or(Stack[SP-1], Stack[SP]);
- --SP; break;
-
-// Degrees-radians conversion:
- case cDeg: Stack[SP] = RadiansToDegrees(Stack[SP]); break;
- case cRad: Stack[SP] = DegreesToRadians(Stack[SP]); break;
-
-// User-defined function calls:
- case cFCall:
- {
- unsigned index = byteCode[++IP];
- unsigned params = mData->mFuncPtrs[index].mParams;
- Value_t retVal =
- mData->mFuncPtrs[index].mFuncPtr(&Stack[SP-params+1]);
- SP -= int(params)-1;
- Stack[SP] = retVal;
- break;
- }
-
- case cPCall:
- {
- unsigned index = byteCode[++IP];
- unsigned params = mData->mFuncParsers[index].mParams;
- Value_t retVal =
- mData->mFuncParsers[index].mParserPtr->Eval
- (&Stack[SP-params+1]);
- SP -= int(params)-1;
- Stack[SP] = retVal;
- const int error =
- mData->mFuncParsers[index].mParserPtr->EvalError();
- if(error)
- {
- mEvalErrorType = error;
- return 0;
- }
- break;
- }
-
-
- case cFetch:
- {
- unsigned stackOffs = byteCode[++IP];
- Stack[SP+1] = Stack[stackOffs]; ++SP;
- break;
- }
-
-#ifdef FP_SUPPORT_OPTIMIZER
- case cPopNMov:
- {
- unsigned stackOffs_target = byteCode[++IP];
- unsigned stackOffs_source = byteCode[++IP];
- Stack[stackOffs_target] = Stack[stackOffs_source];
- SP = stackOffs_target;
- break;
- }
-
- case cLog2by:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP-1] <= Value_t(0))
- { mEvalErrorType=3; return Value_t(0); }
-# endif
- Stack[SP-1] = fp_log2(Stack[SP-1]) * Stack[SP];
- --SP;
- break;
-
- case cNop: break;
-#endif // FP_SUPPORT_OPTIMIZER
-
- case cSinCos:
- fp_sinCos(Stack[SP], Stack[SP+1], Stack[SP]);
- ++SP;
- break;
-
- case cAbsNot:
- Stack[SP] = fp_absNot(Stack[SP]); break;
- case cAbsNotNot:
- Stack[SP] = fp_absNotNot(Stack[SP]); break;
- case cAbsAnd:
- Stack[SP-1] = fp_absAnd(Stack[SP-1], Stack[SP]);
- --SP; break;
- case cAbsOr:
- Stack[SP-1] = fp_absOr(Stack[SP-1], Stack[SP]);
- --SP; break;
- case cAbsIf:
- if(fp_absTruth(Stack[SP--]))
- IP += 2;
- else
- {
- const unsigned* buf = &byteCode[IP+1];
- IP = buf[0];
- DP = buf[1];
- }
- break;
-
- case cDup: Stack[SP+1] = Stack[SP]; ++SP; break;
-
- case cInv:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# else
- if(IsIntType<Value_t>::result && Stack[SP] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP] = Value_t(1)/Stack[SP];
- break;
-
- case cSqr:
- Stack[SP] = Stack[SP]*Stack[SP];
- break;
-
- case cRDiv:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP-1] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# else
- if(IsIntType<Value_t>::result && Stack[SP-1] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP-1] = Stack[SP] / Stack[SP-1]; --SP; break;
-
- case cRSub: Stack[SP-1] = Stack[SP] - Stack[SP-1]; --SP; break;
-
- case cRSqrt:
-# ifndef FP_NO_EVALUATION_CHECKS
- if(Stack[SP] == Value_t(0))
- { mEvalErrorType=1; return Value_t(0); }
-# endif
- Stack[SP] = Value_t(1) / fp_sqrt(Stack[SP]); break;
-
-
-// Variables:
- default:
- Stack[++SP] = Vars[byteCode[IP]-VarBegin];
- }
- }
-
- mEvalErrorType=0;
- return Stack[SP];
-}
-
-
-//===========================================================================
-// Variable deduction
-//===========================================================================
-namespace
-{
- template<typename Value_t>
- int deduceVariables(FunctionParserBase<Value_t>& fParser,
- const char* funcStr,
- std::string& destVarString,
- int* amountOfVariablesFound,
- std::vector<std::string>* destVarNames,
- bool useDegrees)
- {
- typedef std::set<std::string> StrSet;
- StrSet varNames;
-
- int oldIndex = -1;
-
- while(true)
- {
- destVarString.clear();
- for(StrSet::iterator iter = varNames.begin();
- iter != varNames.end();
- ++iter)
- {
- if(iter != varNames.begin()) destVarString += ",";
- destVarString += *iter;
- }
-
- const int index =
- fParser.Parse(funcStr, destVarString, useDegrees);
- if(index < 0) break;
- if(index == oldIndex) return index;
-
- unsigned nameLength = readIdentifier<Value_t>(funcStr + index);
- if(nameLength & 0x80000000U) return index;
- if(nameLength == 0) return index;
-
- varNames.insert(std::string(funcStr + index, nameLength));
- oldIndex = index;
- }
-
- if(amountOfVariablesFound)
- *amountOfVariablesFound = int(varNames.size());
-
- if(destVarNames)
- destVarNames->assign(varNames.begin(), varNames.end());
-
- return -1;
- }
-}
-
-template<typename Value_t>
-int FunctionParserBase<Value_t>::ParseAndDeduceVariables
-(const std::string& function,
- int* amountOfVariablesFound,
- bool useDegrees)
-{
- std::string varString;
- return deduceVariables(*this, function.c_str(), varString,
- amountOfVariablesFound, 0, useDegrees);
-}
-
-template<typename Value_t>
-int FunctionParserBase<Value_t>::ParseAndDeduceVariables
-(const std::string& function,
- std::string& resultVarString,
- int* amountOfVariablesFound,
- bool useDegrees)
-{
- std::string varString;
- const int index =
- deduceVariables(*this, function.c_str(), varString,
- amountOfVariablesFound, 0, useDegrees);
- if(index < 0) resultVarString = varString;
- return index;
-}
-
-template<typename Value_t>
-int FunctionParserBase<Value_t>::ParseAndDeduceVariables
-(const std::string& function,
- std::vector<std::string>& resultVars,
- bool useDegrees)
-{
- std::string varString;
- std::vector<std::string> vars;
- const int index =
- deduceVariables(*this, function.c_str(), varString,
- 0, &vars, useDegrees);
- if(index < 0) resultVars.swap(vars);
- return index;
-}
-
-
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
-//===========================================================================
-// Bytecode injection
-//===========================================================================
-template<typename Value_t>
-void FunctionParserBase<Value_t>::InjectRawByteCode
-(const unsigned* bytecode, unsigned bytecodeAmount,
- const Value_t* immed, unsigned immedAmount, unsigned stackSize)
-{
- CopyOnWrite();
-
- mData->mByteCode.assign(bytecode, bytecode + bytecodeAmount);
- mData->mImmed.assign(immed, immed + immedAmount);
- mData->mStackSize = stackSize;
-
-#ifndef FP_USE_THREAD_SAFE_EVAL
- mData->mStack.resize(stackSize);
-#endif
-}
-
-//===========================================================================
-// Debug output
-//===========================================================================
-#include <iomanip>
-#include <sstream>
-namespace
-{
- inline void printHex(std::ostream& dest, unsigned n)
- {
- std::ios::fmtflags flags = dest.flags();
- dest.width(4); dest.fill('0'); std::hex(dest); //uppercase(dest);
- dest << n;
- dest.flags(flags);
- }
-
- void padLine(std::ostringstream& dest, unsigned destLength)
- {
- for(size_t currentLength = dest.str().length();
- currentLength < destLength;
- ++currentLength)
- {
- dest << ' ';
- }
- }
-
- template<typename Value_t>
- std::string findName(const NamePtrsMap<Value_t>& nameMap,
- unsigned index,
- typename NameData<Value_t>::DataType type)
- {
- for(typename NamePtrsMap<Value_t>::const_iterator
- iter = nameMap.begin();
- iter != nameMap.end();
- ++iter)
- {
- if(iter->second.type == type && iter->second.index == index)
- return std::string(iter->first.name,
- iter->first.name + iter->first.nameLength);
- }
- return "?";
- }
-
- const struct PowiMuliType
- {
- unsigned opcode_square;
- unsigned opcode_cumulate;
- unsigned opcode_invert;
- unsigned opcode_half;
- unsigned opcode_invhalf;
- } iseq_powi = {cSqr,cMul,cInv,cSqrt,cRSqrt},
- iseq_muli = {~unsigned(0), cAdd,cNeg, ~unsigned(0),~unsigned(0) };
-
- template<typename Value_t>
- Value_t ParsePowiMuli(
- const PowiMuliType& opcodes,
- const std::vector<unsigned>& ByteCode, unsigned& IP,
- unsigned limit,
- size_t factor_stack_base,
- std::vector<Value_t>& stack,
- bool IgnoreExcess)
- {
- Value_t result = Value_t(1);
- while(IP < limit)
- {
- if(ByteCode[IP] == opcodes.opcode_square)
- {
- if(!isInteger(result)) break;
- result *= Value_t(2);
- ++IP;
- continue;
- }
- if(ByteCode[IP] == opcodes.opcode_invert)
- {
- if(result < Value_t(0)) break;
- result = -result;
- ++IP;
- continue;
- }
- if(ByteCode[IP] == opcodes.opcode_half)
- {
- if(result > Value_t(0) && isEvenInteger(result))
- break;
- if(isInteger(result * Value_t(0.5))) break;
- result *= Value_t(0.5);
- ++IP;
- continue;
- }
- if(ByteCode[IP] == opcodes.opcode_invhalf)
- {
- if(result > Value_t(0) && isEvenInteger(result))
- break;
- if(isInteger(result * Value_t(-0.5))) break;
- result *= Value_t(-0.5);
- ++IP;
- continue;
- }
-
- unsigned dup_fetch_pos = IP;
- Value_t lhs = Value_t(1);
-
- if(ByteCode[IP] == cFetch)
- {
- unsigned index = ByteCode[++IP];
- if(index < factor_stack_base
- || size_t(index-factor_stack_base) >= stack.size())
- {
- // It wasn't a powi-fetch after all
- IP = dup_fetch_pos;
- break;
- }
- lhs = stack[index - factor_stack_base];
- // Note: ^This assumes that cFetch of recentmost
- // is always converted into cDup.
- goto dup_or_fetch;
- }
-
- if(ByteCode[IP] == cDup)
- {
- lhs = result;
- goto dup_or_fetch;
-
- dup_or_fetch:
- stack.push_back(result);
- ++IP;
- Value_t subexponent = ParsePowiMuli
- (opcodes,
- ByteCode, IP, limit,
- factor_stack_base, stack,
- IgnoreExcess);
- if(IP >= limit && IgnoreExcess)
- return lhs*subexponent;
- if(IP >= limit || ByteCode[IP] != opcodes.opcode_cumulate)
- {
- // It wasn't a powi-dup after all
- IP = dup_fetch_pos;
- break;
- }
- ++IP; // skip opcode_cumulate
- stack.pop_back();
- result += lhs*subexponent;
- continue;
- }
- break;
- }
- return result;
- }
-
- template<typename Value_t>
- Value_t ParsePowiSequence(const std::vector<unsigned>& ByteCode,
- unsigned& IP, unsigned limit,
- size_t factor_stack_base,
- bool IgnoreExcess = false)
- {
- std::vector<Value_t> stack;
- stack.push_back(Value_t(1));
- return ParsePowiMuli(iseq_powi, ByteCode, IP, limit,
- factor_stack_base, stack,
- IgnoreExcess);
- }
-
- template<typename Value_t>
- Value_t ParseMuliSequence(const std::vector<unsigned>& ByteCode,
- unsigned& IP, unsigned limit,
- size_t factor_stack_base,
- bool IgnoreExcess = false)
- {
- std::vector<Value_t> stack;
- stack.push_back(Value_t(1));
- return ParsePowiMuli(iseq_muli, ByteCode, IP, limit,
- factor_stack_base, stack,
- IgnoreExcess);
- }
-
- struct IfInfo
- {
- std::pair<int,std::string> condition;
- std::pair<int,std::string> thenbranch;
- unsigned endif_location;
-
- IfInfo() : condition(), thenbranch(), endif_location() { }
- };
-}
-
-template<typename Value_t>
-void FunctionParserBase<Value_t>::PrintByteCode(std::ostream& dest,
- bool showExpression) const
-{
- dest << "Size of stack: " << mData->mStackSize << "\n";
-
- std::ostringstream outputBuffer;
- std::ostream& output = (showExpression ? outputBuffer : dest);
-
- const std::vector<unsigned>& ByteCode = mData->mByteCode;
- const std::vector<Value_t>& Immed = mData->mImmed;
-
- std::vector<std::pair<int,std::string> > stack;
- std::vector<IfInfo> if_stack;
-
- for(unsigned IP = 0, DP = 0; IP <= ByteCode.size(); ++IP)
- {
- after_powi_or_muli:;
- std::string n;
- bool out_params = false;
- unsigned params = 2, produces = 1, opcode = 0;
-
- if(showExpression && !if_stack.empty() &&
- ( // Normal If termination rule:
- if_stack.back().endif_location == IP
- // This rule matches when cJumps are threaded:
- || (IP < ByteCode.size() && ByteCode[IP] == cJump
- && !if_stack.back().thenbranch.second.empty())
- ))
- {
- printHex(output, IP);
- if(if_stack.back().endif_location == IP)
- output << ": ----- (phi)";
- else
- output << ": ----- (phi+)";
-
- stack.resize(stack.size()+2);
- std::swap(stack[stack.size()-3], stack[stack.size()-1]);
- std::swap(if_stack.back().condition, stack[stack.size()-3]);
- std::swap(if_stack.back().thenbranch, stack[stack.size()-2]);
- opcode = cIf;
- params = 3;
- --IP;
- if_stack.pop_back();
- }
- else
- {
- if(IP >= ByteCode.size()) break;
- opcode = ByteCode[IP];
-
- if(showExpression && (
- opcode == cSqr || opcode == cDup
- || opcode == cInv
- || opcode == cSqrt || opcode == cRSqrt
- || opcode == cFetch
- ))
- {
- unsigned changed_ip = IP;
- Value_t exponent =
- ParsePowiSequence<Value_t>
- (ByteCode, changed_ip,
- if_stack.empty()
- ? (unsigned)ByteCode.size()
- : if_stack.back().endif_location,
- stack.size()-1);
- std::string operation_prefix;
- std::ostringstream operation_value;
- int prio = 0;
- if(exponent == 1.0)
- {
- if(opcode != cDup) goto not_powi_or_muli;
- Value_t factor =
- ParseMuliSequence<Value_t>
- (ByteCode, changed_ip,
- if_stack.empty()
- ? (unsigned)ByteCode.size()
- : if_stack.back().endif_location,
- stack.size()-1);
- if(factor == Value_t(1) || factor == Value_t(-1))
- goto not_powi_or_muli;
- operation_prefix = "*";
- operation_value << factor;
- prio = 3;
- }
- else
- {
- prio = 2;
- operation_prefix = "^";
- operation_value << exponent;
- }
-
- //unsigned explanation_before = changed_ip-2;
- unsigned explanation_before = changed_ip-1;
-
- const char* explanation_prefix = "_";
- for(const unsigned first_ip = IP; IP < changed_ip; ++IP)
- {
- printHex(output, IP);
- output << ": ";
-
- const char* sep = "|";
- if(first_ip+1 == changed_ip)
- { sep = "="; explanation_prefix = " "; }
- else if(IP == first_ip) sep = "\\";
- else if(IP+1 == changed_ip) sep = "/";
- else explanation_prefix = "=";
-
- switch(ByteCode[IP])
- {
- case cInv: output << "inv"; break;
- case cNeg: output << "neg"; break;
- case cDup: output << "dup"; break;
- case cSqr: output << "sqr"; break;
- case cMul: output << "mul"; break;
- case cAdd: output << "add"; break;
- case cCbrt: output << "cbrt"; break;
- case cSqrt: output << "sqrt"; break;
- case cRSqrt: output << "rsqrt"; break;
- case cFetch:
- {
- unsigned index = ByteCode[++IP];
- output << "cFetch(" << index << ")";
- break;
- }
- default: break;
- }
- padLine(outputBuffer, 20);
- output << sep;
- if(IP >= explanation_before)
- {
- explanation_before = (unsigned)ByteCode.size();
- output << explanation_prefix
- << '[' << (stack.size()-1) << ']';
- std::string last = stack.back().second;
- if(stack.back().first >= prio)
- last = "(" + last + ")";
- output << last;
- output << operation_prefix;
- output << operation_value.str();
- }
- else
- {
- unsigned p = first_ip;
- Value_t exp = operation_prefix=="^" ?
- ParsePowiSequence<Value_t>
- (ByteCode, p, IP+1, stack.size()-1, true) :
- ParseMuliSequence<Value_t>
- (ByteCode, p, IP+1, stack.size()-1, true);
- std::string last = stack.back().second;
- if(stack.back().first >= prio)
- last = "(" + last + ")";
- output << " ..." << last;
- output << operation_prefix;
- output << exp;
- }
- dest << outputBuffer.str() << std::endl;
- outputBuffer.str("");
- }
-
- std::string& last = stack.back().second;
- if(stack.back().first >= prio)
- last = "(" + last + ")";
- last += operation_prefix;
- last += operation_value.str();
- stack.back().first = prio;
-
- goto after_powi_or_muli;
- }
- not_powi_or_muli:;
- printHex(output, IP);
- output << ": ";
-
- switch(opcode)
- {
- case cIf:
- {
- unsigned label = ByteCode[IP+1]+1;
- output << "jz ";
- printHex(output, label);
- params = 1;
- produces = 0;
- IP += 2;
-
- if_stack.resize(if_stack.size() + 1);
- std::swap( if_stack.back().condition, stack.back() );
- if_stack.back().endif_location = (unsigned) ByteCode.size();
- stack.pop_back();
- break;
- }
- case cAbsIf:
- {
- unsigned dp = ByteCode[IP+2];
- unsigned label = ByteCode[IP+1]+1;
- output << "jz_abs " << dp << ",";
- printHex(output, label);
- params = 1;
- produces = 0;
- IP += 2;
-
- if_stack.resize(if_stack.size() + 1);
- std::swap( if_stack.back().condition, stack.back() );
- if_stack.back().endif_location = (unsigned) ByteCode.size();
- stack.pop_back();
- break;
- }
-
- case cJump:
- {
- unsigned dp = ByteCode[IP+2];
- unsigned label = ByteCode[IP+1]+1;
-
- if(!if_stack.empty() && !stack.empty())
- {
- std::swap(if_stack.back().thenbranch, stack.back());
- if_stack.back().endif_location = label;
- stack.pop_back();
- }
-
- output << "jump " << dp << ",";
- printHex(output, label);
- params = 0;
- produces = 0;
- IP += 2;
- break;
- }
- case cImmed:
- {
- if(showExpression)
- {
- std::ostringstream buf;
- buf.precision(8);
- buf << Immed[DP];
- stack.push_back( std::make_pair(0, buf.str()) );
- }
- output.precision(8);
- output << "push " << Immed[DP];
- ++DP;
- produces = 0;
- break;
- }
-
- case cFCall:
- {
- const unsigned index = ByteCode[++IP];
- params = mData->mFuncPtrs[index].mParams;
- static std::string name;
- name = "f:" + findName(mData->mNamePtrs, index,
- NameData<Value_t>::FUNC_PTR);
- n = name.c_str();
- out_params = true;
- break;
- }
-
- case cPCall:
- {
- const unsigned index = ByteCode[++IP];
- params = mData->mFuncParsers[index].mParams;
- static std::string name;
- name = "p:" + findName(mData->mNamePtrs, index,
- NameData<Value_t>::PARSER_PTR);
- n = name.c_str();
- out_params = true;
- break;
- }
-
- default:
- if(OPCODE(opcode) < VarBegin)
- {
- switch(opcode)
- {
- case cNeg: n = "neg"; params = 1; break;
- case cAdd: n = "add"; break;
- case cSub: n = "sub"; break;
- case cMul: n = "mul"; break;
- case cDiv: n = "div"; break;
- case cMod: n = "mod"; break;
- case cPow: n = "pow"; break;
- case cEqual: n = "eq"; break;
- case cNEqual: n = "neq"; break;
- case cLess: n = "lt"; break;
- case cLessOrEq: n = "le"; break;
- case cGreater: n = "gt"; break;
- case cGreaterOrEq: n = "ge"; break;
- case cAnd: n = "and"; break;
- case cOr: n = "or"; break;
- case cNot: n = "not"; params = 1; break;
- case cNotNot: n = "notnot"; params = 1; break;
- case cDeg: n = "deg"; params = 1; break;
- case cRad: n = "rad"; params = 1; break;
-
- #ifndef FP_DISABLE_EVAL
- case cEval: n = "eval"; params = mData->mVariablesAmount;
- #endif
-
- case cFetch:
- {
- unsigned index = ByteCode[++IP];
- if(showExpression && index < stack.size())
- stack.push_back(stack[index]);
- output << "cFetch(" << index << ")";
- produces = 0;
- break;
- }
- #ifdef FP_SUPPORT_OPTIMIZER
- case cLog2by: n = "log2by"; params = 2; out_params = 1; break;
- case cPopNMov:
- {
- size_t a = ByteCode[++IP];
- size_t b = ByteCode[++IP];
- if(showExpression && b < stack.size())
- {
- std::pair<int, std::string> stacktop(0, "?");
- if(b < stack.size()) stacktop = stack[b];
- stack.resize(a);
- stack.push_back(stacktop);
- }
- output << "cPopNMov(" << a << ", " << b << ")";
- produces = 0;
- break;
- }
- case cNop:
- output << "nop"; params = 0; produces = 0;
- break;
- #endif
- case cSinCos:
- {
- if(showExpression)
- {
- std::pair<int, std::string> sin = stack.back();
- std::pair<int, std::string> cos(
- 0, "cos(" + sin.second + ")");
- sin.first = 0;
- sin.second = "sin(" + sin.second + ")";
- stack.back() = sin;
- stack.push_back(cos);
- }
- output << "sincos";
- produces = 0;
- break;
- }
- case cAbsAnd: n = "abs_and"; break;
- case cAbsOr: n = "abs_or"; break;
- case cAbsNot: n = "abs_not"; params = 1; break;
- case cAbsNotNot: n = "abs_notnot"; params = 1; break;
- case cDup:
- {
- if(showExpression)
- stack.push_back(stack.back());
- output << "dup";
- produces = 0;
- break;
- }
- case cInv: n = "inv"; params = 1; break;
- case cSqr: n = "sqr"; params = 1; break;
- case cRDiv: n = "rdiv"; break;
- case cRSub: n = "rsub"; break;
- case cRSqrt: n = "rsqrt"; params = 1; break;
-
- default:
- n = Functions[opcode-cAbs].name;
- params = Functions[opcode-cAbs].params;
- out_params = params != 1;
- }
- }
- else
- {
- if(showExpression)
- {
- stack.push_back(std::make_pair(0,
- (findName(mData->mNamePtrs, opcode,
- NameData<Value_t>::VARIABLE))));
- }
- output << "push Var" << opcode-VarBegin;
- produces = 0;
- }
- }
- }
- if(produces) output << n;
- if(out_params) output << " (" << params << ")";
- if(showExpression)
- {
- padLine(outputBuffer, 20);
-
- if(produces > 0)
- {
- std::ostringstream buf;
- const char *paramsep = ",", *suff = "";
- int prio = 0; bool commutative = false;
- switch(opcode)
- {
- case cIf: buf << "if("; suff = ")";
- break;
- case cAbsIf: buf << "if("; suff = ")";
- break;
- case cOr: prio = 6; paramsep = "|"; commutative = true;
- break;
- case cAnd: prio = 5; paramsep = "&"; commutative = true;
- break;
- case cAdd: prio = 4; paramsep = "+"; commutative = true;
- break;
- case cSub: prio = 4; paramsep = "-";
- break;
- case cMul: prio = 3; paramsep = "*"; commutative = true;
- break;
- case cDiv: prio = 3; paramsep = "/";
- break;
- case cPow: prio = 2; paramsep = "^";
- break;
- case cAbsOr: prio = 6; paramsep = "|"; commutative = true;
- break;
- case cAbsAnd: prio = 5; paramsep = "&"; commutative = true;
- break;
- case cSqr: prio = 2; suff = "^2";
- break;
- case cNeg: buf << "(-("; suff = "))";
- break;
- case cNot: buf << "(!("; suff = "))";
- break;
- default: buf << n << '('; suff = ")";
- }
-
- const char* sep = "";
- for(unsigned a=0; a<params; ++a)
- {
- buf << sep;
- if(stack.size() + a < params)
- buf << "?";
- else
- {
- const std::pair<int,std::string>& prev =
- stack[stack.size() - params + a];
- if(prio > 0 && (prev.first > prio ||
- (prev.first==prio && !commutative)))
- buf << '(' << prev.second << ')';
- else
- buf << prev.second;
- }
- sep = paramsep;
- }
- if(stack.size() >= params)
- stack.resize(stack.size() - params);
- else
- stack.clear();
- buf << suff;
- stack.push_back(std::make_pair(prio, buf.str()));
- //if(n.size() <= 4 && !out_params) padLine(outputBuffer, 20);
- }
- //padLine(outputBuffer, 20);
- output << "= ";
- if(((opcode == cIf || opcode == cAbsIf) && params != 3)
- || opcode == cJump
- #ifdef FP_SUPPORT_OPTIMIZER
- || opcode == cNop
- #endif
- )
- output << "(void)";
- else if(stack.empty())
- output << "[?] ?";
- else
- output << '[' << (stack.size()-1) << ']'
- << stack.back().second;
- }
-
- if(showExpression)
- {
- dest << outputBuffer.str() << std::endl;
- outputBuffer.str("");
- }
- else
- output << std::endl;
- }
- dest << std::flush;
-}
-#endif
-
-
-#ifndef FP_SUPPORT_OPTIMIZER
-template<typename Value_t>
-void FunctionParserBase<Value_t>::Optimize()
-{
- // Do nothing if no optimizations are supported.
-}
-#endif
-
-FUNCTIONPARSER_INSTANTIATE_TYPES
diff --git a/fparser/fparser.hh b/fparser/fparser.hh
deleted file mode 100644
index 2157c3b..0000000
--- a/fparser/fparser.hh
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen, Joel Yliluoma *|
-|* *|
-|* This library is distributed under the terms of the *|
-|* GNU Lesser General Public License version 3. *|
-|* (See lgpl.txt and gpl.txt for the license text.) *|
-\***************************************************************************/
-
-#ifndef ONCE_FPARSER_H_
-#define ONCE_FPARSER_H_
-
-#include <string>
-#include <vector>
-
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
-#include <iostream>
-#endif
-
-#ifdef _MSC_VER
-// Visual Studio's warning about missing definitions for the explicit
-// FunctionParserBase instantiations is irrelevant here.
-#pragma warning(disable : 4661)
-#endif
-
-namespace FPoptimizer_CodeTree { template<typename Value_t> class CodeTree; }
-
-template<typename Value_t>
-class FunctionParserBase
-{
-public:
- enum ParseErrorType
- {
- SYNTAX_ERROR=0, MISM_PARENTH, MISSING_PARENTH, EMPTY_PARENTH,
- EXPECT_OPERATOR, OUT_OF_MEMORY, UNEXPECTED_ERROR, INVALID_VARS,
- ILL_PARAMS_AMOUNT, PREMATURE_EOS, EXPECT_PARENTH_FUNC,
- UNKNOWN_IDENTIFIER,
- NO_FUNCTION_PARSED_YET,
- FP_NO_ERROR
- };
-
- typedef Value_t value_type;
-
-
- int Parse(const char* Function, const std::string& Vars,
- bool useDegrees = false);
- int Parse(const std::string& Function, const std::string& Vars,
- bool useDegrees = false);
-
- void setDelimiterChar(char);
-
- const char* ErrorMsg() const;
- inline ParseErrorType GetParseErrorType() const { return mParseErrorType; }
-
- Value_t Eval(const Value_t* Vars);
- inline int EvalError() const { return mEvalErrorType; }
-
- bool AddConstant(const std::string& name, Value_t value);
- bool AddUnit(const std::string& name, Value_t value);
-
- typedef Value_t (*FunctionPtr)(const Value_t*);
-
- bool AddFunction(const std::string& name,
- FunctionPtr, unsigned paramsAmount);
- bool AddFunction(const std::string& name, FunctionParserBase&);
-
- bool RemoveIdentifier(const std::string& name);
-
- void Optimize();
-
-
- int ParseAndDeduceVariables(const std::string& function,
- int* amountOfVariablesFound = 0,
- bool useDegrees = false);
- int ParseAndDeduceVariables(const std::string& function,
- std::string& resultVarString,
- int* amountOfVariablesFound = 0,
- bool useDegrees = false);
- int ParseAndDeduceVariables(const std::string& function,
- std::vector<std::string>& resultVars,
- bool useDegrees = false);
-
-
- FunctionParserBase();
- ~FunctionParserBase();
-
- // Copy constructor and assignment operator (implemented using the
- // copy-on-write technique for efficiency):
- FunctionParserBase(const FunctionParserBase&);
- FunctionParserBase& operator=(const FunctionParserBase&);
-
-
- void ForceDeepCopy();
-
-
-
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
- // For debugging purposes only.
- // Performs no sanity checks or anything. If the values are wrong, the
- // library will crash. Do not use unless you know what you are doing.
- void InjectRawByteCode(const unsigned* bytecode, unsigned bytecodeAmount,
- const Value_t* immed, unsigned immedAmount,
- unsigned stackSize);
-
- void PrintByteCode(std::ostream& dest, bool showExpression = true) const;
-#endif
-
-
-
-//========================================================================
-private:
-//========================================================================
-
- friend class FPoptimizer_CodeTree::CodeTree<Value_t>;
-
-// Private data:
-// ------------
- char mDelimiterChar;
- ParseErrorType mParseErrorType;
- int mEvalErrorType;
-
- struct Data;
- Data* mData;
-
- bool mUseDegreeConversion;
- bool mHasByteCodeFlags;
- unsigned mEvalRecursionLevel;
- unsigned mStackPtr;
- const char* mErrorLocation;
-
-
-// Private methods:
-// ---------------
- void CopyOnWrite();
- bool CheckRecursiveLinking(const FunctionParserBase*) const;
- bool NameExists(const char*, unsigned);
- bool ParseVariables(const std::string&);
- int ParseFunction(const char*, bool);
- const char* SetErrorType(ParseErrorType, const char*);
-
- void AddFunctionOpcode(unsigned);
- void AddImmedOpcode(Value_t v);
- void incStackPtr();
- void CompilePowi(long);
- bool TryCompilePowi(Value_t);
-
- const char* CompileIf(const char*);
- const char* CompileFunctionParams(const char*, unsigned);
- const char* CompileElement(const char*);
- const char* CompilePossibleUnit(const char*);
- const char* CompilePow(const char*);
- const char* CompileUnaryMinus(const char*);
- const char* CompileMult(const char*);
- const char* CompileAddition(const char*);
- const char* CompileComparison(const char*);
- const char* CompileAnd(const char*);
- const char* CompileExpression(const char*);
- inline const char* CompileFunction(const char*, unsigned);
- inline const char* CompileParenthesis(const char*);
- inline const char* CompileLiteral(const char*);
- template<bool SetFlag>
- inline void PushOpcodeParam(unsigned);
- template<bool SetFlag>
- inline void PutOpcodeParamAt(unsigned, unsigned offset);
- const char* Compile(const char*);
-
-protected:
- // Parsing utility functions
- static std::pair<const char*, Value_t> ParseLiteral(const char*);
- static unsigned ParseIdentifier(const char*);
-};
-
-class FunctionParser: public FunctionParserBase<double> {};
-class FunctionParser_f: public FunctionParserBase<float> {};
-class FunctionParser_ld: public FunctionParserBase<long double> {};
-class FunctionParser_li: public FunctionParserBase<long> {};
-
-#endif
diff --git a/fparser/fparser_gmpint.hh b/fparser/fparser_gmpint.hh
deleted file mode 100644
index ba4f049..0000000
--- a/fparser/fparser_gmpint.hh
+++ /dev/null
@@ -1,15 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen *|
-\***************************************************************************/
-
-#ifndef ONCE_FPARSER_GMPINT_H_
-#define ONCE_FPARSER_GMPINT_H_
-
-#include "fparser.hh"
-#include "mpfr/GmpInt.hh"
-
-class FunctionParser_gmpint: public FunctionParserBase<GmpInt> {};
-
-#endif
diff --git a/fparser/fparser_mpfr.hh b/fparser/fparser_mpfr.hh
deleted file mode 100644
index 8807847..0000000
--- a/fparser/fparser_mpfr.hh
+++ /dev/null
@@ -1,15 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen *|
-\***************************************************************************/
-
-#ifndef ONCE_FPARSER_MPFR_H_
-#define ONCE_FPARSER_MPFR_H_
-
-#include "fparser.hh"
-#include "mpfr/MpfrFloat.hh"
-
-class FunctionParser_mpfr: public FunctionParserBase<MpfrFloat> {};
-
-#endif
diff --git a/fparser/fpaux.hh b/fparser/fpaux.hh
deleted file mode 100644
index fe9dcd9..0000000
--- a/fparser/fpaux.hh
+++ /dev/null
@@ -1,796 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen, Joel Yliluoma *|
-|* *|
-|* This library is distributed under the terms of the *|
-|* GNU Lesser General Public License version 3. *|
-|* (See lgpl.txt and gpl.txt for the license text.) *|
-\***************************************************************************/
-
-// NOTE:
-// This file contains only internal types for the function parser library.
-// You don't need to include this file in your code. Include "fparser.hh"
-// only.
-
-#ifndef ONCE_FPARSER_AUX_H_
-#define ONCE_FPARSER_AUX_H_
-
-#include <cmath>
-#include <cstring>
-
-#include "fptypes.hh"
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
-#include "mpfr/MpfrFloat.hh"
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-#include "mpfr/GmpInt.hh"
-#endif
-
-#ifdef ONCE_FPARSER_H_
-namespace FUNCTIONPARSERTYPES
-{
- template<typename value_t>
- struct IsIntType
- {
- enum { result = false };
- };
- template<>
- struct IsIntType<long>
- {
- enum { result = true };
- };
-#ifdef FP_SUPPORT_GMP_INT_TYPE
- template<>
- struct IsIntType<GmpInt>
- {
- enum { result = true };
- };
-#endif
-
-//==========================================================================
-// Math funcs
-//==========================================================================
- template<typename ValueT>
- ValueT fp_pow(const ValueT& x, const ValueT& y);
-
- template<typename Value_t>
- inline void fp_sinCos(Value_t& sin, Value_t& cos, const Value_t& a)
- {
- // Assuming that "cos" and "a" don't overlap, but "sin" and "a" may.
- cos = fp_cos(a);
- sin = fp_sin(a);
- }
-
- template<typename Value_t>
- inline Value_t fp_hypot(Value_t x, Value_t y) { return fp_sqrt(x*x + y*y); }
-
- template<typename Value_t>
- inline Value_t fp_asinh(Value_t x)
- { return fp_log(x + fp_sqrt(x*x + Value_t(1))); }
- template<typename Value_t>
- inline Value_t fp_acosh(Value_t x)
- { return fp_log(x + fp_sqrt(x*x - Value_t(1))); }
- template<typename Value_t>
- inline Value_t fp_atanh(Value_t x)
- { return fp_log( (Value_t(1)+x) / (Value_t(1)-x)) * Value_t(0.5); }
-
-
- template<typename Value_t>
- inline Value_t fp_const_pi() // CONSTANT_PI
- {
- return Value_t(3.1415926535897932384626433832795028841971693993751L);
- }
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
- template<>
- inline MpfrFloat fp_const_pi<MpfrFloat>() { return MpfrFloat::const_pi(); }
-#endif
-
- template<typename Value_t>
- inline Value_t fp_const_e() // CONSTANT_E
- {
- return Value_t(2.7182818284590452353602874713526624977572L);
- }
- template<typename Value_t>
- inline Value_t fp_const_einv() // CONSTANT_EI
- {
- return Value_t(0.367879441171442321595523770161460867445811131L);
- }
- template<typename Value_t>
- inline Value_t fp_const_log2() // CONSTANT_L2, CONSTANT_L2EI
- {
- return Value_t(0.69314718055994530941723212145817656807550013436025525412L);
- }
- template<typename Value_t>
- inline Value_t fp_const_log10() // CONSTANT_L10, CONSTANT_L10EI
- {
- return Value_t(2.302585092994045684017991454684364207601101488628772976L);
- }
- template<typename Value_t>
- inline Value_t fp_const_log2inv() // CONSTANT_L2I, CONSTANT_L2E
- {
- return Value_t(1.442695040888963407359924681001892137426645954L);
- }
- template<typename Value_t>
- inline Value_t fp_const_log10inv() // CONSTANT_L10I, CONSTANT_L10E
- {
- return Value_t(0.434294481903251827651128918916605082294397L);
- }
-
- template<typename Value_t>
- inline const Value_t& fp_const_deg_to_rad() // CONSTANT_DR
- {
- static const Value_t factor = fp_const_pi<Value_t>() / Value_t(180); // to rad from deg
- return factor;
- }
-
- template<typename Value_t>
- inline const Value_t& fp_const_rad_to_deg() // CONSTANT_RD
- {
- static const Value_t factor = Value_t(180) / fp_const_pi<Value_t>(); // to deg from rad
- return factor;
- }
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
- template<>
- inline MpfrFloat fp_const_e<MpfrFloat>() { return MpfrFloat::const_e(); }
-
- template<>
- inline MpfrFloat fp_const_einv<MpfrFloat>() { return MpfrFloat(1) / MpfrFloat::const_e(); }
-
- template<>
- inline MpfrFloat fp_const_log2<MpfrFloat>() { return MpfrFloat::const_log2(); }
-
- /*
- template<>
- inline MpfrFloat fp_const_log10<MpfrFloat>() { return fp_log(MpfrFloat(10)); }
-
- template<>
- inline MpfrFloat fp_const_log2inv<MpfrFloat>() { return MpfrFloat(1) / MpfrFloat::const_log2(); }
-
- template<>
- inline MpfrFloat fp_const_log10inv<MpfrFloat>() { return fp_log10(MpfrFloat::const_e()); }
- */
-#endif
-
-
-// -------------------------------------------------------------------------
-// double
-// -------------------------------------------------------------------------
- inline double fp_abs(double x) { return fabs(x); }
- inline double fp_acos(double x) { return acos(x); }
- inline double fp_asin(double x) { return asin(x); }
- inline double fp_atan(double x) { return atan(x); }
- inline double fp_atan2(double x, double y) { return atan2(x, y); }
-#ifdef FP_SUPPORT_CBRT
- inline double fp_cbrt(double x) { return cbrt(x); }
-#else
- inline double fp_cbrt(double x) { return x>0 ? exp(log( x)/3.0)
- : x<0 ? -exp(log(-x)/3.0)
- : 0.0; }
-#endif
- inline double fp_ceil(double x) { return ceil(x); }
- inline double fp_cos(double x) { return cos(x); }
- inline double fp_cosh(double x) { return cosh(x); }
- inline double fp_exp(double x) { return exp(x); }
- inline double fp_floor(double x) { return floor(x); }
- inline double fp_int(double x) { return floor(x + .5); }
- inline double fp_log(double x) { return log(x); }
- inline double fp_log10(double x)
- { return log(x) *
- 0.434294481903251827651128918916605082294397005803666566; }
- inline double fp_mod(double x, double y) { return fmod(x, y); }
- inline double fp_sin(double x) { return sin(x); }
- inline double fp_sinh(double x) { return sinh(x); }
- inline double fp_sqrt(double x) { return sqrt(x); }
- inline double fp_tan(double x) { return tan(x); }
- inline double fp_tanh(double x) { return tanh(x); }
-
-#ifdef FP_SUPPORT_ASINH
- inline double fp_asinh(double x) { return asinh(x); }
- inline double fp_acosh(double x) { return acosh(x); }
- inline double fp_atanh(double x) { return atanh(x); }
-#endif // FP_SUPPORT_ASINH
-#ifdef FP_SUPPORT_HYPOT
- inline double fp_hypot(double x, double y) { return hypot(x,y); }
-#endif
-
- inline double fp_trunc(double x) { return x<0.0 ? ceil(x) : floor(x); }
-
- inline double fp_pow_base(double x, double y) { return pow(x, y); }
-
-#ifndef FP_SUPPORT_LOG2
- inline double fp_log2(double x)
- { return log(x) * 1.4426950408889634073599246810018921374266459541529859; }
-#else
- inline double fp_log2(double x) { return log2(x); }
-#endif // FP_SUPPORT_LOG2
-
- inline double fp_exp2(double x) { return fp_pow(2.0, x); }
-
-#ifdef FP_EPSILON
- template<typename Value_t>
- inline Value_t fp_epsilon() { return FP_EPSILON; }
-#else
- template<typename Value_t>
- inline Value_t fp_epsilon() { return 0.0; }
-#endif
-
- #ifdef _GNU_SOURCE
- template<>
- inline void fp_sinCos<double>(double& sin, double& cos, const double& a)
- {
- sincos(a, &sin, &cos);
- }
- #endif
-
-// -------------------------------------------------------------------------
-// float
-// -------------------------------------------------------------------------
-#ifdef FP_SUPPORT_FLOAT_TYPE
- inline float fp_abs(float x) { return fabsf(x); }
- inline float fp_acos(float x) { return acosf(x); }
- inline float fp_asin(float x) { return asinf(x); }
- inline float fp_atan(float x) { return atanf(x); }
- inline float fp_atan2(float x, float y) { return atan2f(x, y); }
-#ifdef FP_SUPPORT_CBRT
- inline float fp_cbrt(float x) { return cbrtf(x); }
-#else
- inline float fp_cbrt(float x) { return x>0 ? expf(logf( x)/3.0f)
- : x<0 ? -expf(logf(-x)/3.0f)
- : 0.0f; }
-#endif
- inline float fp_ceil(float x) { return ceilf(x); }
- inline float fp_cos(float x) { return cosf(x); }
- inline float fp_cosh(float x) { return coshf(x); }
- inline float fp_exp(float x) { return expf(x); }
- inline float fp_floor(float x) { return floorf(x); }
- inline float fp_int(float x) { return floorf(x + .5F); }
- inline float fp_log(float x) { return logf(x); }
- inline float fp_log10(float x)
- { return logf(x) *
- 0.434294481903251827651128918916605082294397005803666566F; }
- inline float fp_mod(float x, float y) { return fmodf(x, y); }
- inline float fp_sin(float x) { return sinf(x); }
- inline float fp_sinh(float x) { return sinhf(x); }
- inline float fp_sqrt(float x) { return sqrtf(x); }
- inline float fp_tan(float x) { return tanf(x); }
- inline float fp_tanh(float x) { return tanhf(x); }
-
-#ifdef FP_SUPPORT_ASINH
- inline float fp_asinh(float x) { return asinhf(x); }
- inline float fp_acosh(float x) { return acoshf(x); }
- inline float fp_atanh(float x) { return atanhf(x); }
-#endif // FP_SUPPORT_ASINH
-#ifdef FP_SUPPORT_HYPOT
- inline float fp_hypot(float x, float y) { return hypotf(x,y); }
-#endif
-
- inline float fp_trunc(float x) { return x<0.0F ? ceilf(x) : floorf(x); }
-
- inline float fp_pow_base(float x, float y) { return powf(x, y); }
-
-#ifndef FP_SUPPORT_LOG2
- inline float fp_log2(float x)
- { return logf(x) *
- 1.4426950408889634073599246810018921374266459541529859F; }
-#else
- inline float fp_log2(float x) { return log2f(x); }
-#endif // FP_SUPPORT_LOG2
-
- inline float fp_exp2(float x) { return fp_pow(2.0F, x); }
-
-#ifdef FP_EPSILON
- template<>
- inline float fp_epsilon<float>() { return 1e-6F; }
-#else
- template<>
- inline float fp_epsilon<float>() { return 0.0F; }
-#endif
-
-#endif // FP_SUPPORT_FLOAT_TYPE
- #ifdef _GNU_SOURCE
- template<>
- inline void fp_sinCos<float>(float& sin, float& cos, const float& a)
- {
- sincosf(a, &sin, &cos);
- }
- #endif
-
-
-
-// -------------------------------------------------------------------------
-// long double
-// -------------------------------------------------------------------------
-#ifdef FP_SUPPORT_LONG_DOUBLE_TYPE
- inline long double fp_abs(long double x) { return fabsl(x); }
- inline long double fp_acos(long double x) { return acosl(x); }
- inline long double fp_asin(long double x) { return asinl(x); }
- inline long double fp_atan(long double x) { return atanl(x); }
- inline long double fp_atan2(long double x, long double y)
- { return atan2l(x, y); }
-#ifdef FP_SUPPORT_CBRT
- inline long double fp_cbrt(long double x) { return cbrtl(x); }
-#else
- inline long double fp_cbrt(long double x)
- { return x>0 ? expl(logl( x)/3.0l)
- : x<0 ? -expl(logl(-x)/3.0l)
- : 0.0l; }
-#endif
- inline long double fp_ceil(long double x) { return ceill(x); }
- inline long double fp_cos(long double x) { return cosl(x); }
- inline long double fp_cosh(long double x) { return coshl(x); }
- inline long double fp_exp(long double x) { return expl(x); }
- inline long double fp_floor(long double x) { return floorl(x); }
- inline long double fp_int(long double x) { return floorl(x + .5L); }
- inline long double fp_log(long double x) { return logl(x); }
- inline long double fp_log10(long double x)
- { return logl(x) *
- 0.434294481903251827651128918916605082294397005803666566L; }
- inline long double fp_mod(long double x, long double y)
- { return fmodl(x, y); }
- inline long double fp_sin(long double x) { return sinl(x); }
- inline long double fp_sinh(long double x) { return sinhl(x); }
- inline long double fp_sqrt(long double x) { return sqrtl(x); }
- inline long double fp_tan(long double x) { return tanl(x); }
- inline long double fp_tanh(long double x) { return tanhl(x); }
-
-#ifdef FP_SUPPORT_ASINH
- inline long double fp_asinh(long double x) { return asinhl(x); }
- inline long double fp_acosh(long double x) { return acoshl(x); }
- inline long double fp_atanh(long double x) { return atanhl(x); }
-#endif // FP_SUPPORT_ASINH
-#ifdef FP_SUPPORT_HYPOT
- inline long double fp_hypot(long double x, long double y) { return hypotl(x,y); }
-#endif
-
- inline long double fp_trunc(long double x)
- { return x<0.0L ? ceill(x) : floorl(x); }
-
- inline long double fp_pow_base(long double x, long double y)
- { return powl(x, y); }
-
-#ifndef FP_SUPPORT_LOG2
- inline long double fp_log2(long double x)
- { return fp_log(x) * 1.4426950408889634073599246810018921374266459541529859L; }
-#else
- inline long double fp_log2(long double x) { return log2l(x); }
-#endif // FP_SUPPORT_LOG2
-
- inline long double fp_exp2(long double x) { return fp_pow(2.0L, x); }
-
-#endif // FP_SUPPORT_LONG_DOUBLE_TYPE
-
- #ifdef _GNU_SOURCE
- template<>
- inline void fp_sinCos<long double>(long double& sin, long double& cos, const long double& a)
- {
- sincosl(a, &sin, &cos);
- }
- #endif
-
-
-// -------------------------------------------------------------------------
-// Long int
-// -------------------------------------------------------------------------
- inline long fp_abs(long x) { return x < 0 ? -x : x; }
- inline long fp_acos(long) { return 0; }
- inline long fp_asin(long) { return 0; }
- inline long fp_atan(long) { return 0; }
- inline long fp_atan2(long, long) { return 0; }
- inline long fp_cbrt(long) { return 0; }
- inline long fp_ceil(long x) { return x; }
- inline long fp_cos(long) { return 0; }
- inline long fp_cosh(long) { return 0; }
- inline long fp_exp(long) { return 0; }
- inline long fp_floor(long x) { return x; }
- inline long fp_int(long x) { return x; }
- inline long fp_log(long) { return 0; }
- inline long fp_log10(long) { return 0; }
- inline long fp_mod(long x, long y) { return x % y; }
- inline long fp_pow(long, long) { return 0; }
- inline long fp_sin(long) { return 0; }
- inline long fp_sinh(long) { return 0; }
- inline long fp_sqrt(long) { return 1; }
- inline long fp_tan(long) { return 0; }
- inline long fp_tanh(long) { return 0; }
- inline long fp_asinh(long) { return 0; }
- inline long fp_acosh(long) { return 0; }
- inline long fp_atanh(long) { return 0; }
- inline long fp_trunc(long x) { return x; }
- inline long fp_pow_base(long, long) { return 0; }
- inline long fp_log2(long) { return 0; }
- inline long fp_exp2(long) { return 0; }
-
- template<>
- inline long fp_epsilon<long>() { return 0; }
-
-
-// -------------------------------------------------------------------------
-// MpfrFloat
-// -------------------------------------------------------------------------
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
- inline MpfrFloat fp_abs(const MpfrFloat& x) { return MpfrFloat::abs(x); }
- inline MpfrFloat fp_acos(const MpfrFloat& x) { return MpfrFloat::acos(x); }
- inline MpfrFloat fp_asin(const MpfrFloat& x) { return MpfrFloat::asin(x); }
- inline MpfrFloat fp_atan(const MpfrFloat& x) { return MpfrFloat::atan(x); }
- inline MpfrFloat fp_atan2(const MpfrFloat& x, const MpfrFloat& y)
- { return MpfrFloat::atan2(x, y); }
- inline MpfrFloat fp_cbrt(const MpfrFloat& x) { return MpfrFloat::cbrt(x); }
- inline MpfrFloat fp_ceil(const MpfrFloat& x) { return MpfrFloat::ceil(x); }
- inline MpfrFloat fp_cos(const MpfrFloat& x) { return MpfrFloat::cos(x); }
- inline MpfrFloat fp_cosh(const MpfrFloat& x) { return MpfrFloat::cosh(x); }
- inline MpfrFloat fp_exp(const MpfrFloat& x) { return MpfrFloat::exp(x); }
- inline MpfrFloat fp_floor(const MpfrFloat& x) { return MpfrFloat::floor(x); }
- inline MpfrFloat fp_hypot(const MpfrFloat& x, const MpfrFloat& y)
- { return MpfrFloat::hypot(x, y); }
- inline MpfrFloat fp_int(const MpfrFloat& x) { return MpfrFloat::round(x); }
- inline MpfrFloat fp_log(const MpfrFloat& x) { return MpfrFloat::log(x); }
- inline MpfrFloat fp_log10(const MpfrFloat& x) { return MpfrFloat::log10(x); }
- inline MpfrFloat fp_mod(const MpfrFloat& x, const MpfrFloat& y) { return x % y; }
- inline MpfrFloat fp_sin(const MpfrFloat& x) { return MpfrFloat::sin(x); }
- inline MpfrFloat fp_sinh(const MpfrFloat& x) { return MpfrFloat::sinh(x); }
- inline MpfrFloat fp_sqrt(const MpfrFloat& x) { return MpfrFloat::sqrt(x); }
- inline MpfrFloat fp_tan(const MpfrFloat& x) { return MpfrFloat::tan(x); }
- inline MpfrFloat fp_tanh(const MpfrFloat& x) { return MpfrFloat::tanh(x); }
- inline MpfrFloat fp_asinh(const MpfrFloat& x) { return MpfrFloat::asinh(x); }
- inline MpfrFloat fp_acosh(const MpfrFloat& x) { return MpfrFloat::acosh(x); }
- inline MpfrFloat fp_atanh(const MpfrFloat& x) { return MpfrFloat::atanh(x); }
- inline MpfrFloat fp_trunc(const MpfrFloat& x) { return MpfrFloat::trunc(x); }
-
- inline MpfrFloat fp_pow(const MpfrFloat& x, const MpfrFloat& y) { return MpfrFloat::pow(x, y); }
- inline MpfrFloat fp_pow_base(const MpfrFloat& x, const MpfrFloat& y) { return MpfrFloat::pow(x, y); }
-
- inline MpfrFloat fp_log2(const MpfrFloat& x) { return MpfrFloat::log2(x); }
- inline MpfrFloat fp_exp2(const MpfrFloat& x) { return MpfrFloat::exp2(x); }
-
- template<>
- inline void fp_sinCos<MpfrFloat>(MpfrFloat& sin, MpfrFloat& cos, const MpfrFloat& a)
- {
- MpfrFloat::sincos(a, sin, cos);
- }
-
- template<>
- inline MpfrFloat fp_epsilon<MpfrFloat>() { return MpfrFloat::someEpsilon(); }
-#endif // FP_SUPPORT_MPFR_FLOAT_TYPE
-
-
-// -------------------------------------------------------------------------
-// GMP int
-// -------------------------------------------------------------------------
-#ifdef FP_SUPPORT_GMP_INT_TYPE
- inline GmpInt fp_abs(GmpInt x) { return GmpInt::abs(x); }
- inline GmpInt fp_acos(GmpInt) { return 0; }
- inline GmpInt fp_asin(GmpInt) { return 0; }
- inline GmpInt fp_atan(GmpInt) { return 0; }
- inline GmpInt fp_atan2(GmpInt, GmpInt) { return 0; }
- inline GmpInt fp_cbrt(GmpInt) { return 0; }
- inline GmpInt fp_ceil(GmpInt x) { return x; }
- inline GmpInt fp_cos(GmpInt) { return 0; }
- inline GmpInt fp_cosh(GmpInt) { return 0; }
- inline GmpInt fp_exp(GmpInt) { return 0; }
- inline GmpInt fp_floor(GmpInt x) { return x; }
- inline GmpInt fp_hypot(GmpInt, GmpInt) { return 0; }
- inline GmpInt fp_int(GmpInt x) { return x; }
- inline GmpInt fp_log(GmpInt) { return 0; }
- inline GmpInt fp_log10(GmpInt) { return 0; }
- inline GmpInt fp_mod(GmpInt x, GmpInt y) { return x % y; }
- inline GmpInt fp_pow(GmpInt, GmpInt) { return 0; }
- inline GmpInt fp_sin(GmpInt) { return 0; }
- inline GmpInt fp_sinh(GmpInt) { return 0; }
- inline GmpInt fp_sqrt(GmpInt) { return 0; }
- inline GmpInt fp_tan(GmpInt) { return 0; }
- inline GmpInt fp_tanh(GmpInt) { return 0; }
- inline GmpInt fp_asinh(GmpInt) { return 0; }
- inline GmpInt fp_acosh(GmpInt) { return 0; }
- inline GmpInt fp_atanh(GmpInt) { return 0; }
- inline GmpInt fp_trunc(GmpInt x) { return x; }
- inline GmpInt fp_pow_base(GmpInt, GmpInt) { return 0; }
- inline GmpInt fp_log2(GmpInt) { return 0; }
- inline GmpInt fp_exp2(GmpInt) { return 0; }
-
- template<>
- inline GmpInt fp_epsilon<GmpInt>() { return 0; }
-#endif // FP_SUPPORT_GMP_INT_TYPE
-
-
-// -------------------------------------------------------------------------
-// Comparison
-// -------------------------------------------------------------------------
-#ifdef FP_EPSILON
- template<typename Value_t>
- inline bool fp_equal(const Value_t& x, const Value_t& y)
- { return IsIntType<Value_t>::result
- ? (x == y)
- : (fp_abs(x - y) <= fp_epsilon<Value_t>()); }
-
- template<typename Value_t>
- inline bool fp_nequal(const Value_t& x, const Value_t& y)
- { return IsIntType<Value_t>::result
- ? (x != y)
- : (fp_abs(x - y) > fp_epsilon<Value_t>()); }
-
- template<typename Value_t>
- inline bool fp_less(const Value_t& x, const Value_t& y)
- { return IsIntType<Value_t>::result
- ? (x < y)
- : (x < y - fp_epsilon<Value_t>()); }
-
- template<typename Value_t>
- inline bool fp_lessOrEq(const Value_t& x, const Value_t& y)
- { return IsIntType<Value_t>::result
- ? (x <= y)
- : (x <= y + fp_epsilon<Value_t>()); }
-#else // FP_EPSILON
- template<typename Value_t>
- inline bool fp_equal(const Value_t& x, const Value_t& y) { return x == y; }
-
- template<typename Value_t>
- inline bool fp_nequal(const Value_t& x, const Value_t& y) { return x != y; }
-
- template<typename Value_t>
- inline bool fp_less(const Value_t& x, const Value_t& y) { return x < y; }
-
- template<typename Value_t>
- inline bool fp_lessOrEq(const Value_t& x, const Value_t& y) { return x <= y; }
-#endif // FP_EPSILON
-
- template<typename Value_t>
- inline bool fp_greater(const Value_t& x, const Value_t& y)
- { return fp_less(y, x); }
-
- template<typename Value_t>
- inline bool fp_greaterOrEq(const Value_t& x, const Value_t& y)
- { return fp_lessOrEq(y, x); }
-
- template<typename Value_t>
- inline bool fp_truth(const Value_t& d)
- {
- return IsIntType<Value_t>::result
- ? d != 0
- : fp_abs(d) >= Value_t(0.5);
- }
-
- template<typename Value_t>
- inline bool fp_absTruth(const Value_t& abs_d)
- {
- return IsIntType<Value_t>::result
- ? abs_d > 0
- : abs_d >= Value_t(0.5);
- }
-
- template<typename Value_t>
- inline const Value_t& fp_min(const Value_t& d1, const Value_t& d2)
- { return d1<d2 ? d1 : d2; }
-
- template<typename Value_t>
- inline const Value_t& fp_max(const Value_t& d1, const Value_t& d2)
- { return d1>d2 ? d1 : d2; }
-
- template<typename Value_t>
- inline const Value_t fp_not(const Value_t& b)
- { return Value_t(!fp_truth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_notNot(const Value_t& b)
- { return Value_t(fp_truth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_absNot(const Value_t& b)
- { return Value_t(!fp_absTruth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_absNotNot(const Value_t& b)
- { return Value_t(fp_absTruth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_and(const Value_t& a, const Value_t& b)
- { return Value_t(fp_truth(a) && fp_truth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_or(const Value_t& a, const Value_t& b)
- { return Value_t(fp_truth(a) || fp_truth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_absAnd(const Value_t& a, const Value_t& b)
- { return Value_t(fp_absTruth(a) && fp_absTruth(b)); }
-
- template<typename Value_t>
- inline const Value_t fp_absOr(const Value_t& a, const Value_t& b)
- { return Value_t(fp_absTruth(a) || fp_absTruth(b)); }
-
- /////////////
- /* Opcode analysis functions are used by fp_opcode_add.inc */
- /* Moved here from fparser.cc because fp_opcode_add.inc
- * is also now included by fpoptimizer.cc
- */
- bool IsLogicalOpcode(unsigned op);
- bool IsComparisonOpcode(unsigned op);
- unsigned OppositeComparisonOpcode(unsigned op);
- bool IsNeverNegativeValueOpcode(unsigned op);
- bool IsAlwaysIntegerOpcode(unsigned op);
- bool IsUnaryOpcode(unsigned op);
- bool IsBinaryOpcode(unsigned op);
- bool HasInvalidRangesOpcode(unsigned op);
-
- template<typename Value_t>
- inline Value_t DegreesToRadians(Value_t degrees)
- {
- return degrees * fp_const_deg_to_rad<Value_t>();
- }
-
- template<typename Value_t>
- inline Value_t RadiansToDegrees(Value_t radians)
- {
- return radians * fp_const_rad_to_deg<Value_t>();
- }
-
- template<typename Value_t>
- inline bool isEvenInteger(Value_t value)
- {
- const Value_t halfValue = value * Value_t(0.5);
- return fp_equal(halfValue, fp_floor(halfValue));
- }
-
- template<typename Value_t>
- inline bool isInteger(Value_t value)
- {
- return fp_equal(value, fp_floor(value));
- }
-
- // Is value an integer that fits in "long" datatype?
- template<typename Value_t>
- inline bool isLongInteger(Value_t value)
- {
- return value == Value_t( makeLongInteger(value) );
- }
-
- template<typename Value_t>
- inline long makeLongInteger(Value_t value)
- {
- return (long) fp_int(value);
- }
-
-#ifdef FP_SUPPORT_LONG_INT_TYPE
- template<>
- inline bool isEvenInteger(long value)
- {
- return value%2 == 0;
- }
-
- template<>
- inline bool isInteger(long) { return true; }
-
- template<>
- inline bool isLongInteger(long) { return true; }
-
- template<>
- inline long makeLongInteger(long value)
- {
- return value;
- }
-#endif
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
- template<>
- inline bool isInteger(MpfrFloat value) { return value.isInteger(); }
-
- template<>
- inline bool isEvenInteger(MpfrFloat value)
- {
- return isInteger(value) && value%2 == 0;
- }
-
- template<>
- inline long makeLongInteger(MpfrFloat value)
- {
- return (long) value.toInt();
- }
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
- template<>
- inline bool isEvenInteger(GmpInt value)
- {
- return value%2 == 0;
- }
-
- template<>
- inline bool isInteger(GmpInt) { return true; }
-
- template<>
- inline long makeLongInteger(GmpInt value)
- {
- return (long) value.toInt();
- }
-#endif
-
- template<typename Value_t>
- inline bool isOddInteger(Value_t value)
- {
- const Value_t halfValue = (value + Value_t(1)) * Value_t(0.5);
- return fp_equal(halfValue, fp_floor(halfValue));
- }
-
-#ifdef FP_SUPPORT_LONG_INT_TYPE
- template<>
- inline bool isOddInteger(long value)
- {
- return value%2 != 0;
- }
-#endif
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
- template<>
- inline bool isOddInteger(MpfrFloat value)
- {
- return value.isInteger() && value%2 != 0;
- }
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
- template<>
- inline bool isOddInteger(GmpInt value)
- {
- return value%2 != 0;
- }
-#endif
-} // namespace FUNCTIONPARSERTYPES
-
-#endif // ONCE_FPARSER_H_
-
-
-#ifndef FP_DISABLE_DOUBLE_TYPE
-# define FUNCTIONPARSER_INSTANTIATE_D(g) g(double)
-#else
-# define FUNCTIONPARSER_INSTANTIATE_D(g)
-#endif
-
-#ifdef FP_SUPPORT_FLOAT_TYPE
-# define FUNCTIONPARSER_INSTANTIATE_F(g) g(float)
-#else
-# define FUNCTIONPARSER_INSTANTIATE_F(g)
-#endif
-
-#ifdef FP_SUPPORT_LONG_DOUBLE_TYPE
-# define FUNCTIONPARSER_INSTANTIATE_LD(g) g(long double)
-#else
-# define FUNCTIONPARSER_INSTANTIATE_LD(g)
-#endif
-
-#ifdef FP_SUPPORT_LONG_INT_TYPE
-# define FUNCTIONPARSER_INSTANTIATE_LI(g) g(long)
-#else
-# define FUNCTIONPARSER_INSTANTIATE_LI(g)
-#endif
-
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
-# define FUNCTIONPARSER_INSTANTIATE_MF(g) g(MpfrFloat)
-#else
-# define FUNCTIONPARSER_INSTANTIATE_MF(g)
-#endif
-
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-# define FUNCTIONPARSER_INSTANTIATE_GI(g) g(GmpInt)
-#else
-# define FUNCTIONPARSER_INSTANTIATE_GI(g)
-#endif
-
-/* Add 'FUNCTIONPARSER_INSTANTIATE_TYPES' at the end of all .cc files
- containing FunctionParserBase implementations.
- */
-#define FUNCTIONPARSER_INSTANTIATE_BASE(type) \
- template class FunctionParserBase<type>;
-
-#define FUNCTIONPARSER_INSTANTIATE_TYPES \
- FUNCTIONPARSER_INSTANTIATE_D(FUNCTIONPARSER_INSTANTIATE_BASE) \
- FUNCTIONPARSER_INSTANTIATE_F(FUNCTIONPARSER_INSTANTIATE_BASE) \
- FUNCTIONPARSER_INSTANTIATE_LD(FUNCTIONPARSER_INSTANTIATE_BASE) \
- FUNCTIONPARSER_INSTANTIATE_LI(FUNCTIONPARSER_INSTANTIATE_BASE) \
- FUNCTIONPARSER_INSTANTIATE_MF(FUNCTIONPARSER_INSTANTIATE_BASE) \
- FUNCTIONPARSER_INSTANTIATE_GI(FUNCTIONPARSER_INSTANTIATE_BASE)
-
-#endif // ONCE_FPARSER_AUX_H_
diff --git a/fparser/fpconfig.hh b/fparser/fpconfig.hh
deleted file mode 100644
index 9607a79..0000000
--- a/fparser/fpconfig.hh
+++ /dev/null
@@ -1,132 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen *|
-|* *|
-|* This library is distributed under the terms of the *|
-|* GNU Lesser General Public License version 3. *|
-|* (See lgpl.txt and gpl.txt for the license text.) *|
-\***************************************************************************/
-
-// Configuration file
-// ------------------
-
-/* NOTE:
- This file is for the internal use of the function parser only.
- You don't need to include this file in your source files, just
- include "fparser.hh".
-*/
-
-
-/* Uncomment any of these lines or define them in your compiler settings
- to enable the correspondent version of the parser. (These are disabled
- by default because they rely on C99 functions, and non-standard libraries
- in the case pf MPFR and GMP, and they make compiling needlessly slower
- and the resulting binary needlessly larger if they are not used in the
- program.)
-*/
-//#define FP_SUPPORT_FLOAT_TYPE
-//#define FP_SUPPORT_LONG_DOUBLE_TYPE
-//#define FP_SUPPORT_LONG_INT_TYPE
-//#define FP_SUPPORT_MPFR_FLOAT_TYPE
-//#define FP_SUPPORT_GMP_INT_TYPE
-
-/* Uncomment this line of define it in your compiler settings if you want
- to disable compiling the basic double version of the library, in case
- one of the above types is used but not the double type. (If the double
- type is not used, then disabling it makes compiling faster and the
- resulting binary smaller.)
- */
-//#define FP_DISABLE_DOUBLE_TYPE
-
-/*
- Note that these do not change what FunctionParser supports, they only
- change how the function is evaluated, potentially making it faster when
- these functions are involved.
- These will make the source code use asinh(), acosh(), atanh(), exp2()
- and log2().
-*/
-//#define FP_SUPPORT_TR1_MATH_FUNCS
-
-#ifdef FP_SUPPORT_TR1_MATH_FUNCS
-#define FP_SUPPORT_ASINH
-#define FP_SUPPORT_EXP2
-#define FP_SUPPORT_LOG2
-#define FP_SUPPORT_CBRT
-#define FP_SUPPORT_HYPOT
-#endif
-
-/*
- Comment out the following line to enable the eval() function, which can
- be used in the function string to recursively call the same function.
- Note that enabling this function may be dangerous even if the maximum
- recursion level is limited because it is still possible to write functions
- using it which take enormous amounts of time to evaluate even though the
- maximum recursion is never reached. This may be undesirable in some
- applications.
- Alternatively you can define the FP_ENABLE_EVAL precompiler constant in
- your compiler settings.
-*/
-#ifndef FP_ENABLE_EVAL
-#define FP_DISABLE_EVAL
-#endif
-
-
-/*
- Maximum recursion level for eval() calls:
-*/
-#define FP_EVAL_MAX_REC_LEVEL 1000
-
-
-/*
- Whether to use shortcut evaluation for the & and | operators:
-*/
-#ifndef FP_DISABLE_SHORTCUT_LOGICAL_EVALUATION
-#define FP_ENABLE_SHORTCUT_LOGICAL_EVALUATION
-#endif
-
-/*
- Whether to enable optimizations that may ignore side effects
- of if() calls, such as changing if(x,!y,0) into x&!y.
- This is basically the polar opposite of "shortcut logical evaluation".
- Disabled by default, because it makes eval() rather unsafe.
-*/
-#ifdef FP_ENABLE_IGNORE_IF_SIDEEFFECTS
-#endif
-
-/*
- Comment out the following lines out if you are not going to use the
- optimizer and want a slightly smaller library. The Optimize() method
- can still be called, but it will not do anything.
- If you are unsure, just leave it. It won't slow down the other parts of
- the library.
-*/
-#ifndef FP_NO_SUPPORT_OPTIMIZER
-#define FP_SUPPORT_OPTIMIZER
-#endif
-
-
-/*
- Epsilon value used with the comparison operators (must be non-negative):
- (Comment it out if you don't want to use epsilon in comparisons. Might
- lead to marginally faster evaluation of the comparison operators, but
- can introduce inaccuracies in comparisons.)
-*/
-#define FP_EPSILON 1e-14
-
-
-/*
- No member function of FunctionParser is thread-safe. Most prominently,
- Eval() is not thread-safe. By uncommenting one of these lines the Eval()
- function can be made thread-safe at the cost of a possible small overhead.
- The second version requires that the compiler supports the alloca() function,
- which is not standard, but is faster.
- */
-//#define FP_USE_THREAD_SAFE_EVAL
-//#define FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA
-
-/*
- Uncomment (or define in your compiler options) to disable evaluation checks.
- (Consult the documentation for details.)
- */
-//#define FP_NO_EVALUATION_CHECKS
diff --git a/fparser/fpoptimizer.cc b/fparser/fpoptimizer.cc
deleted file mode 100644
index 5245eb7..0000000
--- a/fparser/fpoptimizer.cc
+++ /dev/null
@@ -1,10839 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Function optimizer *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Joel Yliluoma *|
-|* *|
-|* This library is distributed under the terms of the *|
-|* GNU Lesser General Public License version 3. *|
-|* (See lgpl.txt and gpl.txt for the license text.) *|
-\***************************************************************************/
-
-/* NOTE:
- This file contains generated code (from the optimizer sources) and is
- not intended to be modified by hand. If you want to modify the optimizer,
- download the development version of the library.
-*/
-
-#include "fpconfig.hh"
-#ifdef FP_SUPPORT_OPTIMIZER
-#include "fparser.hh"
-#include "fptypes.hh"
-#define i43 nW1 a),
-#define i33 info.yH
-#define i23 ,cAtan2
-#define i13 =false;
-#define i03 cAbsIf
-#define tZ3 "Found "
-#define tY3 },{{2,
-#define tX3 {if(apos
-#define tW3 stackpos
-#define tV3 "dup(%u) "
-#define tU3 GetOpcode
-#define tT3 eR{assert
-#define tS3 "%d, cost "
-#define tR3 "immed "<<
-#define tQ3 mFuncParsers
-#define tP3 "PUSH ";xE3(
-#define tO3 stderr
-#define tN3 sep2=" "
-#define tM3 FPHASH_CONST
-#define tL3 cache_needed[
-#define tK3 fprintf
-#define tJ3 ::cout<<"Applying "
-#define tI3 ||tree.tU3
-#define tH3 HANDLE_UNARY_CONST_FUNC
-#define tG3 within,
-#define tF3 y21){if
-#define tE3 c_count
-#define tD3 s_count
-#define tC3 MaxOp
-#define tB3 2)lS 2*
-#define tA3 x11.cG3
-#define t93 l7 0,2,
-#define t83 <eS1(0)
-#define t73 );else{
-#define t63 (n6)nN3
-#define t53 b.Value)
-#define t43 b.Opcode
-#define t33 .nB synth
-#define t23 ].swap(
-#define t13 =synth.
-#define t03 codes[b
-#define eZ3 Value){
-#define eY3 whydump
-#define eX3 i01 eF2
-#define eW3 for(x53
-#define eV3 ;for yS{
-#define eU3 );synth
-#define eT3 info.SaveMatchedParamIndex(
-#define eS3 for(;a<
-#define eR3 nparams
-#define eQ3 first!=
-#define eP3 i03,
-#define eO3 l3 4,1,
-#define eN3 cTan,xJ
-#define eM3 cLog,xJ
-#define eL3 l3 0,1,
-#define eK3 cHypot,
-#define eJ3 nR 0,
-#define eI3 cAbs nR
-#define eH3 std::cO
-#define eG3 fp_pow(
-#define eF3 ,cM2 lD
-#define eE3 .second
-#define eD3 ]eE3
-#define eC3 ].first
-#define eB3 Ne_Mask
-#define eA3 Gt_Mask
-#define e93 Lt_Mask
-#define e83 {nL eS1(
-#define e73 131,4,1,
-#define e63 tC1 max
-#define e53 tU cMul);
-#define e43 131,8,1
-#define e33 FindPos
-#define e23 nN yL
-#define e13 public:
-#define e03 result xM
-#define cZ3 result))lA2
-#define cY3 result(
-#define cX3 {data->
-#define cW3 .eW1 n]
-#define cV3 eG cK1);
-#define cU3 eG yR1
-#define cT3 if(eY1==
-#define cS3 ),has_max(
-#define cR3 (count
-#define cQ3 .empty()
-#define cP3 .iH1 a);
-#define cO3 GetParamCount(nQ
-#define cN3 GetParamCount();
-#define cM3 ;}case
-#define cL3 pclone
-#define cK3 sim.x3
-#define cJ3 fpdata
-#define cI3 cCosh nR
-#define cH3 cCosh,
-#define cG3 Immeds
-#define cF3 l6 1,
-#define cE3 x8(tB2
-#define cD3 newpow
-#define cC3 change
-#define cB3 133,2,
-#define cA3 i01 x2
-#define c93 Params
-#define c83 Needs
-#define c73 byteCode
-#define c63 eT1&occ=
-#define c53 child)
-#define c43 AddFrom(
-#define c33 lT1 nE==
-#define c23 ;for xK2
-#define c13 tC1 lY1
-#define c03 factor_t
-#define yZ3 tree.xJ1
-#define yY3 yA tmp2)
-#define yX3 value1
-#define yW3 model.
-#define yV3 true;n31
-#define yU3 &&p0.max
-#define yT3 p2 eT ifp2
-#define yS3 yJ p2;p2
-#define yR3 cAbsNot
-#define yQ3 switch(tX
-#define yP3 tZ case
-#define yO3 IsNever
-#define yN3 }switch
-#define yM3 stackptr
-#define yL3 nN[++IP]
-#define yK3 const xH
-#define yJ3 yE cPow)
-#define yI3 default_function_handling
-#define yH3 cLog);x9
-#define yG3 ;sim.Push(
-#define yF3 eS1(0.5)
-#define yE3 iJ 1,
-#define yD3 [funcno].
-#define yC3 :start_at()
-#define yB3 Rehash(tT yA
-#define yA3 .size()
-#define y93 IsLogicalValue nW1
-#define y83 (tree))e5
-#define y73 stack[stack yA3-
-#define y63 stack yL
-#define y53 tmp yC 0))
-#define y43 ));tmp tU
-#define y33 ,(long tG1
-#define y23 );tmp2 yC
-#define y13 cMul);xK
-#define y03 1),eS1(1))
-#define xZ3 constvalue
-#define xY3 lD 0));
-#define xX3 )nG1 xK
-#define xW3 nN[IP]==
-#define xV3 opcodes
-#define xU3 did_muli
-#define xT3 switch(lF3.first iY2
-#define xS3 ;for iL1
-#define xR3 Ge0Lt1
-#define xQ3 &&p.max
-#define xP3 :tree.
-#define xO3 =y6 a));if(
-#define xN3 used[b]
-#define xM3 e8(),yG<
-#define xL3 size_t n
-#define xK3 sizeof(
-#define xJ3 cNotNot,
-#define xI3 cOr yF
-#define xH3 359463,
-#define xG3 2,7168,
-#define xF3 param.
-#define xE3 DumpTree
-#define xD3 Gt0Le1
-#define xC3 y21){eS1
-#define xB3 base,eS1
-#define xA3 ==cOr)l9
-#define x93 cAdd iU1
-#define x83 (cM2 lD
-#define x73 lD 2));
-#define x63 eT cond
-#define x53 iX2 0;b<
-#define x43 {}range(
-#define x33 .n_int_sqrt
-#define x23 ,cPow,xJ
-#define x13 ,{1,218,
-#define x03 lD 1))
-#define nZ3 tmp yA tree
-#define nY3 eS1(1)))
-#define nX3 iterator
-#define nW3 begin();
-#define nV3 TreeSet
-#define nU3 parent
-#define nT3 insert(i
-#define nS3 newrel
-#define nR3 eS1(2)));
-#define nQ3 {eS1 tmp
-#define nP3 iU.hash1
-#define nO3 (tree)!=
-#define nN3 )n5 lC
-#define nM3 break;}
-#define nL3 b_needed
-#define nK3 cachepos
-#define nJ3 half=
-#define nI3 src_pos
-#define nH3 reserve(
-#define nG3 treeptr
-#define nF3 iC2 size()
-#define nE3 .resize(
-#define nD3 eU1 void
-#define nC3 ImmedTag
-#define nB3 a,const
-#define nA3 RefCount
-#define n93 Birth();
-#define n83 mulgroup
-#define n73 template
-#define n63 cost_t
-#define n53 n72 nZ
-#define n43 middle
-#define n33 ))break;eS1
-#define n23 };enum
-#define n13 if(op==
-#define n03 (p1.xJ1
-#define lZ3 cLog2by);
-#define lY3 sqrt_cost
-#define lX3 const int
-#define lW3 mul_count
-#define lV3 maxValue1
-#define lU3 minValue1
-#define lT3 maxValue0
-#define lS3 minValue0
-#define lR3 ValueType
-#define lQ3 >(eS1(1),
-#define lP3 abs_mul
-#define lO3 pos_set
-#define lN3 goto e3
-#define lM3 nF1);}if(
-#define lL3 yE cAdd);
-#define lK3 subtree
-#define lJ3 invtree
-#define lI3 lV1=r.specs;if(r.found){
-#define lH3 ,lV1,info
-#define lG3 a;if(&t91
-#define lF3 parampair
-#define lE3 rulenumit
-#define lD3 cIf,l6 3,
-#define lC3 MakeEqual
-#define lB3 nH1,l4::
-#define lA3 nH1,{l4::
-#define l93 newbase
-#define l83 branch1op
-#define l73 branch2op
-#define l63 overlap
-#define l53 truth_a
-#define l43 ),Value(
-#define l33 );nW l4::
-#define l23 if nW1 0)
-#define l13 found_dup
-#define l03 &1)?(poly^(
-#define iZ2 (xF3
-#define iY2 ){case
-#define iX2 size_t b=
-#define iW2 i0 xQ3
-#define iV2 has_min
-#define iU2 Plan_Has(
-#define iT2 ;if(half
-#define iS2 ;}void
-#define iR2 )iS2
-#define iQ2 const nI2
-#define iP2 yV1 class
-#define iO2 namespace
-#define iN2 rhs.hash2;}
-#define iM2 rhs.hash1
-#define iL2 ::res,b8<
-#define iK2 inverted
-#define iJ2 has_max=
-#define iI2 has_max)
-#define iH2 iftree
-#define iG2 depcodes
-#define iF2 explicit
-#define iE2 VarBegin
-#define iD2 cM3 lZ2
-#define iC2 c93.
-#define iB2 ].data);
-#define iA2 y4)));nW
-#define i92 .what eX
-#define i82 ;if(fp_equal(
-#define i72 x02 yJ
-#define i62 begin(),
-#define i52 cond_add
-#define i42 cond_mul
-#define i32 cond_and
-#define i22 yG n91
-#define i12 bool e31
-#define i02 unsigned
-#define tZ2 costree
-#define tY2 sintree
-#define tX2 leaf_count
-#define tW2 =GetParam(
-#define tV2 sub_params
-#define tU2 printf(
-#define tT2 cbrt_count
-#define tS2 sqrt_count
-#define tR2 Finite
-#define tQ2 p1 eT ifp1
-#define tP2 pcall_tree
-#define tO2 after_powi
-#define tN2 grammar
-#define tM2 lE 0,1,
-#define tL2 cCos,xJ
-#define tK2 cEqual,
-#define tJ2 ,eO3 507 tS
-#define tI2 ,t71 l7 2,2,
-#define tH2 cLog nR
-#define tG2 l0 2,
-#define tF2 cPow,nU
-#define tE2 cAdd,xZ 2,
-#define tD2 cInv,xZ 1,
-#define tC2 cNeg,xZ 1,
-#define tB2 ),0},{
-#define tA2 x11.SubTrees
-#define t92 x11.Others
-#define t82 param=*i01
-#define t72 std::move(
-#define t62 nM3 switch(
-#define t52 constraints=
-#define t42 .constraints
-#define t32 data;data.
-#define t22 MakeNEqual
-#define t12 for yS eC1
-#define t02 yA mul)
-#define eZ2 Dump(std::
-#define eY2 isInteger(
-#define eX2 (cond.cI cA2
-#define eW2 yA3;++
-#define eV2 nG1 r;r tU
-#define eU2 Comparison
-#define eT2 needs_flip
-#define eS2 {data xB lM
-#define eR2 ,eQ,synth);
-#define eQ2 (half&63)-1;
-#define eP2 value]
-#define eO2 ));TriTruthValue
-#define eN2 );range.nN2
-#define eM2 ,2,1,4,1,2,
-#define eL2 >StackMax)
-#define eK2 ~size_t(0)
-#define eJ2 );t4=!t4;}
-#define eI2 ;}yV1 static
-#define eH2 info.lQ[b].
-#define eG2 const std::eO
-#define eF2 Rule&rule,
-#define eE2 .GetHash().
-#define eD2 (list.first
-#define eC2 ;iU.hash2+=
-#define eB2 ,xA1);lC
-#define eA2 ,const e1&
-#define e92 struct
-#define e82 cGreater,
-#define e72 tree lD 0)
-#define e62 const eS1&
-#define e52 mul_item
-#define e42 innersub
-#define e32 cbrt_cost
-#define e22 best_cost
-#define e12 )))l81 lH
-#define e02 result i0
-#define cZ2 fp_mod(m.
-#define cY2 Compare>
-#define cX2 (*x6)[a].info
-#define cW2 tree y21 yI
-#define cV2 tree nE==
-#define cU2 condition
-#define cT2 per_item
-#define cS2 item_type
-#define cR2 first2
-#define cQ2 ,l8 0,2,
-#define cP2 tS 396676
-#define cO2 Decision
-#define cN2 not_tree
-#define cM2 leaf1
-#define cL2 =tree lD
-#define cK2 group_by
-#define cJ2 ->second
-#define cI2 targetpos
-#define cH2 eat_count
-#define cG2 ParamSpec
-#define cF2 Forget()
-#define cE2 exponent
-#define cD2 ,bool abs){
-#define cC2 synth.Find(
-#define cB2 params
-#define cA2 &&cond eH))
-#define c92 source_tree
-#define c82 nE==cLog2&&
-#define c72 =lT1;bool iQ
-#define c62 <t8,n63>
-#define c52 p1_evenness
-#define c42 c32 i13 if(
-#define c32 tC1 iV2
-#define c22 isNegative(
-#define c12 n73 i5
-#define c02 neg_set
-#define yZ2 StackTopIs(
-#define yY2 cNop,cNop}}
-#define yX2 synth.PushImmed(
-#define yW2 FPoptimizer_ByteCode yU2
-#define yV2 FPoptimizer_ByteCode::
-#define yU2 ::ByteCodeSynth x8
-#define yT2 cTanh,cNop,
-#define yS2 matches
-#define yR2 goto fail;}
-#define yQ2 cSin,xJ
-#define yP2 cTan nR
-#define yO2 cCos nR
-#define yN2 negated
-#define yM2 i7,1,iX+1);
-#define yL2 CodeTree
-#define yK2 yL2 x8
-#define yJ2 ifdata
-#define yI2 best_score
-#define yH2 mulvalue
-#define yG2 pow_item
-#define yF2 nE==cPow&&tJ
-#define yE2 PowiResult
-#define yD2 maxValue
-#define yC2 minValue
-#define yB2 ;pow tU cPow);pow
-#define yA2 result cM3
-#define y92 fp_min(xA,
-#define y82 set_min_max(
-#define y72 div_tree
-#define y62 pow_tree
-#define y52 preserve
-#define y42 PullResult()
-#define y32 dup_or_fetch
-#define y22 nominator]
-#define y12 Rehash(false
-#define y02 test_order
-#define xZ2 lF3,
-#define xY2 .param_count
-#define xX2 shift(index)
-#define xW2 rulenumber
-#define xV2 cTanh nR
-#define xU2 (tree nE
-#define xT2 GetDepth()
-#define xS2 factor_immed
-#define xR2 changes
-#define xQ2 tU tree nE);
-#define xP2 tU cond nE
-#define xO2 Become nW1
-#define xN2 },0,0x1},{{1,
-#define xM2 ,lJ 0x7 tY3
-#define xL2 ;n41 eT y9 lD
-#define xK2 (size_t a=
-#define xJ2 ;}static yN1
-#define xI2 tree lD a)
-#define xH2 for(typename
-#define xG2 exp_diff
-#define xF2 ExponentInfo
-#define xE2 lower_bound(
-#define xD2 factor
-#define xC2 is_logical
-#define xB2 newrel_and
-#define xA2 Suboptimal
-#define x92 cW[c tO
-#define x82 IsAlways;if(
-#define x72 n73 nA1
-#define x62 res_stackpos
-#define x52 half_pos
-#define x42 ;}else{x6=new
-#define x32 )lS 3*
-#define x22 {e1 start_at;
-#define x12 ,(long double)
-#define x02 .Rehash()
-#define nZ2 )return
-#define nY2 );cK3 iJ 2,
-#define nX2 return false;}
-#define nW2 );nM3
-#define nV2 xD1 tA+1);
-#define nU2 ;i7.Remember(
-#define nT2 .match_tree
-#define nS2 l81 true;}
-#define nR2 nD OPCODE
-#define nQ2 yG x8&immed,
-#define nP2 >>1)):(
-#define nO2 CodeTreeData
-#define nN2 multiply(
-#define nM2 i0 i13
-#define nL2 .n73
-#define nK2 var_trees
-#define nJ2 cOr,lP 2,
-#define nI2 yL2&
-#define nH2 ::Optimize(){
-#define nG2 second eE3;
-#define nF2 second.first;
-#define nE2 log2_exponent
-#define nD2 tT.swap(tmp);
-#define nC2 Value(Value::
-#define nB2 dup_fetch_pos
-#define nA2 nN,size_t&l31
-#define n92 *)&*start_at;
-#define n82 yO3 yI lC
-#define n72 ,tree))
-#define n62 ContainsOtherCandidates(
-#define n52 ,cPow l7 2,2,
-#define n42 cSin nR
-#define n32 lK 2},0,iR 1,
-#define n22 lK 1},0,iR 1,
-#define n12 Value_EvenInt
-#define n02 Sign_Negative
-#define lZ2 SubFunction:{
-#define lY2 ParamHolder:{
-#define lX2 MakeFalse,{l4
-#define lW2 if(xW lD a)iA
-#define lV2 ConditionType
-#define lU2 SpecialOpcode
-#define lT2 synth_it
-#define lS2 fp_max(xA);
-#define lR2 assimilated
-#define lQ2 fraction
-#define lP2 0x12},{{
-#define lO2 DUP_BOTH();
-#define lN2 -1-offset].
-#define lM2 tU3()
-#define lL2 parent_opcode)
-#define lK2 TreeCounts
-#define lJ2 bool t4 i13
-#define lI2 SetOpcode(
-#define lH2 found_log2
-#define lG2 div_params
-#define lF2 .CopyOnWrite()
-#define lE2 immed_sum
-#define lD2 OPCODE(opcode)
-#define lC2 std::cout<<"POP "
-#define lB2 (stack yA3-
-#define lA2 break;result*=
-#define l92 FactorStack x8
-#define l82 IsAlways yI lC
-#define l72 l7 2,2,lB1
-#define l62 248024 tS
-#define l52 cAnd,lP 2,
-#define l42 cNot nR
-#define l32 cMul,xZ 2,
-#define l22 DumpHashesFrom
-#define l12 replacing_slot
-#define l02 RefParams
-#define iZ1 if_always[
-#define iY1 WhatDoWhenCase
-#define iX1 exponent_immed
-#define iW1 new_base_immed
-#define iV1 base_immed
-#define iU1 ||op1==
-#define iT1 (size_t a xX
-#define iS1 data[a eD3
-#define iR1 AddCollection(
-#define iQ1 if(newrel_or==
-#define iP1 DUP_ONE(apos);
-#define iO1 flipped
-#define iN1 .UseGetNeeded(
-#define iM1 e9 2,131,
-#define iL1 (i02
-#define iK1 OptimizedUsing
-#define iJ1 Var_or_Funcno
-#define iI1 iJ1;
-#define iH1 DelParam(
-#define iG1 typename nX1::nX3
-#define iF1 )nZ2 true
-#define iE1 GetParams(
-#define iD1 crc32_t
-#define iC1 fphash_value_t
-#define iB1 signed_chain
-#define iA1 IsDefined())
-#define i91 MinusInf
-#define i81 n_immeds
-#define i71 FindClone(xK
-#define i61 denominator]
-#define i51 needs_rehash
-#define i41 AnyWhere_Rec
-#define i31 minimum_need
-#define i21 ~i02(0)
-#define i11 tC1 min
-#define i01 (const
-#define tZ1 ,i01 void*)&
-#define tY1 41,42,43,44,
-#define tX1 constraints&
-#define tW1 tT.iH1
-#define tV1 p1_logical_b
-#define tU1 p0_logical_b
-#define tT1 p1_logical_a
-#define tS1 p0_logical_a
-#define tR1 ,PowiCache&i7,
-#define tQ1 synth.DoDup(
-#define tP1 else if(
-#define tO1 cache_needed
-#define tN1 e9 2,1,e9 2,
-#define tM1 treelist
-#define tL1 IsDescendantOf(
-#define tK1 has_bad_balance
-#define tJ1 (tree,std::cout)
-#define tI1 .SetParamsMove(
-#define tH1 c03 xD2
-#define tG1 double)cE2
-#define tF1 {case IsAlways:
-#define tE1 e02=false
-#define tD1 ;cE2.Rehash(
-#define tC1 result.
-#define tB1 range x8 result
-#define tA1 TopLevel)
-#define t91 *start_at){x6=(
-#define t81 (rule,tree,info
-#define t71 cNEqual
-#define t61 ,cEqual l7 2,2,
-#define t51 cAdd,AnyParams,
-#define t41 lP2 xG3
-#define t31 ,cNotNot nR
-#define t21 ,cLess l7 2,2,
-#define t11 Oneness_NotOne|
-#define t01 Value_IsInteger
-#define eZ1 iK1(
-#define eY1 reltype
-#define eX1 SequenceOpcodes
-#define eW1 sep_list[
-#define eV1 );eG n83);
-#define eU1 l02);
-#define eT1 TreeCountItem
-#define eS1 Value_t
-#define eR1 divgroup
-#define eQ1 ,eS1(-1)))xF
-#define eP1 set_min(fp_floor
-#define eO1 pihalf_limits
-#define eN1 y41 p0.min>=0.0)
-#define eM1 MaxChildDepth
-#define eL1 situation_flags&
-#define eK1 i02 opcode)
-#define eJ1 =yM|i02(nN yA3
-#define eI1 std::pair<It,It>
-#define eH1 eO3 483 tS
-#define eG1 ,l8 0,1,
-#define eF1 tG2 7168,
-#define eE1 Value_Logical
-#define eD1 new_factor_immed
-#define eC1 if(remaining[a])
-#define eB1 occurance_pos
-#define eA1 exponent_hash
-#define e91 exponent_list
-#define e81 CollectionSet x8
-#define e71 CollectMulGroup(
-#define e61 source_set
-#define e51 cE2,nV3
-#define e41 produce_count
-#define e31 operator
-#define e21 )yJ3;lC
-#define e11 back().thenbranch
-#define e01 ParamSpec_Extract
-#define cZ1 retry_anyparams_3
-#define cY1 retry_anyparams_2
-#define cX1 needlist_cached_t
-#define cW1 grammar_rules[*r]
-#define cV1 tF2 0x1 tY3
-#define cU1 CodeTreeImmed x8(
-#define cT1 GetParamCount()==
-#define cS1 by_float_exponent
-#define cR1 fp_equal(cE2
-#define cQ1 new_exp
-#define cP1 end()&&i->first==
-#define cO1 yB3 r);}
-#define cN1 return BecomeZero;
-#define cM1 return BecomeOne;
-#define cL1 if(lQ yA3<=n2)
-#define cK1 addgroup
-#define cJ1 found_log2by
-#define cI1 ())yE cMul);lC
-#define cH1 >=eS1(0)
-#define cG1 nE==yR3)
-#define cF1 ParsePowiMuli(
-#define cE1 branch1_backup
-#define cD1 branch2_backup
-#define cC1 exponent_map
-#define cB1 plain_set
-#define cA1 LightWeight(
-#define c91 }nM3 case
-#define c81 cN3++b)
-#define c71 synth.x5 1
-#define c61 ,i7 eR2
-#define c51 if(value
-#define c41 set_max(fp_ceil cY
-#define c31 e62 v,n7
-#define c21 {eS1 cE2=
-#define c11 should_regenerate=true;
-#define c01 should_regenerate,
-#define yZ1 Collection
-#define yY1 RelationshipResult
-#define yX1 Subdivide_Combine(
-#define yW1 long value
-#define yV1 n73 lT
-#define yU1 yV1 cA
-#define yT1 yV1 e92
-#define yS1 eP nE3 StackMax
-#define yR1 subgroup
-#define yQ1 best_sep_factor
-#define yP1 tP1!result
-#define yO1 needlist_cached
-#define yN1 inline i02
-#define yM1 221646 tS 24803
-#define yL1 Constness_Const
-#define yK1 opcode,bool pad
-#define yJ1 n_occurrences
-#define yI1 changed=true;
-#define yH1 iH1 a);}
-#define yG1 MakesInteger(
-#define yF1 e62 value
-#define yE1 best_sep_cost
-#define yD1 MultiplicationRange
-#define yC1 ;p1.yB3 p1
-#define yB1 yV1 eS1
-#define yA1 n_stacked
-#define y91 AnyParams_Rec
-#define y81 continue;
-#define y71 Become(value lD 0))
-#define y61 ,cGreater l7 2,2,
-#define y51 yV1 inline TriTruthValue
-#define y41 .iV2&&
-#define y31 ));n41 y3 op1 tT.DelParams(
-#define y21 .IsImmed()
-#define y11 =comp.AddItem(atree
-#define y01 needs_sincos
-#define xZ1 Recheck_RefCount_Div
-#define xY1 Recheck_RefCount_Mul
-#define xX1 n83.
-#define xW1 n83;n83 tU
-#define xV1 MultiplyAndMakeLong(
-#define xU1 cMul);y53;tmp
-#define xT1 covers_plus1
-#define xS1 lD2);
-#define xR1 if(synth.FindAndDup(
-#define xQ1 SynthesizeParam(
-#define xP1 public e8,public yG<
-#define xO1 grammar_func
-#define xN1 221426 tS 237795
-#define xM1 t93 165888 tS
-#define xL1 Modulo_Radians},
-#define xK1 tT.SetParam(
-#define xJ1 GetImmed()
-#define xI1 PositionType
-#define xH1 CollectionResult
-#define xG1 yV1 bool
-#define xF1 const_offset
-#define xE1 stacktop_desired
-#define xD1 SetStackTop(
-#define xC1 ,cLessOrEq l7 2,2,
-#define xB1 yV1 void
-#define xA1 cond_type
-#define x91 Recheck_RefCount_RDiv
-#define x81 static const range x8
-#define x71 fPExponentIsTooLarge(
-#define x61 CollectMulGroup_Item(
-#define x51 pair<eS1,nV3>
-#define x41 covers_full_cycle
-#define x31 AssembleSequence(
-#define x21 x8(rule.repl_param_list,
-#define x11 NeedList
-#define x01 )lF3 eE3
-#define nZ1 <<std::dec<<")";}
-#define nY1 &&IsLogicalValue(
-#define nX1 TreeCountType x8
-#define nW1 (tree lD
-#define nV1 <yK2>
-#define nU1 std::pair<T1,T2>&
-#define nT1 n73<typename
-#define nS1 has_good_balance_found
-#define nR1 Rehash();tV2 yL
-#define nQ1 found_log2_on_exponent
-#define nP1 covers_minus1
-#define nO1 needs_resynth
-#define nN1 immed_product
-#define nM1 }},{ProduceNewTree,2,1,
-#define nL1 ,2,1)nS if(found[data.
-#define nK1 t62 bitmask&
-#define nJ1 Sign_Positive
-#define nI1 {DataP slot_holder(xY[
-#define nH1 ::MakeTrue
-#define nG1 {yK2
-#define nF1 tree.iH1 a
-#define nE1 tree lD 1)y21&&
-#define nD1 },{l4::MakeNotP0,l4::
-#define nC1 SetParamMove(
-#define nB1 CodeTreeImmed(eS1(
-#define nA1 <i02 cY2 void
-#define n91 <yL2>&
-#define n81 yG<i02>&c73,
-#define n71 void ByteCodeSynth x8::
-#define n61 )const{return
-#define n51 rhs n61 hash1
-#define n41 changed_if
-#define n31 min=eS1(0);
-#define n21 opposite=
-#define n11 7168 tS 279818,
-#define n01 l81 xA2;
-#define lZ1 MatchResultType
-#define lY1 resulting_exponent
-#define lX1 Unknown:default:;}
-#define lW1 ,lE 2,1,
-#define lV1 (*x6)[a].start_at
-#define lU1 ,cAdd,SelectedParams,0},0,
-#define lT1 GetParam(a)
-#define lS1 inverse_nominator]
-#define lR1 void FunctionParserBase
-#define lQ1 ,nN,IP,limit,y1,stack);
-#define lP1 ByteCodeSynth x8&synth)
-#define lO1 xS3 a=0;a<xT;++a)
-#define lN1 ;std::cout<<
-#define lM1 const yK2
-#define lL1 const yG nV1
-#define lK1 synth.AddOperation(
-#define lJ1 tQ1 found[data.
-#define lI1 SetParams(iE1));
-#define lH1 o<<"("<<std::hex<<data.
-#define lG1 IfBalanceGood(
-#define lF1 n_as_tan_param
-#define lE1 changed_exponent
-#define lD1 retry_positionalparams_2
-#define lC1 i02 index
-#define lB1 463 tS 273436,
-#define lA1 l7 2,2,473304 tS
-#define l91 {l4::MakeNotP1,l4::
-#define l81 ;return
-#define l71 yO3 l81 Unknown;}
-#define l61 PlanNtimesCache(
-#define l51 AddFunctionOpcode_Float(
-#define l41 FPoptimizer_Grammar
-#define l31 IP,size_t limit,size_t y1
-#define l21 AddOperation(cInv,1,1)nS}
-#define l11 e92 ImmedHashGenerator
-#define l01 GetPositivityInfo nO3
-#define iZ tB2 eS1(
-#define iY CopyOnWrite();
-#define iX recursioncount
-#define iW ParamSpec_SubFunctionData
-#define iV inverse_denominator]
-#define iU NewHash
-#define iT tree.GetParamCount()
-#define iS PositionalParams_Rec
-#define iR 0x4},{{
-#define iQ needs_cow=GetRefCount()>1;
-#define iP );nC1 0,cE2);iH1 1);
-#define iO DumpTreeWithIndent(*this);
-#define iN switch(type iY2 cond_or:
-#define iM CalculateResultBoundaries(
-#define iL e62 v,eS1(lN
-#define iK AddFunctionOpcode_Integer(
-#define iJ sim.Eat(
-#define iI edited_powgroup
-#define iH has_unknown_max
-#define iG has_unknown_min
-#define iF if(keep_powi
-#define iE synthed_tree
-#define iD 356668 tS 24852
-#define iC +2]=yM|i02(Immed yA3);
-#define iB matched_params
-#define iA .IsIdenticalTo(
-#define i9 by_exponent
-#define i8 collections
-#define i7 cache
-#define i6 }inline
-#define i5 lT void range x8::
-#define i4 yA comp.cB1[a].value);
-#define i3 AnyParams,2},0,0x0},{{
-#define i2 cS1.data
-#define i1 iF2 nO2(
-#define i0 .has_max
-#define tZ goto ReplaceTreeWithZero;
-#define tY :goto ReplaceTreeWithOne;case
-#define tX GetLogicalValue nW1
-#define tW lN1 std::endl;DumpHashes(
-#define tV ;p2.yB3 p2);tH iH2 nE);e5}
-#define tU .lI2
-#define tT );tree
-#define tS ,{2,
-#define tR lZ 0x0},{{
-#define tQ yV1 nA
-#define tP MakeFalse,l4::
-#define tO ].relationship
-#define tN <=fp_const_negativezero x8())
-#define tM .hash1|=key;iC1 n9
-#define tL [n2 eC3=true;lQ[n2 eD3
-#define tK l41::Grammar*
-#define tJ powgroup lD
-#define tI ;pow tU cLog);tH cMul);
-#define tH tree tU
-#define tG eK2&&found[data.
-#define tF },{l4::MakeNotNotP1,l4::
-#define tE },{l4::MakeNotNotP0,l4::
-#define tD cN3 a-->0;)if(
-#define tC nB1(
-#define tB has_mulgroups_remaining
-#define tA StackTop
-#define t9 MatchInfo x8&
-#define t8 int_exponent_t
-#define t7 RootPowerTable x8::RootPowers[
-#define t6 MatchPositionSpec_AnyParams x8
-#define t5 iO2 FPoptimizer_ByteCode
-#define t4 is_signed
-#define t3 iE1));xX1 Rehash();
-#define t2 result_positivity
-#define t1 biggest_minimum
-#define t0 const iW
-#define eZ ParamSpec_NumConstant x8
-#define eY yK2&tree,std::ostream&o
-#define eX !=Unchanged)if(TestCase(
-#define eW cond_tree
-#define eV else_tree
-#define eU then_tree
-#define eT .AddParam(
-#define eS ;xE3(tree)lN1"\n";
-#define eR yK2&tree)
-#define eQ sequencing
-#define eP StackState
-#define eO string FP_GetOpcodeName(
-#define eN if_stack
-#define eM {return yK2(
-#define eL n_as_sin_param
-#define eK n_as_cos_param
-#define eJ PowiResolver::
-#define eI ];};extern"C"{
-#define eH .BalanceGood
-#define eG AddParamMove(
-#define eF valueType
-#define eE best_factor
-#define eD back().endif_location
-#define eC iC1(iJ1)
-#define eB iC1 key
-#define eA l8 2,1,
-#define e9 130,1,
-#define e8 MatchPositionSpecBase
-#define e7 iF2 yL2(
-#define e6 smallest_maximum
-#define e5 goto redo;
-#define e4 ++IP;y81}if(xW3 xV3.
-#define e3 ReplaceTreeWithParam0;
-#define e2 factor_needs_rehashing
-#define e1 MatchPositionSpecBaseP
-#define e0 nL eS1(-y03;
-#define cZ 79,112,113,117,118,123,124,127,128,
-#define cY )l81 m cM3
-#define cX e01 x8(nM.param_list,
-#define cW relationships
-#define cV 28,29,30,31,32,33,34,35,36,
-#define cU cIf,l0 3,
-#define cT lK 2},0,0x0},{{
-#define cS data.subfunc_opcode
-#define cR }if eD2.xJ1==eS1(
-#define cQ otherhalf
-#define cP :{AdoptChildrenWithSameOpcode(tree);
-#define cO map<fphash_t,std::set<std::string> >
-#define cN const SequenceOpCode x8
-#define cM =fp_cosh(m.min);m.max=fp_cosh(m.max);
-#define cL MatchPositionSpec_PositionalParams x8
-#define cK eS1(1.5)*fp_const_pi x8()
-#define cJ !=Unchanged nZ2 iZ1
-#define cI FoundChild
-#define cH CalculatePowiFactorCost(
-#define cG T1,typename T2>inline i12()(
-#define cF yK2 tmp;tmp tU
-#define cE has_nonlogical_values
-#define cD from_logical_context)
-#define cC for xK2 xW.cN3 a-->0;)
-#define cB POWI_CACHE_SIZE
-#define cA static inline yK2
-#define c9 BalanceResultType
-#define c8 cIf,eL3
-#define c7 nA3(0),Opcode(
-#define c6 const{return data->
-#define c5 +=fp_const_twopi x8();
-#define c4 .AddOperation(lM2,
-#define c3 for xK2 0;a<cN3++a){if(
-#define c2 static void MakeHash(nD fphash_t&iU,
-#define c1 l2 2,
-#define c0 MatchPositionSpec_AnyWhere
-#define yZ if iZ2 data.match_type==
-#define yY }PACKED_GRAMMAR_ATTRIBUTE;
-#define yX ,cGreaterOrEq l7 2,2,
-#define yW void OutFloatHex(std::ostream&o,
-#define yV yV1 x72 range x8::
-#define yU b;}};n73<>e92 Comp<
-#define yT eT CodeTreeImmed(
-#define yS xK2 0;a<iT;++a)
-#define yR t93 115824 tS 122999,
-#define yQ t93 129136 tS 128123,
-#define yP t93 472176 tS 24699,
-#define yO ,typename yK2::
-#define yN AssembleSequence_Subdivide(
-#define yM 0x80000000u
-#define yL .push_back(
-#define yK !=eK2){lJ1
-#define yJ ;yK2
-#define yI nZ2 false;
-#define yH paramholder_matches
-#define yG std::vector
-#define yF ,AnyParams,0 l1 0,1,
-#define yE ;iJ 2,
-#define yD for(lE3 r=range.first;r!=range eE3;++r){
-#define yC eT tree lD
-#define yB ComparisonSetBase::
-#define yA .eG
-#define y9 branch2
-#define y8 fp_const_twopi x8());if(
-#define y7 n73 set_min_max_if<cGreater>(eS1(0),
-#define y6 iM tree lD
-#define y5 =y6 0));range x8
-#define y4 tree lD 1).xJ1
-#define y3 x02;tH
-#define y2 lX&&tree lD 1)y21
-#define y1 factor_stack_base
-#define y0 cPow,l6 2,
-#define xZ GroupFunction,0},n0{{
-#define xY data->c93
-#define xX =0;a<nU3.cN3++a)if(
-#define xW branch1
-#define xV {lK2.erase(i);y81}
-#define xU xK2 iT;a-->0;)
-#define xT nM xY2
-#define xS i02 c;i02 char l[
-#define xR 158,167,168,169,178,179,191,195,203,207,215,227,229,232,233,234,235,236,239,240,241,242,245,246,247,248,250,251}};}e92
-#define xQ using iO2 FUNCTIONPARSERTYPES;
-#define xP const eY=std::cout
-#define xO IsIdenticalTo(leaf2 lD
-#define xN FPOPT_autoptr
-#define xM +=result l81 result;}yV1 inline eS1
-#define xL int_exponent
-#define xK newnode
-#define xJ l3 2,1,
-#define xI ParamSpec_SubFunction
-#define xH ParamSpec_ParamHolder
-#define xG has_highlevel_opcodes
-#define xF {if(needs_cow){iY goto
-#define xE ;if(fp_nequal(tmp,eS1(0)))lL eS1(1)/tmp)n5}lC
-#define xD },{l4::Unchanged,l4::Never},{l4::Unchanged,l4::Never}}
-#define xC best_selected_sep
-#define xB ->Recalculate_Hash_NoRecursion();}
-#define xA fp_sin(min),fp_sin(max))
-#define x9 sim.AddConst(
-#define x8 <eS1>
-#define x7 :nG1 tmp,tmp2;tmp2 tU
-#define x6 position
-#define x5 GetStackTop()-
-#define x4 for yS{range x8
-#define x3 SwapLastTwoInStack();
-#define x2 FPoptimizer_CodeTree::yK2&tree
-#define x1 SetParam(0,iH2 lD 0))yJ p1;p1 tU
-#define x0 TestImmedConstraints(param t42,tree)yI
-#define nZ {tree.FixIncompleteHashes();}
-#define nY {yE3 cInv nW2 x9-1 e21
-#define nX paramholder_index
-#define nW return true;case
-#define nV occurance_counts
-#define nU PositionalParams,0},0,
-#define nT xQ xD1 tA-1);
-#define nS ;synth.yZ2*this)l81;}
-#define nR ,l0 1,
-#define nQ );a-->0;){lM1&powgroup=lT1;if(powgroup
-#define nP ;a<iT;++a)if(ApplyGrammar(tN2,xI2,
-#define nO lK 1},0,0x0},{{
-#define nN ByteCode
-#define nM model_tree
-#define nL return range x8(
-#define nK yG nV1&l02
-#define nJ ConstantFolding_LogicCommon(tree,yB
-#define nI eS1>p xO3 p.
-#define nH nT1 Ref>inline void xN<Ref>::
-#define nG ;tmp2 yC 0 y43 cInv);tmp yY3 l81
-#define nF ):data(new nO2 x8(
-#define nE .lM2
-#define nD FUNCTIONPARSERTYPES::
-#define nC iJ1(),c93(),Hash(),Depth(1),eZ1 0){}
-#define nB SynthesizeByteCode(synth);
-#define nA nO2 x8::nO2(
-#define n9 crc=(key>>10)|(key<<(64-10))eC2((~iC1(crc))*3)^1234567;}};
-#define n8 GetIntegerInfo nW1 0))==IsAlways)lN3
-#define n7 eS1(*const func)(eS1),range x8 model){
-#define n6 e72.xJ1
-#define n5 ;goto do_return;}
-#define n4 while(ApplyGrammar(i01 Grammar&)
-#define n3 DumpParams x8 iZ2 data.param_list,xF3 data xY2,o);
-#define n2 restholder_index
-#define n1 yK2 cE2;cE2 e53 cE2 eT
-#define n0 yL1,0x0},
-#define lZ t51 1},0,
-#define lY ;tree yA n41)nS2
-#define lX l23 y21
-#define lW eG pow x03;pow.iH1 1);pow.Rehash(tT.nC1 0,pow);goto NowWeAreMulGroup;}
-#define lV {cF cPow);y53;tmp yT eS1(
-#define lU :if(ParamComparer x8()(c93[1],c93[0])){std::swap(c93[0],c93[1]);Opcode=
-#define lT <typename eS1>
-#define lS ,eS1(1)/eS1(
-#define lR SetParam(0,e72 lD 0)xK1 1,CodeTreeImmed(
-#define lQ restholder_matches
-#define lP SelectedParams,0},0,0x0},{{
-#define lO n41;n41 xQ2 n41 yA e72);n41 eT xW lD
-#define lN *const func)(eS1),range x8 model=range x8());
-#define lM yV1 yK2::yL2(
-#define lL {tree.ReplaceWithImmed(
-#define lK cMul,AnyParams,
-#define lJ cMul,SelectedParams,0},0,
-#define lI cPow,l0 2
-#define lH iM tmp)cM3
-#define lG :cC3=comp.AddRelationship(atree lD 0),atree lD 1),yB
-#define lF typename eS1>i12()i01 eS1&a,e62 b){return a
-#define lE t51 0 l1
-#define lD .GetParam(
-#define lC break;case
-#define lB {range x8 m=y6 0));
-#define lA xB1 yK2::
-#define l9 ?0:1))yJ n41;n41 xQ2 n41 tI1 tree.iE1));n41 y3
-#define l8 lK 0 l1
-#define l7 ,PositionalParams,0 l1
-#define l6 nU iR
-#define l5 cAdd,lP 2,
-#define l4 RangeComparisonData
-#define l3 PositionalParams,0}},{ProduceNewTree,
-#define l2 lJ 0x0},{{
-#define l1 }},{ReplaceParams,
-#define l0 nU 0x0},{{
-#ifdef _MSC_VER
-typedef
-i02
-int
-iD1;
-#else
-#include <stdint.h>
-typedef
-uint_least32_t
-iD1;
-#endif
-iO2
-crc32{enum{startvalue=0xFFFFFFFFUL,poly=0xEDB88320UL}
-;n73<iD1
-crc>e92
-b8{enum{b1=(crc
-l03
-crc
-nP2
-crc>>1),b2=(b1
-l03
-b1
-nP2
-b1>>1),b3=(b2
-l03
-b2
-nP2
-b2>>1),b4=(b3
-l03
-b3
-nP2
-b3>>1),b5=(b4
-l03
-b4
-nP2
-b4>>1),b6=(b5
-l03
-b5
-nP2
-b5>>1),b7=(b6
-l03
-b6
-nP2
-b6>>1),res=(b7
-l03
-b7
-nP2
-b7>>1)}
-;}
-;inline
-iD1
-update(iD1
-crc,i02
-b){
-#define B4(n) b8<n>iL2 n+1>iL2 n+2>iL2 n+3>::res
-#define R(n) B4(n),B4(n+4),B4(n+8),B4(n+12)
-static
-const
-iD1
-table[256]={R(0x00),R(0x10),R(0x20),R(0x30),R(0x40),R(0x50),R(0x60),R(0x70),R(0x80),R(0x90),R(0xA0),R(0xB0),R(0xC0),R(0xD0),R(0xE0),R(0xF0)}
-;
-#undef R
-#undef B4
-return((crc>>8))^table[(crc^b)&0xFF];i6
-iD1
-calc_upd(iD1
-c,const
-i02
-char*buf,size_t
-size){iD1
-value=c;for(size_t
-p=0;p<size;++p)value=update(value,buf[p])l81
-value;i6
-iD1
-calc
-i01
-i02
-char*buf,size_t
-size){return
-calc_upd(startvalue,buf,size);}
-}
-#ifndef FPOptimizerAutoPtrHH
-#define FPOptimizerAutoPtrHH
-nT1
-Ref>class
-xN{e13
-xN():p(0){}
-xN(Ref*b):p(b){n93}
-xN
-i01
-xN&b):p(b.p){n93
-i6
-Ref&e31*(n61*p;i6
-Ref*e31->(n61
-p;}
-xN&e31=(Ref*b){Set(b)l81*this;}
-xN&e31=i01
-xN&b){Set(b.p)l81*this;}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-xN(xN&&b):p(b.p){b.p=0;}
-xN&e31=(xN&&b){if(p!=b.p){cF2;p=b.p;b.p=0;}
-return*this;}
-#endif
-~xN(){cF2
-iS2
-UnsafeSetP(Ref*newp){p=newp
-iS2
-swap(xN<Ref>&b){Ref*tmp=p;p=b.p;b.p=tmp;}
-private:inline
-static
-void
-Have(Ref*p2);inline
-void
-cF2;inline
-void
-n93
-inline
-void
-Set(Ref*p2);private:Ref*p;}
-;nH
-cF2{if(!p
-nZ2;p->nA3-=1;if(!p->nA3)delete
-p;}
-nH
-Have(Ref*p2){if(p2)++(p2->nA3);}
-nH
-Birth(){Have(p);}
-nH
-Set(Ref*p2){Have(p2);cF2;p=p2;}
-#endif
-#include <utility>
-e92
-Compare2ndRev{nT1
-T>inline
-i12()i01
-T&nB3
-T&b
-n61
-a
-eE3>b
-eE3;}
-}
-;e92
-Compare1st{nT1
-cG
-const
-nU1
-nB3
-nU1
-b
-n61
-a.first<b.first;}
-nT1
-cG
-const
-nU1
-a,T1
-b
-n61
-a.first<b;}
-nT1
-cG
-T1
-nB3
-nU1
-b
-n61
-a<b.first;}
-}
-;
-#ifndef FPoptimizerHashHH
-#define FPoptimizerHashHH
-#ifdef _MSC_VER
-typedef
-i02
-long
-long
-iC1;
-#define FPHASH_CONST(x) x##ULL
-#else
-#include <stdint.h>
-typedef
-uint_fast64_t
-iC1;
-#define FPHASH_CONST(x) x##ULL
-#endif
-iO2
-FUNCTIONPARSERTYPES{e92
-fphash_t{iC1
-hash1,hash2;fphash_t():hash1(0),hash2(0){}
-fphash_t
-i01
-iC1&nB3
-iC1&b):hash1(a),hash2(b){}
-i12==i01
-fphash_t&n51==iM2&&hash2==iN2
-i12!=i01
-fphash_t&n51!=iM2||hash2!=iN2
-i12<i01
-fphash_t&n51!=iM2?hash1<iM2:hash2<iN2}
-;}
-#endif
-#ifndef FPOptimizer_CodeTreeHH
-#define FPOptimizer_CodeTreeHH
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <vector>
-#include <utility>
-iO2
-l41{e92
-Grammar;}
-t5{iP2
-ByteCodeSynth;}
-iO2
-FPoptimizer_CodeTree{iP2
-yL2;yT1
-nO2;iP2
-yL2{typedef
-xN<nO2
-x8>DataP;DataP
-data;e13
-yL2();~yL2();e92
-OpcodeTag{}
-;e7
-nR2
-o,OpcodeTag);e92
-FuncOpcodeTag{}
-;e7
-nR2
-o,i02
-f,FuncOpcodeTag);e92
-nC3{}
-;e7
-e62
-v,nC3);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-e7
-eS1&&v,nC3);
-#endif
-e92
-VarTag{}
-;e7
-i02
-varno,VarTag);e92
-CloneTag{}
-;e7
-iQ2
-b,CloneTag);void
-GenerateFrom
-i01
-n81
-const
-nQ2
-const
-typename
-FunctionParserBase
-x8::Data&data,bool
-keep_powi=false);void
-GenerateFrom
-i01
-n81
-const
-nQ2
-const
-typename
-FunctionParserBase
-x8::Data&data,const
-i22
-nK2,bool
-keep_powi=false);void
-SynthesizeByteCode(n81
-nQ2
-size_t&stacktop_max);void
-SynthesizeByteCode(yW2&synth,bool
-MustPopTemps=true)const;size_t
-SynthCommonSubExpressions(yV2
-lP1
-const;void
-SetParams
-i01
-i22
-nD3
-SetParamsMove(i22
-eU1
-yL2
-GetUniqueRef();
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-void
-SetParams(yG<yL2>&&eU1
-#endif
-void
-SetParam(size_t
-which,iQ2
-b);void
-nC1
-size_t
-which,nI2
-b);void
-AddParam
-i01
-nI2
-param);void
-eG
-nI2
-param);void
-AddParams
-i01
-i22
-nD3
-AddParamsMove(i22
-nD3
-AddParamsMove(i22
-l02,size_t
-l12);void
-iH1
-size_t
-index);void
-DelParams();void
-Become
-i01
-nI2
-b);inline
-size_t
-GetParamCount(n61
-iE1)yA3;i6
-nI2
-GetParam(xL3){return
-iE1)[n];i6
-iQ2
-GetParam(xL3
-n61
-iE1)[n];i6
-void
-lI2
-nR2
-o)cX3
-Opcode=o;i6
-nR2
-lM2
-c6
-Opcode;i6
-nD
-fphash_t
-GetHash()c6
-Hash;i6
-const
-i22
-iE1
-n61
-xY;i6
-i22
-iE1){return
-xY;i6
-size_t
-xT2
-c6
-Depth;i6
-e62
-xJ1
-c6
-Value;i6
-i02
-GetVar()c6
-iI1
-i6
-i02
-GetFuncNo()c6
-iI1
-i6
-bool
-IsDefined(n61
-lM2!=nD
-cNop;i6
-bool
-IsImmed(n61
-lM2==nD
-cImmed;i6
-bool
-IsVar(n61
-lM2==nD
-iE2;i6
-i02
-GetRefCount()c6
-nA3
-iS2
-ReplaceWithImmed
-i01
-eS1&i);void
-Rehash(bool
-constantfolding=true);void
-Sort();inline
-void
-Mark_Incompletely_Hashed()cX3
-Depth=0;i6
-bool
-Is_Incompletely_Hashed()c6
-Depth==0;i6
-const
-tK
-GetOptimizedUsing()c6
-iK1;i6
-void
-SetOptimizedUsing
-i01
-tK
-g)cX3
-iK1=g;}
-bool
-RecreateInversionsAndNegations(bool
-prefer_base2=false);void
-FixIncompleteHashes();void
-swap(nI2
-b){data.swap(b.data);}
-bool
-IsIdenticalTo
-i01
-nI2
-b)const;void
-iY}
-;yT1
-nO2{int
-nA3;nR2
-Opcode;eS1
-Value;i02
-iI1
-yG
-nV1
-c93;nD
-fphash_t
-Hash;size_t
-Depth;const
-tK
-iK1;nO2();nO2
-i01
-nO2&b);i1
-nR2
-o);i1
-nR2
-o,i02
-f);i1
-e62
-i);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-i1
-eS1&&i);nO2(nO2&&b);
-#endif
-bool
-IsIdenticalTo
-i01
-nO2&b)const;void
-Sort();void
-Recalculate_Hash_NoRecursion();private:void
-e31=i01
-nO2&b);}
-;yU1
-CodeTreeImmed
-i01
-eS1&i)eM
-i
-yO
-nC3());}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-yU1
-CodeTreeImmed(eS1&&i)eM
-t72
-i)yO
-nC3());}
-#endif
-yU1
-CodeTreeOp(nR2
-opcode)eM
-opcode
-yO
-OpcodeTag());}
-yU1
-CodeTreeFuncOp(nR2
-opcode,i02
-f)eM
-opcode,f
-yO
-FuncOpcodeTag());}
-yU1
-CodeTreeVar
-iL1
-varno)eM
-varno
-yO
-VarTag());}
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
-xB1
-DumpHashes(xP);xB1
-xE3(xP);xB1
-DumpTreeWithIndent(xP,const
-std::string&indent="\\"
-);
-#endif
-}
-#endif
-#endif
-#ifndef FPOPT_NAN_CONST
-#include <iostream>
-#define FPOPT_NAN_CONST (-1712345.25)
-iO2
-FPoptimizer_CodeTree{iP2
-yL2;}
-iO2
-l41{enum
-ImmedConstraint_Value{ValueMask=0x07,Value_AnyNum=0x0,n12=0x1,Value_OddInt=0x2,t01=0x3,Value_NonInteger=0x4,eE1=0x5
-n23
-ImmedConstraint_Sign{SignMask=0x18,Sign_AnySign=0x00,nJ1=0x08,n02=0x10,Sign_NoIdea=0x18
-n23
-ImmedConstraint_Oneness{OnenessMask=0x60,Oneness_Any=0x00,Oneness_One=0x20,Oneness_NotOne=0x40
-n23
-ImmedConstraint_Constness{ConstnessMask=0x180,Constness_Any=0x00,yL1=0x80,Constness_NotConst=0x100
-n23
-Modulo_Mode{Modulo_None=0,Modulo_Radians=1
-n23
-Situation_Flags{LogicalContextOnly=0x01,NotForIntegers=0x02,OnlyForIntegers=0x04
-n23
-lU2{NumConstant,ParamHolder,SubFunction
-n23
-ParamMatchingType{PositionalParams,SelectedParams,AnyParams,GroupFunction
-n23
-RuleType{ProduceNewTree,ReplaceParams}
-;
-#ifdef __GNUC__
-# define PACKED_GRAMMAR_ATTRIBUTE __attribute__((packed))
-#else
-# define PACKED_GRAMMAR_ATTRIBUTE
-#endif
-typedef
-std::pair<lU2,const
-void*>cG2;yV1
-cG2
-e01
-iL1
-paramlist,lC1);xG1
-ParamSpec_Compare
-i01
-void*nB3
-void*b,lU2
-type);i02
-ParamSpec_GetDepCode
-i01
-cG2&b);e92
-xH{lC1:8;i02
-constraints:9;i02
-depcode:15;yY
-yT1
-ParamSpec_NumConstant{eS1
-xZ3;i02
-modulo;yY
-e92
-iW{i02
-param_count:2;i02
-param_list:30;nR2
-subfunc_opcode:8;ParamMatchingType
-match_type:3;i02
-n2:5;yY
-e92
-xI{iW
-data;i02
-constraints:9;i02
-depcode:7;yY
-e92
-Rule{RuleType
-ruletype:2;i02
-situation_flags:3;i02
-repl_param_count:2+11;i02
-repl_param_list:30;iW
-match_tree;yY
-e92
-Grammar{i02
-rule_count;i02
-char
-rule_list[999
-eI
-extern
-const
-Rule
-grammar_rules[];}
-xB1
-DumpParam
-i01
-cG2&p,std::ostream&o=std::cout);xB1
-DumpParams
-iL1
-paramlist,i02
-count,std::ostream&o=std::cout);}
-#endif
-#ifndef M_PI
-#define M_PI 3.1415926535897932384626433832795
-#endif
-#define CONSTANT_POS_INF HUGE_VAL
-#define CONSTANT_NEG_INF (-HUGE_VAL)
-iO2
-FUNCTIONPARSERTYPES{yV1
-inline
-eS1
-fp_const_pihalf(){return
-fp_const_pi
-x8()*yF3;}
-yV1
-inline
-eS1
-fp_const_twopi(){eS1
-cY3
-fp_const_pi
-x8());e03
-fp_const_twoe(){eS1
-cY3
-fp_const_e
-x8());e03
-fp_const_twoeinv(){eS1
-cY3
-fp_const_einv
-x8());e03
-fp_const_negativezero(){
-#ifdef FP_EPSILON
-return-fp_epsilon
-x8();
-#else
-return
-eS1(-1e-14);
-#endif
-}
-}
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <vector>
-#include <utility>
-#include <iostream>
-iO2
-FPoptimizer_Optimize{using
-iO2
-l41;using
-iO2
-FPoptimizer_CodeTree;xQ
-iP2
-MatchInfo{e13
-yG<std::pair<bool,yG
-nV1> >lQ;yG
-nV1
-yH;yG<i02>iB;e13
-MatchInfo():lQ(),yH(),iB(){}
-e13
-bool
-SaveOrTestRestHolder
-iL1
-n2,lL1&tM1){cL1{lQ
-nE3
-n2+1);lQ
-tL=tM1
-nS2
-if(lQ[n2
-eC3==false){lQ
-tL=tM1
-nS2
-lL1&found=lQ[n2
-eD3;if(tM1
-yA3!=found
-yA3
-yI
-for
-xK2
-0;a<tM1
-eW2
-a)if(!tM1[a]iA
-found[a])yI
-return
-true
-iS2
-SaveRestHolder
-iL1
-n2,yG
-nV1&tM1){cL1
-lQ
-nE3
-n2+1);lQ
-tL.swap(tM1);}
-bool
-SaveOrTestParamHolder
-iL1
-nX,lM1&nG3){if(yH
-yA3<=nX){yH.nH3
-nX+1);yH
-nE3
-nX);yH
-yL
-nG3)nS2
-if(!yH[nX].iA1{yH[nX]=nG3
-nS2
-return
-nG3
-iA
-yH[nX]iR2
-SaveMatchedParamIndex(lC1){iB
-yL
-index);}
-lM1&GetParamHolderValueIfFound
-iL1
-nX)const{static
-lM1
-dummytree;if(yH
-yA3<=nX
-nZ2
-dummytree
-l81
-yH[nX];}
-lM1&GetParamHolderValue
-iL1
-nX
-n61
-yH[nX];}
-bool
-HasRestHolder
-iL1
-n2
-n61
-lQ
-yA3>n2&&lQ[n2
-eC3==true;}
-lL1&GetRestHolderValues
-iL1
-n2)const{static
-lL1
-empty_result;cL1
-return
-empty_result
-l81
-lQ[n2
-eD3;}
-const
-yG<i02>&GetMatchedParamIndexes(n61
-iB
-iS2
-swap(t9
-b){lQ.swap(b.lQ);yH.swap(b.yH);iB.swap(b.iB);}
-t9
-e31=i01
-t9
-b){lQ=b.lQ;yH=b.yH;iB=b.iB
-l81*this;}
-}
-;class
-e8;typedef
-xN<e8>e1;class
-e8{e13
-int
-nA3;e13
-e8():nA3(0){}
-virtual~e8(){}
-}
-;e92
-lZ1{bool
-found;e1
-specs;lZ1(bool
-f):found(f),specs(){}
-lZ1(bool
-f
-eA2
-s):found(f),specs(s){}
-}
-;xB1
-SynthesizeRule
-eX3
-yK2&tree,t9
-info);yV1
-lZ1
-TestParam
-i01
-cG2&xZ2
-lM1&tree
-eA2
-start_at,t9
-info);yV1
-lZ1
-TestParams(t0&nM,lM1&tree
-eA2
-start_at,t9
-info,bool
-tA1;xG1
-ApplyGrammar
-i01
-Grammar&tN2,x2,bool
-from_logical_context=false);xB1
-ApplyGrammars(x2);xG1
-IsLogisticallyPlausibleParamsMatch(t0&cB2,const
-eR;}
-iO2
-l41{xB1
-DumpMatch
-eX3
-const
-x2,const
-FPoptimizer_Optimize::t9
-info,bool
-DidMatch,std::ostream&o=std::cout);xB1
-DumpMatch
-eX3
-const
-x2,const
-FPoptimizer_Optimize::t9
-info,const
-char*eY3,std::ostream&o=std::cout);}
-#endif
-#include <string>
-eG2
-l41::lU2
-yK1=false);eG2
-nR2
-yK1=false);
-#include <string>
-#include <sstream>
-#include <assert.h>
-#include <iostream>
-using
-iO2
-l41;xQ
-eG2
-l41::lU2
-yK1){
-#if 1
-const
-char*p=0;switch(opcode
-iY2
-NumConstant:p="NumConstant"
-;lC
-ParamHolder:p="ParamHolder"
-;lC
-SubFunction:p="SubFunction"
-;nM3
-std::ostringstream
-tmp;assert(p);tmp<<p;if(pad)while(tmp.str()yA3<12)tmp<<' 'l81
-tmp.str();
-#else
-std::ostringstream
-tmp;tmp<<opcode;if(pad)while(tmp.str()yA3<5)tmp<<' 'l81
-tmp.str();
-#endif
-}
-eG2
-nR2
-yK1){
-#if 1
-const
-char*p=0;switch(opcode
-iY2
-cAbs:p="cAbs"
-;lC
-cAcos:p="cAcos"
-;lC
-cAcosh:p="cAcosh"
-;lC
-cAsin:p="cAsin"
-;lC
-cAsinh:p="cAsinh"
-;lC
-cAtan:p="cAtan"
-;lC
-cAtan2:p="cAtan2"
-;lC
-cAtanh:p="cAtanh"
-;lC
-cCbrt:p="cCbrt"
-;lC
-cCeil:p="cCeil"
-;lC
-cCos:p="cCos"
-;lC
-cCosh:p="cCosh"
-;lC
-cCot:p="cCot"
-;lC
-cCsc:p="cCsc"
-;lC
-cEval:p="cEval"
-;lC
-cExp:p="cExp"
-;lC
-cExp2:p="cExp2"
-;lC
-cFloor:p="cFloor"
-;lC
-cHypot:p="cHypot"
-;lC
-cIf:p="cIf"
-;lC
-cInt:p="cInt"
-;lC
-cLog:p="cLog"
-;lC
-cLog2:p="cLog2"
-;lC
-cLog10:p="cLog10"
-;lC
-cMax:p="cMax"
-;lC
-cMin:p="cMin"
-;lC
-cPow:p="cPow"
-;lC
-cSec:p="cSec"
-;lC
-cSin:p="cSin"
-;lC
-cSinh:p="cSinh"
-;lC
-cSqrt:p="cSqrt"
-;lC
-cTan:p="cTan"
-;lC
-cTanh:p="cTanh"
-;lC
-cTrunc:p="cTrunc"
-;lC
-cImmed:p="cImmed"
-;lC
-cJump:p="cJump"
-;lC
-cNeg:p="cNeg"
-;lC
-cAdd:p="cAdd"
-;lC
-cSub:p="cSub"
-;lC
-cMul:p="cMul"
-;lC
-cDiv:p="cDiv"
-;lC
-cMod:p="cMod"
-;lC
-cEqual:p="cEqual"
-;lC
-t71:p="cNEqual"
-;lC
-cLess:p="cLess"
-;lC
-cLessOrEq:p="cLessOrEq"
-;lC
-cGreater:p="cGreater"
-;lC
-cGreaterOrEq:p="cGreaterOrEq"
-;lC
-cNot:p="cNot"
-;lC
-cAnd:p="cAnd"
-;lC
-cOr:p="cOr"
-;lC
-cDeg:p="cDeg"
-;lC
-cRad:p="cRad"
-;lC
-cFCall:p="cFCall"
-;lC
-cPCall:p="cPCall"
-;break;
-#ifdef FP_SUPPORT_OPTIMIZER
-case
-cFetch:p="cFetch"
-;lC
-cPopNMov:p="cPopNMov"
-;lC
-cLog2by:p="cLog2by"
-;lC
-cNop:p="cNop"
-;break;
-#endif
-case
-cSinCos:p="cSinCos"
-;lC
-yR3:p="cAbsNot"
-;lC
-cAbsNotNot:p="cAbsNotNot"
-;lC
-cAbsAnd:p="cAbsAnd"
-;lC
-cAbsOr:p="cAbsOr"
-;lC
-i03:p="cAbsIf"
-;lC
-cDup:p="cDup"
-;lC
-cInv:p="cInv"
-;lC
-cSqr:p="cSqr"
-;lC
-cRDiv:p="cRDiv"
-;lC
-cRSub:p="cRSub"
-;lC
-cNotNot:p="cNotNot"
-;lC
-cRSqrt:p="cRSqrt"
-;lC
-iE2:p="VarBegin"
-;nM3
-std::ostringstream
-tmp;assert(p);tmp<<p;if(pad)while(tmp.str()yA3<12)tmp<<' 'l81
-tmp.str();
-#else
-std::ostringstream
-tmp;tmp<<opcode;if(pad)while(tmp.str()yA3<5)tmp<<' 'l81
-tmp.str();
-#endif
-}
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <vector>
-#include <utility>
-#ifndef FP_GENERATING_POWI_TABLE
-enum{MAX_POWI_BYTECODE_LENGTH=20}
-;
-#else
-enum{MAX_POWI_BYTECODE_LENGTH=999}
-;
-#endif
-enum{MAX_MULI_BYTECODE_LENGTH=3}
-;t5{iP2
-ByteCodeSynth{e13
-ByteCodeSynth():nN(),Immed(),eP(),tA(0),StackMax(0){nN.nH3
-64);Immed.nH3
-8);eP.nH3
-16
-iR2
-Pull(yG<i02>&bc,yG
-x8&imm,size_t&StackTop_max){for
-iL1
-a=0;a<nN
-eW2
-a){nN[a]&=~yM;}
-nN.swap(bc);Immed.swap(imm);StackTop_max=StackMax;}
-size_t
-GetByteCodeSize(n61
-nN
-yA3;}
-size_t
-GetStackTop(n61
-tA
-iS2
-PushVar
-iL1
-varno){e23
-varno);nV2}
-void
-PushImmed(eS1
-immed){xQ
-e23
-cImmed);Immed
-yL
-immed);nV2}
-void
-StackTopIs
-cA3,int
-offset=0){if((int)tA>offset){eP[tA
-lN2
-first=true;eP[tA
-lN2
-second=tree;}
-}
-bool
-IsStackTop
-cA3,int
-offset=0
-n61(int)tA>offset&&eP[tA
-lN2
-first&&eP[tA
-lN2
-second
-iA
-tree);i6
-void
-EatNParams
-iL1
-cH2){tA-=cH2
-iS2
-ProducedNParams
-iL1
-e41){xD1
-tA+e41
-iR2
-AddOperation
-iL1
-opcode,i02
-cH2,i02
-e41=1){EatNParams(cH2);xQ
-AddFunctionOpcode(opcode);ProducedNParams(e41
-iR2
-DoPopNMov(size_t
-cI2,size_t
-srcpos){xQ
-e23
-cPopNMov);e23
-yM|iL1)cI2);e23
-yM|iL1)srcpos);xD1
-srcpos+1);eP[cI2]=eP[srcpos];xD1
-cI2+1
-iR2
-DoDup(size_t
-nI3){xQ
-if(nI3==tA-1){e23
-cDup);}
-else{e23
-cFetch);e23
-yM|iL1)nI3);}
-nV2
-eP[tA-1]=eP[nI3];}
-size_t
-e33
-cA3)const{for
-xK2
-tA;a-->0;)if(eP[a
-eC3&&eP[a
-eD3
-iA
-tree)nZ2
-a
-l81
-eK2;}
-bool
-Find
-cA3
-n61
-e33
-nO3
-eK2;}
-bool
-FindAndDup
-cA3){size_t
-pos=e33(tree);if(pos!=eK2){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<tZ3"duplicate at ["
-<<pos<<"]: "
-;xE3(tree)lN1" -- issuing cDup or cFetch\n"
-;
-#endif
-DoDup(pos)nS2
-nX2
-e92
-IfData{size_t
-ofs;}
-;void
-SynthIfStep1(IfData&yJ2,nR2
-op){nT
-yJ2.ofs=nN
-yA3;e23
-op);e23
-yM);e23
-yM
-iR2
-SynthIfStep2(IfData&yJ2){nT
-nN[yJ2.ofs+1]eJ1+2);nN[yJ2.ofs
-iC
-yJ2.ofs=nN
-yA3;e23
-cJump);e23
-yM);e23
-yM
-iR2
-SynthIfStep3(IfData&yJ2){nT
-nN.back()|=yM;nN[yJ2.ofs+1]eJ1-1);nN[yJ2.ofs
-iC
-nV2
-for
-xK2
-0;a<yJ2.ofs;++a){if(nN[a]==cJump&&nN[a+1]==(yM|(yJ2.ofs-1))){nN[a+1]eJ1-1);nN[a
-iC
-yN3(nN[a]iY2
-i03:case
-cIf:case
-cJump:case
-cPopNMov:a+=2;lC
-cFCall:case
-cPCall:case
-cFetch:a+=1;break;default:nM3}
-}
-protected:void
-xD1
-size_t
-value){tA=value;if(tA
-eL2{StackMax=tA;yS1);}
-}
-void
-l51
-eK1;void
-iK
-eK1;void
-AddFunctionOpcode(eK1;private:yG<i02>nN;yG
-x8
-Immed;yG<std::pair<bool,FPoptimizer_CodeTree::yK2> >eP;size_t
-tA;size_t
-StackMax;}
-;yT1
-SequenceOpCode;yT1
-eX1{static
-cN
-AddSequence;static
-cN
-MulSequence;}
-;xB1
-x31
-long
-count,cN&eQ,lP1;}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-t5{yT1
-SequenceOpCode{eS1
-basevalue;i02
-op_flip;i02
-op_normal,op_normal_flip;i02
-op_inverse,op_inverse_flip;}
-;yV1
-cN
-eX1
-x8::AddSequence={eS1(0),cNeg,cAdd,cAdd,cSub,cRSub}
-;yV1
-cN
-eX1
-x8::MulSequence={eS1(1),cInv,cMul,cMul,cDiv,cRDiv}
-;yV1
-n71
-l51
-eK1{int
-mStackPtr=0;
-#define incStackPtr() do{if(tA+2 eL2 yS1=tA+2);}while(0)
-#define findName(a,b,c) "var"
-#define TryCompilePowi(o) false
-#define mData this
-#define mByteCode nN
-#define mImmed Immed
-# define FP_FLOAT_VERSION 1
-# include "fp_opcode_add.inc"
-# undef FP_FLOAT_VERSION
-#undef mImmed
-#undef mByteCode
-#undef mData
-#undef TryCompilePowi
-#undef incStackPtr
-}
-yV1
-n71
-iK
-eK1{int
-mStackPtr=0;
-#define incStackPtr() do{if(tA+2 eL2 yS1=tA+2);}while(0)
-#define findName(a,b,c) "var"
-#define TryCompilePowi(o) false
-#define mData this
-#define mByteCode nN
-#define mImmed Immed
-# define FP_FLOAT_VERSION 0
-# include "fp_opcode_add.inc"
-# undef FP_FLOAT_VERSION
-#undef mImmed
-#undef mByteCode
-#undef mData
-#undef TryCompilePowi
-#undef incStackPtr
-}
-yV1
-n71
-AddFunctionOpcode(eK1{if(IsIntType
-x8::result)iK
-opcode);else
-l51
-opcode);}
-}
-using
-t5;
-#define POWI_TABLE_SIZE 256
-#define POWI_WINDOW_SIZE 3
-t5{
-#ifndef FP_GENERATING_POWI_TABLE
-extern
-const
-i02
-char
-powi_table[POWI_TABLE_SIZE];const
-#endif
-i02
-char
-powi_table[POWI_TABLE_SIZE]={0,1,1,1,2,1
-eM2
-1,4,1,2,e43
-eM2
-1,8,cB3
-e73
-15,1,16,1
-eM2
-e43,2,1,4,cB3
-1,16,1,25,e73
-27,5,8,3,2,1,30,1,31,3,32,1
-eM2
-1,8,1,2,e73
-39,1,16,137,2,1,4,cB3
-e43,45,135,4,31,2,5,32,1,2,131,50,1,51,1,8,3,2,1,54,1,55,3,16,1,57,133,4,137,2,135,60,1,61,3,62,133,63,1,tN1
-131,tN1
-139,iM1
-e9
-30,1,130,137,2,31,iM1
-e9
-e9
-130,cB3
-1,e9
-e9
-2,1,130,133,tN1
-61,130,133,62,139,130,137,e9
-iM1
-e9
-e9
-tN1
-131,e9
-e9
-130,131,2,133,iM1
-130,141,e9
-130,cB3
-1,e9
-5,135,e9
-iM1
-e9
-iM1
-130,133,130,141,130,131,e9
-e9
-2,131}
-;}
-static
-lX3
-cB=256;
-#define FPO(x)
-iO2{class
-PowiCache{private:int
-i7[cB];int
-tO1[cB];e13
-PowiCache():i7(),tO1(){i7[1]=1;}
-bool
-Plan_Add(yW1,int
-count){c51>=cB
-yI
-tO1[eP2+=count
-l81
-i7[eP2!=0
-iS2
-iU2
-yW1){c51<cB)i7[eP2=1
-iS2
-Start(size_t
-value1_pos){for(int
-n=2;n<cB;++n)i7[n]=-1;Remember(1,value1_pos);DumpContents();}
-int
-Find(yW1)const{c51<cB){if(i7[eP2>=0){FPO(tK3(tO3,"* I found %ld from cache (%u,%d)\n",value,(unsigned)cache[value],tL3 value]))l81
-i7[eP2;}
-}
-return-1
-iS2
-Remember(yW1,size_t
-tW3){c51>=cB
-nZ2;FPO(tK3(tO3,"* Remembering that %ld can be found at %u (%d uses remain)\n",value,(unsigned)tW3,tL3 value]));i7[eP2=(int)tW3
-iS2
-DumpContents()const{FPO(for(int a=1;a<POWI_CACHE_SIZE;++a)if(cache[a]>=0||tL3 a]>0){tK3(tO3,"== cache: sp=%d, val=%d, needs=%d\n",cache[a],a,tL3 a]);})}
-int
-UseGetNeeded(yW1){c51>=0&&value<cB
-nZ2--tO1[eP2
-l81
-0;}
-}
-;yV1
-size_t
-yN
-long
-count
-tR1
-cN&eQ,lP1;xB1
-yX1
-size_t
-apos,long
-aval,size_t
-bpos,long
-bval
-tR1
-i02
-cumulation_opcode,i02
-cimulation_opcode_flip,lP1;void
-l61
-yW1
-tR1
-int
-need_count,int
-iX=0){c51<1
-nZ2;
-#ifdef FP_GENERATING_POWI_TABLE
-if(iX>32)throw
-false;
-#endif
-if(i7.Plan_Add(value,need_count)nZ2;long
-nJ3
-1;c51<POWI_TABLE_SIZE){nJ3
-powi_table[eP2
-iT2&128){half&=127
-iT2&64)nJ3-eQ2
-FPO(tK3(tO3,"value=%ld, half=%ld, otherhalf=%ld\n",value,half,value/half));l61
-half,yM2
-i7.iU2
-half)l81;}
-tP1
-half&64){nJ3-eQ2}
-}
-else
-c51&1)nJ3
-value&((1<<POWI_WINDOW_SIZE)-1);else
-nJ3
-value/2;long
-cQ=value-half
-iT2>cQ||half<0)std::swap(half,cQ);FPO(tK3(tO3,"value=%ld, half=%ld, otherhalf=%ld\n",value,half,otherhalf))iT2==cQ){l61
-half,i7,2,iX+1);}
-else{l61
-half,yM2
-l61
-cQ>0?cQ:-cQ,yM2}
-i7.iU2
-value);}
-yV1
-size_t
-yN
-yW1
-tR1
-cN&eQ,lP1{int
-nK3=i7.Find(value);if(nK3>=0){return
-nK3;}
-long
-nJ3
-1;c51<POWI_TABLE_SIZE){nJ3
-powi_table[eP2
-iT2&128){half&=127
-iT2&64)nJ3-eQ2
-FPO(tK3(tO3,"* I want %ld, my plan is %ld * %ld\n",value,half,value/half));size_t
-x52=yN
-half
-c61
-if(i7
-iN1
-half)>0||x52!=c71){tQ1
-x52)nU2
-half,c71);}
-x31
-value/half
-eR2
-size_t
-tW3=c71
-nU2
-value,tW3);i7.DumpContents()l81
-tW3;}
-tP1
-half&64){nJ3-eQ2}
-}
-else
-c51&1)nJ3
-value&((1<<POWI_WINDOW_SIZE)-1);else
-nJ3
-value/2;long
-cQ=value-half
-iT2>cQ||half<0)std::swap(half,cQ);FPO(tK3(tO3,"* I want %ld, my plan is %ld + %ld\n",value,half,value-half))iT2==cQ){size_t
-x52=yN
-half
-c61
-yX1
-x52,half,x52,half,i7,eQ.op_normal,eQ.op_normal_flip,synth);}
-else{long
-part1=half;long
-part2=cQ>0?cQ:-cQ;size_t
-part1_pos=yN
-part1
-c61
-size_t
-part2_pos=yN
-part2
-c61
-FPO(tK3(tO3,"Subdivide(%ld: %ld, %ld)\n",value,half,otherhalf));yX1
-part1_pos,part1,part2_pos,part2,i7,cQ>0?eQ.op_normal:eQ.op_inverse,cQ>0?eQ.op_normal_flip:eQ.op_inverse_flip,synth);}
-size_t
-tW3=c71
-nU2
-value,tW3);i7.DumpContents()l81
-tW3;}
-xB1
-yX1
-size_t
-apos,long
-aval,size_t
-bpos,long
-bval
-tR1
-i02
-cumulation_opcode,i02
-cumulation_opcode_flip,lP1{int
-a_needed=i7
-iN1
-aval);int
-nL3=i7
-iN1
-bval);bool
-iO1
-i13
-#define DUP_BOTH() do tX3<bpos){size_t tmp=apos;apos=bpos;bpos=tmp;iO1=!iO1;}FPO(tK3(tO3,"-> "tV3 tV3"op\n",(unsigned)apos,(unsigned)bpos));tQ1 apos);tQ1 apos==bpos?c71:bpos);}while(0)
-#define DUP_ONE(p) do{FPO(tK3(tO3,"-> "tV3"op\n",(unsigned)p));tQ1 p);}while(0)
-if(a_needed>0){if(nL3>0){lO2}
-else{if(bpos!=c71)lO2
-else{iP1
-iO1=!iO1;}
-}
-}
-tP1
-nL3>0)tX3!=c71)lO2
-else
-DUP_ONE(bpos);}
-else
-tX3==bpos&&apos==c71)iP1
-tP1
-apos==c71&&bpos==synth.x5
-2){FPO(tK3(tO3,"-> op\n"));iO1=!iO1;}
-tP1
-apos==synth.x5
-2&&bpos==c71)FPO(tK3(tO3,"-> op\n"));tP1
-apos==c71)DUP_ONE(bpos);tP1
-bpos==c71){iP1
-iO1=!iO1;}
-else
-lO2}
-lK1
-iO1?cumulation_opcode_flip:cumulation_opcode,2);}
-xB1
-cA1
-long
-count,cN&eQ,lP1{while
-cR3<256){int
-nJ3
-yV2
-powi_table[count]iT2&128){half&=127;cA1
-half
-eR2
-count/=half;}
-else
-nM3
-if
-cR3==1
-nZ2;if(!cR3&1)){lK1
-cSqr,1);cA1
-count/2
-eR2}
-else{tQ1
-c71);cA1
-count-1
-eR2
-lK1
-cMul,2);}
-}
-}
-t5{xB1
-x31
-long
-count,cN&eQ,lP1{if
-cR3==0)yX2
-eQ.basevalue
-t73
-bool
-eT2
-i13
-if
-cR3<0){eT2=true;count=-count;}
-if(false)cA1
-count
-eR2
-tP1
-count>1){PowiCache
-i7;l61
-count,i7,1);size_t
-xE1
-t13
-GetStackTop();i7.Start(c71);FPO(tK3(tO3,"Calculating result for %ld...\n",count));size_t
-x62=yN
-count
-c61
-size_t
-n_excess
-t13
-x5
-xE1;if(n_excess>0||x62!=xE1-1){synth.DoPopNMov(xE1-1,x62);}
-}
-if(eT2)lK1
-eQ.op_flip,1);}
-}
-}
-#endif
-#ifndef FPOptimizer_RangeEstimationHH
-#define FPOptimizer_RangeEstimationHH
-iO2
-FPoptimizer_CodeTree{enum
-TriTruthValue{IsAlways,yO3,Unknown}
-;yT1
-range{eS1
-min,max;bool
-iV2,has_max;range():min(),max(),iV2(false
-cS3
-false)x43
-eS1
-mi,eS1
-ma):min(mi),max(ma),iV2(true
-cS3
-true)x43
-bool,eS1
-ma):min(),max(ma),iV2(false
-cS3
-true)x43
-eS1
-mi,bool):min(mi),max(),iV2(true
-cS3
-false){}
-void
-set_abs();void
-set_neg();x72
-set_min_max_if(iL
-x72
-set_min_if(iL
-x72
-set_max_if(iL
-void
-set_min(eS1(lN
-void
-set_max(eS1(lN
-void
-y82
-eS1(lN}
-;yV1
-inline
-bool
-IsLogicalTrueValue
-i01
-range
-x8&p
-cD2
-if(p
-y41
-p.min>=0.5
-nZ2
-true;if(!abs&&p
-iW2<=-0.5
-nZ2
-true
-l81
-false;}
-yV1
-inline
-bool
-IsLogicalFalseValue
-i01
-range
-x8&p
-cD2
-if(abs
-nZ2
-p
-iW2<0.5;else
-return
-p
-y41
-p
-i0&&p.min>-0.5
-xQ3<0.5;}
-yV1
-range
-x8
-iM
-const
-eR;xG1
-IsLogicalValue
-i01
-eR;yV1
-TriTruthValue
-GetIntegerInfo
-i01
-eR;y51
-GetEvennessInfo
-i01
-eR{if(!tree
-y21
-nZ2
-Unknown;yF1=yZ3;if(isEvenInteger(value)nZ2
-x82
-isOddInteger(value)nZ2
-l71
-y51
-GetPositivityInfo
-i01
-eR{range
-x8
-p=iM
-tree);if(p
-y41
-p.min
-cH1
-nZ2
-x82
-p
-iW2
-t83
-nZ2
-l71
-y51
-GetLogicalValue(lM1&tree
-cD2
-range
-x8
-p=iM
-tree);if(IsLogicalTrueValue(p,abs)nZ2
-x82
-IsLogicalFalseValue(p,abs)nZ2
-l71}
-#endif
-#ifndef FPOptimizer_ConstantFoldingHH
-#define FPOptimizer_ConstantFoldingHH
-iO2
-FPoptimizer_CodeTree{xB1
-ConstantFolding(eR;}
-#endif
-iO2{xQ
-using
-iO2
-FPoptimizer_CodeTree;e92
-ComparisonSetBase{enum{e93=0x1,Eq_Mask=0x2,Le_Mask=0x3,eA3=0x4,eB3=0x5,Ge_Mask=0x6}
-;static
-int
-Swap_Mask(int
-m){return(m&Eq_Mask)|((m&e93)?eA3:0)|((m&eA3)?e93:0);}
-enum
-yY1{Ok,BecomeZero,BecomeOne,xA2
-n23
-lV2{cond_or,i32,i42,i52}
-;}
-;yT1
-ComparisonSet:public
-ComparisonSetBase{e92
-eU2
-nG1
-a
-yJ
-b;int
-relationship;eU2():a(),b(),relationship(){}
-}
-;yG<eU2>cW;e92
-Item
-nG1
-value;bool
-yN2;Item():value(),yN2(false){}
-}
-;yG<Item>cB1;int
-xF1;ComparisonSet():cW(),cB1(),xF1(0){}
-yY1
-AddItem(lM1&a,bool
-yN2,lV2
-type){for(size_t
-c=0;c<cB1
-eW2
-c)if(cB1[c].value
-iA
-a)){if(yN2!=cB1[c].yN2){iN
-cM1
-case
-i52:cB1.erase(cB1.begin()+c);xF1+=1
-n01
-case
-i32:case
-i42:cN1}
-}
-return
-xA2;}
-Item
-pole;pole.value=a;pole.yN2=yN2;cB1
-yL
-pole)l81
-Ok;}
-yY1
-AddRelationship(yK2
-a,yK2
-b,int
-eY1,lV2
-type){iN
-cT3
-7)cM1
-lC
-i52:cT3
-7){xF1+=1
-n01}
-lC
-i32:case
-i42:cT3
-0)cN1
-nM3
-if(!(a.GetHash()<b.GetHash())){a.swap(b);eY1=Swap_Mask(eY1);}
-for(size_t
-c=0;c<cW
-eW2
-c){if(cW[c].a
-iA
-a)&&cW[c].b
-iA
-b)){iN{int
-nS3=x92|eY1;if(nS3==7)cM1
-x92=nS3;nM3
-case
-i32:case
-i42:{int
-nS3=x92&eY1;if(nS3==0)cN1
-x92=nS3;nM3
-case
-i52:{int
-newrel_or=x92|eY1;int
-xB2=x92&eY1;iQ1
-5&&xB2==0){x92=eB3
-n01}
-iQ1
-7&&xB2==0){xF1+=1;cW.erase(cW.begin()+c)n01}
-iQ1
-7&&xB2==Eq_Mask){x92=Eq_Mask;xF1+=1
-n01}
-y81}
-}
-return
-xA2;}
-}
-eU2
-comp;comp.a=a;comp.b=b;comp.relationship=eY1;cW
-yL
-comp)l81
-Ok;}
-}
-;nT1
-eS1,typename
-CondType>bool
-ConstantFolding_LogicCommon(yK2&tree,CondType
-xA1,bool
-xC2){bool
-should_regenerate
-i13
-ComparisonSet
-x8
-comp
-eV3
-typename
-yB
-yY1
-cC3=yB
-Ok;lM1&atree=xI2;switch(atree
-nE
-iY2
-cEqual
-lG
-Eq_Mask
-eB2
-t71
-lG
-eB3
-eB2
-cLess
-lG
-e93
-eB2
-cLessOrEq
-lG
-Le_Mask
-eB2
-cGreater
-lG
-eA3
-eB2
-cGreaterOrEq
-lG
-Ge_Mask
-eB2
-cNot:cC3
-y11
-lD
-0),true
-eB2
-cNotNot:cC3
-y11
-lD
-0),false,xA1);break;default:if(xC2||IsLogicalValue(atree))cC3
-y11,false,xA1);yN3(cC3){ReplaceTreeWithZero
-xP3
-ReplaceWithImmed(0)l81
-true;ReplaceTreeWithOne
-xP3
-ReplaceWithImmed(1);nW
-yB
-Ok:lC
-yB
-BecomeZero:yP3
-yB
-BecomeOne
-tY
-yB
-xA2:c11
-nM3}
-if(should_regenerate){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Before ConstantFolding_LogicCommon: "
-eS
-#endif
-if(xC2){tree.DelParams();}
-else{for
-xU{lM1&atree=xI2;if(IsLogicalValue(atree))nF1);}
-}
-for
-xK2
-0;a<comp.cB1
-eW2
-a){if(comp.cB1[a].yN2)eV2
-cNot);r
-i4
-r.cO1
-tP1!xC2)eV2
-cNotNot);r
-i4
-r.cO1
-else
-tree
-i4}
-for
-xK2
-0;a<comp.cW
-eW2
-a)eV2
-cNop);switch(comp.cW[a
-tO
-iY2
-yB
-e93:r
-tU
-cLess);lC
-yB
-Eq_Mask:r
-tU
-cEqual);lC
-yB
-eA3:r
-tU
-cGreater);lC
-yB
-Le_Mask:r
-tU
-cLessOrEq);lC
-yB
-eB3:r
-tU
-t71);lC
-yB
-Ge_Mask:r
-tU
-cGreaterOrEq
-nW2
-r
-yA
-comp.cW[a].a);r
-yA
-comp.cW[a].b);r.cO1
-if(comp.xF1!=0)tree
-yT
-eS1(comp.xF1)));
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"After ConstantFolding_LogicCommon: "
-eS
-#endif
-return
-true;}
-nX2
-xG1
-ConstantFolding_AndLogic(tT3(tree.tU3()==cAnd
-tI3()==cAbsAnd)l81
-nJ
-i32,true);}
-xG1
-ConstantFolding_OrLogic(tT3(tree.tU3()==cOr
-tI3()==cAbsOr)l81
-nJ
-cond_or,true);}
-xG1
-ConstantFolding_AddLogicItems(tT3(tree.tU3()==cAdd)l81
-nJ
-i52,false);}
-xG1
-ConstantFolding_MulLogicItems(tT3(tree.tU3()==cMul)l81
-nJ
-i42,false);}
-}
-#include <vector>
-#include <map>
-#include <algorithm>
-iO2{xQ
-using
-iO2
-FPoptimizer_CodeTree;e92
-CollectionSetBase{enum
-xH1{Ok,xA2}
-;}
-;yT1
-CollectionSet:public
-CollectionSetBase{e92
-yZ1
-nG1
-value
-yJ
-xD2;bool
-e2;yZ1():value(),xD2(),e2(false){}
-yZ1(lM1&v,lM1&f):value(v),xD2(f),e2(false){}
-}
-;std::multimap<fphash_t,yZ1>i8;typedef
-typename
-std::multimap<fphash_t,yZ1>::nX3
-xI1;CollectionSet():i8(){}
-xI1
-FindIdenticalValueTo(lM1&value){fphash_t
-hash=value.GetHash();for(xI1
-i=i8.xE2
-hash);i!=i8.cP1
-hash;++i){c51
-iA
-i
-cJ2.value)nZ2
-i;}
-return
-i8.end();}
-bool
-Found
-i01
-xI1&b){return
-b!=i8.end();}
-xH1
-AddCollectionTo(lM1&xD2,const
-xI1&into_which){yZ1&c=into_which
-cJ2;if(c.e2)c.xD2
-eT
-xD2);else
-nG1
-add;add
-tU
-cAdd);add
-yA
-c.xD2);add
-eT
-xD2);c.xD2.swap(add);c.e2=true;}
-return
-xA2;}
-xH1
-iR1
-lM1&value,lM1&xD2){const
-fphash_t
-hash=value.GetHash();xI1
-i=i8.xE2
-hash);for(;i!=i8.cP1
-hash;++i){if(i
-cJ2.value
-iA
-value)nZ2
-AddCollectionTo(xD2,i);}
-i8.nT3,std::make_pair(hash,yZ1(value,xD2)))l81
-Ok;}
-xH1
-iR1
-lM1&a){return
-iR1
-a,nB1
-1)));}
-}
-;yT1
-ConstantExponentCollection{typedef
-yG
-nV1
-nV3;typedef
-std::x51
-xF2;yG<xF2>data;ConstantExponentCollection():data(){}
-void
-MoveToSet_Unique
-i01
-eS1&e51&e61){data
-yL
-std::x51(e51()));data.back()eE3.swap(e61
-iR2
-MoveToSet_NonUnique
-i01
-eS1&e51&e61){typename
-yG<xF2>::nX3
-i=std::xE2
-data.i62
-data.end(),cE2,Compare1st());if(i!=data.cP1
-cE2){i
-cJ2.nT3
-cJ2.end(),e61.i62
-e61.end());}
-else{data.nT3,std::x51(cE2,e61));}
-}
-bool
-Optimize(){bool
-changed
-i13
-std::sort(data.i62
-data.end(),Compare1st());redo:for
-xK2
-0;a<data
-eW2
-a){eS1
-exp_a=data[a
-eC3
-i82
-exp_a,nY3
-y81
-for(iX2
-a+1;b<data
-eW2
-b){eS1
-exp_b=data[b
-eC3;eS1
-xG2=exp_b-exp_a;if(xG2>=fp_abs(exp_a
-n33
-exp_diff_still_probable_integer=xG2*eS1(16);if(eY2
-exp_diff_still_probable_integer)&&!(eY2
-exp_b)&&!eY2
-xG2))){nV3&a_set=iS1;nV3&b_set=data[b
-eD3;
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Before ConstantExponentCollection iteration:\n"
-;eZ2
-cout);
-#endif
-if(isEvenInteger(exp_b)&&!isEvenInteger(xG2+exp_a))nG1
-tmp2;tmp2
-e53
-tmp2
-tI1
-b_set);tmp2
-i72
-tmp;tmp
-tU
-cAbs);tmp
-yY3;tmp
-x02;b_set
-nE3
-1);b_set[0
-t23
-tmp);}
-a_set.insert(a_set.end(),b_set.i62
-b_set.end());nV3
-b_copy=b_set;data.erase(data.begin()+b);MoveToSet_NonUnique(xG2,b_copy);yI1
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"After ConstantExponentCollection iteration:\n"
-;eZ2
-cout);
-#endif
-e5}
-}
-}
-return
-changed;}
-#ifdef DEBUG_SUBSTITUTIONS
-void
-eZ2
-ostream&out){for
-xK2
-0;a<data
-eW2
-a){out.precision(12);out<<data[a
-eC3<<": "
-;eW3
-iS1
-eW2
-b){if(b>0)out<<'*';xE3(iS1[b],out);}
-out<<std::endl;}
-}
-#endif
-}
-;yV1
-static
-yK2
-x61
-yK2&value,bool&xG){switch(value
-nE
-iY2
-cPow:nG1
-cE2=value
-lD
-1);value.y71
-l81
-cE2
-cM3
-cRSqrt:value.y71;xG=true
-l81
-nB1-0.5));case
-cInv:value.y71;xG=true
-l81
-nB1-1));default:nM3
-return
-nB1
-1))eI2
-void
-e71
-e81&mul,lM1&tree,lM1&xD2,bool&c01
-bool&xG){for
-yS
-nG1
-value
-nW1
-a))yJ
-cE2(x61
-value,xG));if(!xD2
-y21||xD2.xJ1!=1.0)nG1
-cQ1;cQ1
-e53
-cQ1
-eT
-cE2);cQ1
-eT
-xD2);cQ1
-x02;cE2.swap(cQ1);}
-#if 0 /* FIXME: This does not work */
-c51
-nE==cMul){if(1){bool
-exponent_is_even=cE2
-y21&&isEvenInteger(cE2.xJ1);eW3
-value.c81{bool
-tmp=false
-yJ
-val(value
-lD
-b))yJ
-exp(x61
-val,tmp));if(exponent_is_even||(exp
-y21&&isEvenInteger(exp.xJ1)))nG1
-cQ1;cQ1
-e53
-cQ1
-eT
-cE2);cQ1
-yA
-exp);cQ1.ConstantFolding();if(!cQ1
-y21||!isEvenInteger(cQ1.xJ1)){goto
-cannot_adopt_mul;}
-}
-}
-}
-e71
-mul,value,cE2,c01
-xG);}
-else
-cannot_adopt_mul:
-#endif
-{if(mul.iR1
-value,cE2)==CollectionSetBase::xA2)c11}
-}
-}
-xG1
-ConstantFolding_MulGrouping(eR{bool
-xG
-i13
-bool
-should_regenerate
-i13
-e81
-mul;e71
-mul,tree,nB1
-1)),c01
-xG);typedef
-std::pair<yK2,yG
-nV1>e91;typedef
-std::multimap<fphash_t,e91>cC1;cC1
-i9;xH2
-e81::xI1
-j=mul.i8.nW3
-j!=mul.i8.end();++j)nG1&value=j
-cJ2.value
-yJ&cE2=j
-cJ2.xD2;if(j
-cJ2.e2)cE2
-x02;const
-fphash_t
-eA1=cE2.GetHash();typename
-cC1::nX3
-i=i9.xE2
-eA1);for(;i!=i9.cP1
-eA1;++i)if(i
-cJ2.first
-iA
-cE2)){if(!cE2
-y21||!cR1.xJ1,nY3
-c11
-i
-cJ2
-eE3
-yL
-value);goto
-skip_b;}
-i9.nT3,std::make_pair(eA1,std::make_pair(cE2,yG
-nV1(size_t(1),value))));skip_b:;}
-#ifdef FP_MUL_COMBINE_EXPONENTS
-ConstantExponentCollection
-x8
-cS1;xH2
-cC1::nX3
-j,i=i9.nW3
-i!=i9.end();i=j){j=i;++j;e91&list=i
-cJ2;if
-eD2
-y21)c21
-list.first.xJ1;if(!(cE2==eS1(0)))cS1.MoveToSet_Unique(cE2,list
-eE3);i9.erase(i);}
-}
-if(cS1.Optimize())c11
-#endif
-if(should_regenerate)nG1
-before=tree;before.iY
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Before ConstantFolding_MulGrouping: "
-;xE3(before)lN1"\n"
-;
-#endif
-tree.DelParams();xH2
-cC1::nX3
-i=i9.nW3
-i!=i9.end();++i){e91&list=i
-cJ2;
-#ifndef FP_MUL_COMBINE_EXPONENTS
-if
-eD2
-y21)c21
-list.first.xJ1;if(cE2==eS1(0))y81
-if(cR1,nY3{tree.AddParamsMove(list
-eE3);y81}
-}
-#endif
-yK2
-mul;mul
-e53
-mul
-tI1
-list
-eE3);mul
-x02;if(xG&&list.first
-tF3
-eD2.xJ1==eS1(1)/eS1(3))nG1
-cbrt;cbrt
-tU
-cCbrt);cbrt
-t02;cbrt.yB3
-cbrt);y81
-cR
-0.5))nG1
-sqrt;sqrt
-tU
-cSqrt);sqrt
-t02;sqrt.yB3
-sqrt);y81
-cR-0.5))nG1
-rsqrt;rsqrt
-tU
-cRSqrt);rsqrt
-t02;rsqrt.yB3
-rsqrt);y81
-cR-1))nG1
-inv;inv
-tU
-cInv);inv
-t02;inv.yB3
-inv);y81}
-}
-yK2
-pow
-yB2
-t02;pow
-yA
-list.first);pow.yB3
-pow);}
-#ifdef FP_MUL_COMBINE_EXPONENTS
-i9.clear()c23
-0;a<i2
-eW2
-a)c21
-i2[a
-eC3;if(cR1,nY3{tree.AddParamsMove(i2[a
-eD3);y81}
-yK2
-mul;mul
-e53
-mul
-tI1
-i2[a
-eD3);mul
-i72
-pow
-yB2
-t02;pow
-yT
-cE2));pow.yB3
-pow);}
-#endif
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"After ConstantFolding_MulGrouping: "
-eS
-#endif
-return!tree
-iA
-before);}
-nX2
-xG1
-ConstantFolding_AddGrouping(eR{bool
-should_regenerate
-i13
-e81
-add
-eV3
-if
-nW1
-a)nE==cMul)y81
-if(add.AddCollection
-nW1
-a))==CollectionSetBase::xA2)c11}
-yG<bool>remaining(iT);size_t
-tB=0
-eV3
-lM1&n83=xI2;if(n83
-nE==cMul){eW3
-xX1
-c81{if(n83
-lD
-b)y21)y81
-typename
-e81::xI1
-c=add.FindIdenticalValueTo(n83
-lD
-b));if(add.Found(c))nG1
-tmp(n83
-yO
-CloneTag());tmp.iH1
-b);tmp
-x02;add.AddCollectionTo(tmp,c);c11
-goto
-done_a;}
-}
-remaining[a]=true;tB+=1;done_a:;}
-}
-if(tB>0){if(tB>1){yG<std::pair<yK2,size_t> >nV;std::multimap<fphash_t,size_t>eB1;bool
-l13
-i13
-t12{eW3
-xI2.c81{lM1&p=xI2
-lD
-b);const
-fphash_t
-p_hash=p.GetHash();for(std::multimap<fphash_t,size_t>::const_iterator
-i=eB1.xE2
-p_hash);i!=eB1.cP1
-p_hash;++i){if(nV[i
-cJ2
-eC3
-iA
-p)){nV[i
-cJ2
-eD3+=1;l13=true;goto
-found_mulgroup_item_dup;}
-}
-nV
-yL
-std::make_pair(p,size_t(1)));eB1.insert(std::make_pair(p_hash,nV
-yA3-1));found_mulgroup_item_dup:;}
-}
-if(l13)nG1
-cK2;{size_t
-max=0;for(size_t
-p=0;p<nV
-eW2
-p)if(nV[p
-eD3<=1)nV[p
-eD3=0;else{nV[p
-eD3*=nV[p
-eC3.xT2;if(nV[p
-eD3>max){cK2=nV[p
-eC3;max=nV[p
-eD3;}
-}
-}
-yK2
-group_add;group_add
-tU
-cAdd);
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Duplicate across some trees: "
-;xE3(cK2)lN1" in "
-eS
-#endif
-t12
-eW3
-xI2.c81
-if(cK2
-iA
-xI2
-lD
-b)))nG1
-tmp
-nW1
-a)yO
-CloneTag());tmp.iH1
-b);tmp
-x02;group_add
-yA
-tmp);remaining[a]i13
-nM3
-group_add
-i72
-group;group
-e53
-group
-yA
-cK2);group
-yA
-group_add);group
-x02;add.iR1
-group);c11}
-}
-t12{if(add.AddCollection
-nW1
-a))==CollectionSetBase::xA2)c11}
-}
-if(should_regenerate){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Before ConstantFolding_AddGrouping: "
-eS
-#endif
-tree.DelParams();xH2
-e81::xI1
-j=add.i8.nW3
-j!=add.i8.end();++j)nG1&value=j
-cJ2.value
-yJ&coeff=j
-cJ2.xD2;if(j
-cJ2.e2)coeff
-x02;if(coeff
-tF3(fp_equal(coeff.xJ1,eS1(0)))y81
-if(fp_equal(coeff.xJ1,nY3{tree
-yA
-value);y81}
-}
-yK2
-mul;mul
-e53
-mul
-yA
-value);mul
-yA
-coeff);mul.Rehash(tT
-t02;}
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"After ConstantFolding_AddGrouping: "
-eS
-#endif
-return
-true;}
-nX2}
-iO2{xQ
-using
-iO2
-FPoptimizer_CodeTree;xG1
-ConstantFolding_IfOperations(tT3(tree.tU3()==cIf
-tI3()==i03);for(;;){l23
-nE==cNot){tH
-cIf
-tT
-lD
-0).xO2
-0)lD
-0)tT
-lD
-1).swap
-nW1
-2));}
-else
-l23
-cG1{tH
-i03
-tT
-lD
-0).xO2
-0)lD
-0)tT
-lD
-1).swap
-nW1
-2));}
-else
-t62
-tX
-0),cV2
-i03))tF1
-tree.xO2
-1));nW
-yO3
-xP3
-xO2
-2));nW
-lX1
-l23
-nE==cIf||e72
-nE==i03)nG1
-cond
-cL2
-0)yJ
-l53;l53
-xP2==cIf?cNotNot:cAbsNotNot);l53
-x63
-x03;ConstantFolding(l53)yJ
-truth_b;truth_b
-xP2==cIf?cNotNot:cAbsNotNot);truth_b
-x63
-x73
-ConstantFolding(truth_b);if(l53
-y21||truth_b
-y21)nG1
-eU;eU
-xP2);eU
-x63
-x03;eU
-yC
-1));eU
-yC
-2));eU
-i72
-eV;eV
-xP2);eV
-x63
-x73
-eV
-yC
-1));eV
-yC
-2));eV
-y3
-cond
-nE
-xK1
-0,cond
-lD
-0)tT.nC1
-1,eU
-tT.nC1
-2,eV)nS2}
-if
-nW1
-1)nE==tree
-lD
-2)nE&&nW1
-1)nE==cIf||tree
-lD
-1)nE==i03))nG1&cM2
-cL2
-1)yJ&leaf2
-cL2
-2);if
-x83
-0).xO
-0))&&x83
-1).xO
-1))||cM2
-lD
-2).xO
-2))))nG1
-eU;eU
-xQ2
-eU
-yC
-0));eU
-eT
-cM2
-x03;eU
-eT
-leaf2
-x03;eU
-i72
-eV;eV
-xQ2
-eV
-yC
-0));eV
-eT
-cM2
-x73
-eV
-eT
-leaf2
-x73
-eV
-y3
-cM2
-nE
-xK1
-0
-eF3
-0)tT.nC1
-1,eU
-tT.nC1
-2,eV)nS2
-if
-x83
-1).xO
-1))&&cM2
-lD
-2).xO
-2)))nG1
-eW;eW
-xQ2
-eW
-yA
-e72);eW
-eT
-cM2
-xY3
-eW
-eT
-leaf2
-xY3
-eW
-y3
-cM2
-nE
-tT.nC1
-0,eW
-xK1
-2
-eF3
-2)xK1
-1,cM2
-x03
-nS2
-if
-x83
-1).xO
-2))&&cM2
-lD
-2).xO
-1)))nG1
-cN2;cN2
-tU
-leaf2
-nE==cIf?cNot:yR3);cN2
-eT
-leaf2
-xY3
-cN2
-i72
-eW;eW
-xQ2
-eW
-yA
-e72);eW
-eT
-cM2
-xY3
-eW
-yA
-cN2);eW
-y3
-cM2
-nE
-tT.nC1
-0,eW
-xK1
-2
-eF3
-2)xK1
-1,cM2
-x03
-nS2}
-yK2&xW
-cL2
-1)yJ&y9
-cL2
-2);if(xW
-iA
-y9)){tree.xO2
-1))nS2
-const
-OPCODE
-op1=xW
-nE;const
-OPCODE
-op2=y9
-nE;if(op1==op2){if(xW.cT1
-1)nG1
-lO
-0))xL2
-0
-y31)lY
-if(xW.cT1
-2&&y9.cT1
-2){if(xW
-lD
-0)iA
-y9
-lD
-0)))nG1
-param0=xW
-lD
-0)yJ
-lO
-1))xL2
-1
-y31
-tT
-yA
-param0)lY
-if(xW
-lD
-1)iA
-y9
-x03)nG1
-param1=xW
-lD
-1)yJ
-lO
-0))xL2
-0
-y31
-tT
-yA
-n41
-tT
-yA
-param1)nS2}
-if(op1==x93
-cMul
-iU1
-cAnd
-iU1
-cOr
-iU1
-cAbsAnd
-iU1
-cAbsOr
-iU1
-cMin
-iU1
-cMax){yG
-nV1
-l63;cC{for(iX2
-y9.cN3
-b-->0;){lW2
-y9
-lD
-b))){if(l63
-cQ3){xW.iY
-y9.iY}
-l63
-yL
-xW
-lD
-a));y9.iH1
-b);xW.iH1
-a
-nW2}
-}
-if(!l63
-cQ3){xW
-x02;y9
-i72
-n41;n41
-xQ2
-n41
-tI1
-tree.iE1));n41
-y3
-op1
-tT
-tI1
-l63)lY}
-}
-if(op1==x93
-cMul||(op1==cAnd
-nY1
-y9))||(op1==cOr
-nY1
-y9))){cC
-lW2
-y9)){xW.iY
-xW
-cP3
-xW
-i72
-cD1=y9;y9=tC
-op1==x93
-cOr)l9
-op1
-tT
-yA
-cD1)lY}
-if((op1==cAnd
-iU1
-cOr)&&op2==cNotNot)nG1&l73=y9
-lD
-0);cC
-lW2
-l73)){xW.iY
-xW
-cP3
-xW
-i72
-cD1=l73;y9=tC
-op1
-xA3
-op1
-tT
-yA
-cD1)lY}
-if(op2==cAdd||op2==cMul||(op2==cAnd
-nY1
-xW))||(op2==cOr
-nY1
-xW))){for
-xK2
-y9.tD
-y9
-lD
-a)iA
-xW)){y9.iY
-y9
-cP3
-y9
-i72
-cE1=xW;xW=tC
-op2==cAdd||op2
-xA3
-op2
-tT
-yA
-cE1)lY}
-if((op2==cAnd||op2==cOr)&&op1==cNotNot)nG1&l83=xW
-lD
-0)c23
-y9.tD
-y9
-lD
-a)iA
-l83)){y9.iY
-y9
-cP3
-y9
-i72
-cE1=l83;xW=tC
-op2
-xA3
-op2
-tT
-yA
-cE1)lY}
-nX2}
-#include <limits>
-iO2{xQ
-using
-iO2
-FPoptimizer_CodeTree;yV1
-int
-maxFPExponent(){return
-std::numeric_limits
-x8::max_exponent;}
-xG1
-x71
-eS1
-xB3
-cE2){if(base<eS1(0
-iF1
-i82
-xB3(0))||fp_equal(xB3(1))yI
-return
-cE2>=eS1(maxFPExponent
-x8())/fp_log2(base);}
-xG1
-ConstantFolding_PowOperations(tT3(tree.tU3()==cPow);y2){eS1
-const_value=eG3
-n6,y4
-tT.ReplaceWithImmed(const_value)l81
-false;}
-if(nE1
-fp_equal(y4,nY3{tree.xO2
-0))nS2
-lX&&fp_equal(n6,nY3
-lL
-1)l81
-false;}
-lX&&tree
-lD
-1)nE==cMul){bool
-xR2
-i13
-eS1
-iV1=n6
-yJ
-n83
-cL2
-1)c23
-xX1
-tD
-n83
-lD
-a)xC3
-imm=n83
-lD
-a).xJ1;{if(x71
-iV1,imm
-n33
-iW1=eG3
-iV1,imm)i82
-iW1,eS1(0)))break;if(!xR2){xR2=true;xX1
-iY}
-iV1=iW1;xX1
-iH1
-a
-nW2}
-if(xR2){xX1
-Rehash();
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Before pow-mul change: "
-eS
-#endif
-e72.Become(cU1
-iV1)tT
-lD
-1).Become(n83);
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"After pow-mul change: "
-eS
-#endif
-}
-}
-if(nE1
-e72
-nE==cMul){eS1
-iX1=y4;eS1
-xS2=1.0;bool
-xR2=false
-yJ&n83
-cL2
-0)c23
-xX1
-tD
-n83
-lD
-a)xC3
-imm=n83
-lD
-a).xJ1;{if(x71
-imm,iX1
-n33
-eD1=eG3
-imm,iX1)i82
-eD1,eS1(0)))break;if(!xR2){xR2=true;xX1
-iY}
-xS2*=eD1;xX1
-iH1
-a
-nW2}
-if(xR2){xX1
-Rehash()yJ
-cD3;cD3
-tU
-cPow);cD3
-tI1
-tree.iE1));cD3.y12);tH
-cMul
-tT
-yA
-cD3
-tT
-eT
-cU1
-xS2))nS2}
-l23
-nE==cPow&&nE1
-e72
-lD
-1)xC3
-a
-cL2
-0)lD
-1).xJ1;eS1
-b=y4;eS1
-c=a*b;if(isEvenInteger(a)&&!isEvenInteger(c))nG1
-l93;l93
-tU
-cAbs);l93
-yC
-0)xY3
-l93.Rehash(tT.nC1
-0,l93);}
-else
-tree.SetParam(0,e72
-lD
-0)xK1
-1,cU1
-c));}
-nX2}
-iO2{xQ
-using
-iO2
-FPoptimizer_CodeTree;e92
-l4{enum
-cO2{MakeFalse=0,MakeTrue=1,t22=2,lC3=3,MakeNotNotP0=4,MakeNotNotP1=5,MakeNotP0=6,MakeNotP1=7,Unchanged=8
-n23
-iY1{Never=0,Eq0=1,Eq1=2,xD3=3,xR3=4}
-;cO2
-if_identical;cO2
-iZ1
-4];e92{cO2
-what:4;iY1
-when:4;}
-tS1,tT1,tU1,tV1;yV1
-cO2
-Analyze(lM1&a,lM1&b)const{if(a
-iA
-b)nZ2
-if_identical;range
-x8
-p0=iM
-a);range
-x8
-p1=iM
-b);if(p0
-i0&&p1.iV2){if(p0.max<p1.min&&iZ1
-0]cJ
-0];if(p0.max<=p1.min&&iZ1
-1]cJ
-1];}
-if(p0
-y41
-p1
-i0){if(p0.min>p1.max&&iZ1
-2]cJ
-2];if(p0.min>=p1.max&&iZ1
-3]cJ
-3];}
-if(IsLogicalValue(a)){if(tS1
-i92
-tS1.when,p1)nZ2
-tS1.what;if(tU1
-i92
-tU1.when,p1)nZ2
-tU1.what;}
-if(IsLogicalValue(b)){if(tT1
-i92
-tT1.when,p0)nZ2
-tT1.what;if(tV1
-i92
-tV1.when,p0)nZ2
-tV1.what;}
-return
-Unchanged
-eI2
-bool
-TestCase(iY1
-when,const
-range
-x8&p){if(!p.iV2||!p
-i0
-yI
-switch(when
-iY2
-Eq0:return
-p.min==0.0
-xQ3==p.min;case
-Eq1:return
-p.min==1.0
-xQ3==p.max;case
-xD3:return
-p.min>0
-xQ3<=1;case
-xR3:return
-p.min>=0
-xQ3<1;default:;}
-nX2}
-;iO2
-RangeComparisonsData{static
-const
-l4
-Data[6]={{l4
-lA3
-tP
-Unchanged,l4::tP
-Unchanged
-tE
-Eq1
-tF
-Eq1
-nD1
-Eq0}
-,l91
-Eq0}
-}
-,{l4::lX2
-lB3
-Unchanged,l4
-lB3
-Unchanged
-tE
-Eq0
-tF
-Eq0
-nD1
-Eq1}
-,l91
-Eq1}
-}
-,{l4::lX2
-lB3
-t22,l4::tP
-MakeFalse
-nD1
-xD3
-tF
-xR3
-xD,{l4
-lA3
-Unchanged,l4
-lB3
-tP
-lC3
-nD1
-xR3
-tF
-xD3
-xD,{l4::lX2::tP
-tP
-MakeTrue,l4::t22
-tE
-xR3}
-,l91
-xD3
-xD,{l4
-lA3
-tP
-lC3,l4::Unchanged,l4
-nH1
-tE
-xD3}
-,l91
-xR3
-xD}
-;}
-xG1
-ConstantFolding_Comparison(eR{using
-iO2
-RangeComparisonsData;assert(tree.tU3()>=cEqual&&tree.tU3()<=cGreaterOrEq);switch(Data[tree
-nE-cEqual].Analyze
-nW1
-0),tree
-x03
-iY2
-l4::MakeFalse
-xP3
-ReplaceWithImmed(0);nW
-l4
-nH1
-xP3
-ReplaceWithImmed(1
-l33
-lC3:tH
-cEqual
-l33
-t22:tH
-t71
-l33
-MakeNotNotP0:tH
-cNotNot
-tW1
-1
-l33
-MakeNotNotP1:tH
-cNotNot
-tW1
-0
-l33
-MakeNotP0:tH
-cNot
-tW1
-1
-l33
-MakeNotP1:tH
-cNot
-tW1
-0
-l33
-Unchanged:;}
-if
-nW1
-1)y21)switch
-nW1
-0)nE
-iY2
-cAsin
-xP3
-lR
-fp_sin(iA2
-cAcos
-xP3
-lR
-fp_cos(y4)));tH
-cV2
-cLess?cGreater:cV2
-cLessOrEq?cGreaterOrEq:cV2
-cGreater?cLess:cV2
-cGreaterOrEq?cLessOrEq:tree
-nE);nW
-cAtan
-xP3
-lR
-fp_tan(iA2
-cLog
-xP3
-lR
-fp_exp(iA2
-cSinh
-xP3
-lR
-fp_asinh(iA2
-cTanh:if(fp_less(fp_abs(y4),nY3{tree.lR
-fp_atanh(y4)))nS2
-break;default:nM3
-nX2}
-#include <list>
-#include <algorithm>
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-iO2{
-#ifdef DEBUG_SUBSTITUTIONS
-yW
-double
-d){union{double
-d;uint_least64_t
-h;}
-t32
-d=d;lH1
-h
-nZ1
-#ifdef FP_SUPPORT_FLOAT_TYPE
-yW
-float
-f){union{float
-f;uint_least32_t
-h;}
-t32
-f=f;lH1
-h
-nZ1
-#endif
-#ifdef FP_SUPPORT_LONG_DOUBLE_TYPE
-yW
-long
-double
-ld){union{long
-double
-ld;e92{uint_least64_t
-a;i02
-short
-b;}
-s;}
-t32
-ld=ld;lH1
-s.b<<data.s.a
-nZ1
-#endif
-#ifdef FP_SUPPORT_LONG_INT_TYPE
-yW
-long
-ld){o<<"("
-<<std::hex<<ld
-nZ1
-#endif
-#endif
-}
-iO2
-FPoptimizer_CodeTree{lM
-nF)){}
-lM
-e62
-i
-yO
-nC3
-nF
-i)){data
-xB
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-lM
-eS1&&i
-yO
-nC3
-nF
-t72
-i))){data
-xB
-#endif
-lM
-i02
-v
-yO
-VarTag
-nF
-iE2,v))eS2
-nR2
-o
-yO
-OpcodeTag
-nF
-o))eS2
-nR2
-o,i02
-f
-yO
-FuncOpcodeTag
-nF
-o,f))eS2
-lM1&b
-yO
-CloneTag
-nF*b.data)){}
-yV1
-yK2::~yL2(){}
-lA
-ReplaceWithImmed
-i01
-eS1&i){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Replacing "
-;xE3(*this);if(IsImmed())OutFloatHex(std::cout,xJ1)lN1" with const value "
-<<i;OutFloatHex(std::cout,i)lN1"\n"
-;
-#endif
-data=new
-nO2
-x8(i);}
-yT1
-ParamComparer{i12()(lM1&a,lM1&b)const{if(a.xT2!=b.xT2
-nZ2
-a.xT2<b.xT2
-l81
-a.GetHash()<b.GetHash();}
-}
-;xB1
-nO2
-x8::Sort(){switch(Opcode
-iY2
-cAdd:case
-cMul:case
-cMin:case
-cMax:case
-cAnd:case
-cAbsAnd:case
-cOr:case
-cAbsOr:case
-cHypot:case
-cEqual:case
-t71:std::sort(iC2
-i62
-iC2
-end(),ParamComparer
-x8());lC
-cLess
-lU
-cGreater;}
-lC
-cLessOrEq
-lU
-cGreaterOrEq;}
-lC
-cGreater
-lU
-cLess;}
-lC
-cGreaterOrEq
-lU
-cLessOrEq;}
-break;default:nM3}
-lA
-AddParam(lM1¶m){xY
-yL
-param);}
-lA
-eG
-yK2¶m){xY
-yL
-yK2());xY.back().swap(param);}
-lA
-SetParam(size_t
-which,lM1&b)nI1
-which
-iB2
-xY[which]=b;}
-lA
-nC1
-size_t
-which,yK2&b)nI1
-which
-iB2
-xY[which
-t23
-b);}
-lA
-AddParams
-i01
-nK){xY.insert(xY.end(),l02.i62
-l02.end());}
-lA
-AddParamsMove(nK){size_t
-endpos=xY
-yA3,added=l02
-yA3;xY
-nE3
-endpos+added,yK2());for(size_t
-p=0;p<added;++p)xY[endpos+p
-t23
-l02[p]);}
-lA
-AddParamsMove(nK,size_t
-l12)nI1
-l12
-iB2
-iH1
-l12);AddParamsMove(eU1}
-lA
-SetParams
-i01
-nK){yG
-nV1
-tmp(eU1
-xY.swap(tmp);}
-lA
-SetParamsMove(nK){xY.swap(eU1
-l02.clear();}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-lA
-SetParams(yG
-nV1&&l02){SetParamsMove(eU1}
-#endif
-lA
-iH1
-size_t
-index){yG
-nV1&c93=xY;
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-iC2
-erase(iC2
-begin()+index);
-#else
-c93[index].data=0;for(size_t
-p=index;p+1<c93
-eW2
-p)c93[p].data.UnsafeSetP(&*c93[p+1
-iB2
-c93[nF3-1].data.UnsafeSetP(0);iC2
-resize(nF3-1);
-#endif
-}
-lA
-DelParams(){xY.clear();}
-xG1
-yK2::IsIdenticalTo(lM1&b)const{if(&*data==&*b.data
-nZ2
-true
-l81
-data->IsIdenticalTo(*b.data);}
-xG1
-nO2
-x8::IsIdenticalTo
-i01
-nO2
-x8&b)const{if(Hash!=b.Hash
-yI
-if(Opcode!=t43
-yI
-switch(Opcode
-iY2
-cImmed:return
-fp_equal(Value,t53;case
-iE2:return
-iJ1==b.iI1
-case
-cFCall:case
-cPCall:if(iJ1!=b.iJ1
-yI
-break;default:nM3
-if(nF3!=b.nF3
-yI
-for
-xK2
-0;a<c93
-eW2
-a){if(!c93[a]iA
-b.c93[a])yI}
-return
-true;}
-lA
-Become(lM1&b){if(&b!=this&&&*data!=&*b.data){DataP
-tmp=b.data;iY
-data.swap(tmp);}
-}
-lA
-CopyOnWrite(){if(GetRefCount()>1)data=new
-nO2
-x8(*data);}
-yV1
-yK2
-yK2::GetUniqueRef(){if(GetRefCount()>1
-nZ2
-yK2(*this,CloneTag())l81*this;}
-tQ):c7
-cNop
-l43),nC
-tQ
-const
-nO2&b):c7
-t43
-l43
-t53,iJ1(b.iJ1),c93(b.c93),Hash(b.Hash),Depth(b.Depth),eZ1
-b.iK1){}
-tQ
-e62
-i):c7
-cImmed
-l43
-i),nC
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-tQ
-nO2
-x8&&b):c7
-t43
-l43
-t72
-t53),iJ1(b.iJ1),c93(t72
-b.c93)),Hash(b.Hash),Depth(b.Depth),eZ1
-b.iK1){}
-tQ
-eS1&&i):c7
-cImmed
-l43
-t72
-i)),nC
-#endif
-tQ
-nR2
-o):c7
-o
-l43),nC
-tQ
-nR2
-o,i02
-f):c7
-o
-l43),iJ1(f),c93(),Hash(),Depth(1),eZ1
-0){}
-}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <sstream>
-#include <string>
-#include <map>
-#include <set>
-#include <iostream>
-xQ
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
-iO2{xB1
-l22
-cA3,eH3&done,std::ostream&o){for
-yS
-l22
-i43
-done,o);std::ostringstream
-buf;xE3(tree,buf);done[tree.GetHash()].insert(buf.str());}
-}
-#endif
-iO2
-FPoptimizer_CodeTree{
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
-xB1
-DumpHashes
-i01
-eY){eH3
-done;l22(tree,done,o);for(eH3::const_iterator
-i=done.nW3
-i!=done.end();++i){const
-std::set<std::string>&flist=i
-cJ2;if(flist
-yA3!=1)o<<"ERROR - HASH COLLISION?\n"
-;for(std::set<std::string>::const_iterator
-j=flist.nW3
-j!=flist.end();++j){o<<'['<<std::hex<<i->first.hash1<<','<<i->first.hash2<<']'<<std::dec;o<<": "
-<<*j<<"\n"
-;}
-}
-}
-xB1
-xE3
-i01
-eY){const
-char*tN3;switch
-xU2
-iY2
-cImmed:o<<yZ3
-l81;case
-iE2:o<<"Var"
-<<(tree.GetVar()-iE2)l81;case
-cAdd:tN3"+"
-;lC
-cMul:tN3"*"
-;lC
-cAnd:tN3"&"
-;lC
-cOr:tN3"|"
-;lC
-cPow:tN3"^"
-;break;default:tN3;o<<FP_GetOpcodeName
-xU2);if
-xU2==cFCall||cV2
-cPCall)o<<':'<<tree.GetFuncNo();}
-o<<'(';if(iT<=1&&sep2[1])o<<(sep2+1)<<' 'eV3
-if(a>0)o<<' ';xE3
-i43
-o);if(a+1<iT)o<<sep2;}
-o<<')';}
-xB1
-DumpTreeWithIndent
-i01
-eY,const
-std::string&indent){o<<'['<<std::hex<<(void*)(&tree.iE1))<<std::dec<<','<<tree.GetRefCount()<<']';o<<indent<<'_';switch
-xU2
-iY2
-cImmed:o<<"cImmed "
-<<yZ3;o<<'\n'l81;case
-iE2:o<<"VarBegin "
-<<(tree.GetVar()-iE2);o<<'\n'l81;default:o<<FP_GetOpcodeName
-xU2);if
-xU2==cFCall||cV2
-cPCall)o<<':'<<tree.GetFuncNo();o<<'\n';}
-for
-yS{std::string
-ind=indent;for(size_t
-p=0;p<ind
-yA3;p+=2)if(ind[p]=='\\')ind[p]=' ';ind+=(a+1<iT)?" |"
-:" \\"
-;DumpTreeWithIndent
-i43
-o,ind);}
-o<<std::flush;}
-#endif
-}
-#endif
-using
-iO2
-l41;xQ
-#include <cctype>
-iO2
-l41{xG1
-ParamSpec_Compare
-i01
-void*aa,const
-void*bb,lU2
-type){switch(type
-iY2
-lY2
-xH&a=*(xH*)aa;xH&b=*(xH*)bb
-l81
-a
-t42==b
-t42&&a.index==b.index&&a.depcode==b.depcode
-cM3
-NumConstant:{eZ&a=*(eZ*)aa;eZ&b=*(eZ*)bb
-l81
-fp_equal(a.xZ3,b.xZ3)&&a.modulo==b.modulo
-iD2
-xI&a=*(xI*)aa;xI&b=*(xI*)bb
-l81
-a
-t42==b
-t42&&a.cS==b.cS&&a.data.match_type==b.data.match_type&&a.data
-xY2==b.data
-xY2&&a.data.param_list==b.data.param_list&&a.data.n2==b.data.n2&&a.depcode==b.depcode;}
-}
-return
-true;}
-i02
-ParamSpec_GetDepCode
-i01
-cG2&b){switch(b.first
-iY2
-lY2
-yK3*s=i01
-xH*)b
-eE3
-l81
-s->depcode
-iD2
-const
-xI*s=i01
-xI*)b
-eE3
-l81
-s->depcode;}
-default:nM3
-return
-0;}
-xB1
-DumpParam
-i01
-cG2&xZ2
-std::ostream&o){static
-const
-char
-ParamHolderNames[][2]={"%"
-,"&"
-,"x"
-,"y"
-,"z"
-,"a"
-,"b"
-,"c"
-}
-;i02
-t52
-0;xT3
-NumConstant:{const
-eZ&t82
-eZ*x01;o.precision(12);o<<xF3
-xZ3;nM3
-case
-lY2
-yK3&t82
-xH*x01;o<<ParamHolderNames[xF3
-index];t52
-param
-t42;break
-iD2
-const
-xI&t82
-xI*x01;t52
-param
-t42;yZ
-GroupFunction){if
-iZ2
-cS==cNeg){o<<"-"
-;n3}
-tP1
-xF3
-cS==cInv){o<<"/"
-;n3}
-else{std::string
-opcode=FP_GetOpcodeName((nR2)xF3
-cS).substr(1)c23
-0;a<opcode
-eW2
-a)opcode[a]=(char)std::toupper(opcode[a]);o<<opcode<<"( "
-;n3
-o<<" )"
-;}
-}
-else{o<<'('<<FP_GetOpcodeName((nR2)xF3
-cS)<<' ';yZ
-PositionalParams)o<<'[';yZ
-SelectedParams)o<<'{';n3
-if
-iZ2
-data.n2!=0)o<<" <"
-<<xF3
-data.n2<<'>';yZ
-PositionalParams)o<<"]"
-;yZ
-SelectedParams)o<<"}"
-;o<<')';}
-nM3
-yN3(ImmedConstraint_Value(tX1
-ValueMask)iY2
-ValueMask:lC
-Value_AnyNum:lC
-n12:o<<"@E"
-;lC
-Value_OddInt:o<<"@O"
-;lC
-t01:o<<"@I"
-;lC
-Value_NonInteger:o<<"@F"
-;lC
-eE1:o<<"@L"
-;t62
-ImmedConstraint_Sign(tX1
-SignMask)iY2
-SignMask:lC
-Sign_AnySign:lC
-nJ1:o<<"@P"
-;lC
-n02:o<<"@N"
-;t62
-ImmedConstraint_Oneness(tX1
-OnenessMask)iY2
-OnenessMask:lC
-Oneness_Any:lC
-Oneness_One:o<<"@1"
-;lC
-Oneness_NotOne:o<<"@M"
-;t62
-ImmedConstraint_Constness(tX1
-ConstnessMask)iY2
-ConstnessMask:lC
-yL1:if(lF3.first==ParamHolder){yK3&t82
-xH*x01;if
-iZ2
-index<2)nM3
-o<<"@C"
-;lC
-Constness_NotConst:o<<"@V"
-;lC
-Oneness_Any:nM3}
-xB1
-DumpParams
-iL1
-paramlist,i02
-count,std::ostream&o){for
-iL1
-a=0;a<count;++a){if(a>0)o<<' ';const
-cG2¶m=e01
-x8(paramlist,a);DumpParam
-x8(param,o);i02
-depcode=ParamSpec_GetDepCode(param);if(depcode!=0)o<<"@D"
-<<depcode;}
-}
-}
-#include <algorithm>
-using
-iO2
-l41;xQ
-iO2{yK3
-plist_p[36]={{2,0,0x0}
-tS
-0,0x4}
-tS
-nJ1,0x0}
-tS
-n02|Constness_NotConst,0x0}
-tS
-Sign_NoIdea,0x0}
-tS
-eE1,0x0}
-,{3,Sign_NoIdea,0x0}
-,{3,0,0x0}
-,{3,eE1,0x0}
-,{3,0,0x8}
-,{3,Value_OddInt,0x0}
-,{3,Value_NonInteger,0x0}
-,{3,n12,0x0}
-,{3,nJ1,0x0}
-,{0,n02|n0{0,n0{0,nJ1|n0{0,n12|n0{0,yL1,0x1}
-,{0,t01|nJ1|n0{0,t11
-yL1,0x1}
-,{0,t11
-n0{0,Oneness_One|n0{0,eE1|n0{1,n0{1,n12|n0{1,t11
-n0{1,t01|n0{1,nJ1|n0{6,0,0x0}
-,{4,0,0x0}
-,{4,t01,0x0}
-,{4,n0{4,0,0x16}
-,{5,0,0x0}
-,{5,n0}
-;yT1
-plist_n_container{static
-const
-eZ
-plist_n[19];}
-;yV1
-const
-eZ
-plist_n_container
-x8::plist_n[19]={{eS1(-2
-iZ-1
-iZ-0.5
-iZ
-0
-tB2
-fp_const_deg_to_rad
-cE3
-fp_const_einv
-cE3
-fp_const_log10inv
-x8(iZ
-0.5
-tB2
-fp_const_log2
-x8(iZ
-1
-tB2
-fp_const_log2inv
-x8(iZ
-2
-tB2
-fp_const_log10
-cE3
-fp_const_e
-cE3
-fp_const_rad_to_deg
-cE3-fp_const_pihalf
-x8(),xL1{eS1(0),xL1{fp_const_pihalf
-x8(),xL1{fp_const_pi
-x8(),xL1}
-;const
-xI
-plist_s[464]={{{1,15,tC2
-15,cNeg,GroupFunction,0}
-,yL1,0x1}
-,{{1,422,tC2
-423,tC2
-15,tD2
-24,tD2
-410,tD2
-411,cInv,xZ
-2,301330,cAdd,tG2
-271397
-lU1
-0x5
-tY3
-271397,l5
-45
-lU1
-iR
-2,58413,l5
-140333,l5
-194605
-lU1
-0x1
-tY3
-224301,l5
-270373,l5
-270381,l5
-271405,l5
-271405
-lU1
-0x5
-tY3
-140341,l5
-223285,l5
-286757,l5
-286765,l5
-322605,l5
-232501,l5
-7168,l5
-30727,l5
-141312,l5
-179207,l5
-58383,l5
-59407,l5
-285718
-lU1
-iR
-2,59416,l5
-29726,l5
-34823,l5
-18597,l5
-46264,l5
-15764,l5
-57509,l5
-293049,l5
-292026,l5
-161979,l5
-161980,l5
-172265,l5
-173308,l5
-243951,l5
-247024,l5
-38152,l5
-46344,l5
-293147,l5
-1332,l5
-24980,l5
-183473,l5
-183570,l5
-418001,l5
-420248,cAdd,lP
-0,0,tR
-0,0,cAdd,i3
-1,43,tR
-1,51,tR
-1,52,tR
-1,53,tR
-1,54,tR
-1,0,lZ
-iR
-1,0,t51
-2}
-,0,iR
-1,0,tR
-1,21,tR
-1,15,tR
-1,26,tR
-1,24,cAdd,i3
-2,56344,cAdd,i3
-1,219,tR
-1,230,cAdd,i3
-1,245,lZ
-0x16}
-,{{1,329,lZ
-0x16}
-,{{1,399,lZ
-iR
-1,401,lZ
-iR
-0,0,t51
-1}
-,nJ1,0x0
-tY3
-46095,tE2
-24591,tE2
-32783,tE2
-37,c1
-7205,c1
-114725,c1
-288805,lJ
-0x6
-tY3
-347173,lJ
-0x6
-tY3
-331813,c1
-350245,c1
-372773,c1
-377893,c1
-378917,c1
-383013,c1
-388133,c1
-439333,c1
-442405,c1
-447525,c1
-450597,c1
-459813,c1
-468005,c1
-305201,l2
-3,61910016,c1
-7168,c1
-114688,c1
-512000,l2
-3,45508608,c1
-15,c1
-30727,c1
-71695,c1
-130063,c1
-286735,lJ
-0x1
-tY3
-29726,c1
-34823,c1
-115736,c1
-114712,c1
-299008,c1
-288783
-xM2
-300032,c1
-347151
-xM2
-357376,l2
-3,65425438,c1
-420864,c1
-280611,c1
-358407,c1
-301088,c1
-55,c1
-38143,c1
-38143,lJ
-iR
-2,38145,lJ
-iR
-2,38152,c1
-38171,c1
-15631,c1
-15711,c1
-56671,c1
-38262,lJ
-iR
-2,60820,c1
-38325,lJ
-iR
-3,15777143,c1
-37303,c1
-48505,l2
-3,15777207,c1
-347191
-xM2
-48571,c1
-103714,c1
-104739,c1
-266538,c1
-307547,c1
-304475,c1
-353627,c1
-48490,c1
-310338,c1
-376173,lJ
-lP2
-3,39173485,lJ
-lP2
-2,436589,lJ
-lP2
-2,7578,c1
-376232,lJ
-lP2
-2,436648,lJ
-lP2
-3,39233901,lJ
-lP2
-3,39233960,lJ
-lP2
-2,7651,c1
-7675,l2
-0,0,nO
-0,0,cT
-1,37,nO
-1,37,cT
-1,2,n22
-2,n32
-3,n22
-3,n32
-0,nO
-1,0,n32
-0,cT
-1,14,nO
-1,16,nO
-1,16,lK
-1
-xN2
-21,nO
-1,15,nO
-1,24,cT
-2,24591,nO
-1,55,nO
-1,55,lK
-2
-xN2
-275,n22
-278,n32
-284,cT
-1,287,nO
-1,288,nO
-1,289,cT
-1,462,cT
-2,413757,lK
-1
-xN2
-295,nO
-1,329,cT
-2,414025,lK
-1}
-,0,0x16}
-,{{1,351,nO
-1,404,nO
-1,410,nO
-2,60459,l32
-44047,l32
-24591,l32
-32783,l32
-44056,l32
-41,lI,41,y0
-49,lI,49,y0
-365609,lI,222257,lI,365617,lI,366633,lI,366641,lI,48128,lI,15,lI,15,cV1
-16,lI,10240,lI,11264,lI,7170,lI,7168,lI,7168,y0
-7183,cV1
-17408,lI,19456,lI,16384,lI,15360,lI,27648,lI,30720,lI,30722,lI,24,tF2
-0x6
-tY3
-24,lI,7192,lI,68608,lI,83968,lI,86040,lI,87040,lI,88064,lI,90112,lI,432128,lI,433152,lI,37895,lI,14342,lI,25607,lI,7183,lI,56327,lI,114703,lI,114718,lI,257024,lI,419840,lI,260103,lI,37953,tF2
-0x5
-tY3
-37956,y0
-37961,tF2
-0x5
-tY3
-38105,lI,38114,y0
-38984,y0
-44103,y0
-44104,y0
-38991,lI,44111,lI,44135,lI,44124,y0
-44136,lI,48240,lI,60693,lI,38253,y0
-38253,lI,38259,tF2
-0x5
-tY3
-38260,cV1
-38262,y0
-38262,lI,48493,y0
-48493,lI,15734,y0
-137590,lI,38264,tF2
-0x5
-tY3
-38292,lI,38294,lI,38300,lI,38301,lI,38312,y0
-38325,y0
-38332,y0
-38332,lI,38341,lI,38341,y0
-38343,lI,60,lI,60,tF2
-0x6
-tY3
-48552,y0
-48552,lI,257198,lI,260274,lI,24792,lI,7172,cPow,PositionalParams,0}
-,nJ1,0x0
-tY3
-24591,cPow,xZ
-2,60440,cPow,xZ
-2,60451,cPow,xZ
-2,61472,cPow,xZ
-1,0,eI3
-7,eI3
-157,eI3
-0,cAcos
-eJ3
-cAcosh
-eJ3
-cAsin
-eJ3
-cAsinh
-nR
-112,cAsinh
-eJ3
-cAtan,eF1
-cAtan2,tG2
-303104
-i23
-eJ3
-cAtanh
-eJ3
-cCeil,cF3
-216,cCeil
-eJ3
-yO2
-0,cCos,cF3
-7,yO2
-81,yO2
-83,yO2
-112,yO2
-180,yO2
-234,yO2
-0,cH3
-cF3
-0,cI3
-176,cI3
-180,cI3
-409,cI3
-0,cFloor,cF3
-216,cFloor,tG2
-308523,eK3
-tG2
-352555,eK3
-tG2
-352599,eK3
-l0
-3,31464448,cU
-507534336,cU
-508566528,cU
-33579008,cU
-30443520,lD3
-31464448,lD3
-7836672,cU
-24612864,cU
-93415424,cU
-142744576,cU
-174234624,cU
-265547776,cU
-435585024,cU
-439783424,cU
-519553024,cU
-526900224,cU
-58739160,cU
-58739160,lD3
-58739166,cU
-58739166,cIf,cF3
-112,cInt
-eJ3
-tH2
-7,tH2
-30,tH2
-157,tH2
-216,tH2
-282,tH2
-15,cLog,xZ
-1,24,cLog,xZ
-1,0,cLog10
-eJ3
-cLog2,eF1
-cMax,tG2
-29726,cMax,tG2
-34823,cMax
-eJ3
-cMax,AnyParams,1}
-,0,iR
-xG3
-cMin,tG2
-29726,cMin,tG2
-34823,cMin
-eJ3
-cMin,AnyParams,1}
-,0,iR
-2,46095,cMin,xZ
-2,24591,cMin,xZ
-1,0,n42
-0,cSin,cF3
-7,n42
-81,n42
-83,n42
-112,n42
-139,n42
-161,cSin,nU
-0x5}
-,{{1,216,n42
-227,n42
-231,cSin,nU
-0x1}
-,{{1,234,n42
-0,cSinh,cF3
-0,cSinh
-nR
-161,cSinh,nU
-0x5}
-,{{1,176,cSinh
-nR
-216,cSinh
-nR
-227,cSinh
-nR
-234,cSinh
-nR
-409,cSinh
-eJ3
-yP2
-0,cTan,cF3
-75,cTan,cF3
-76,yP2
-161,yP2
-216,yP2
-231,yP2
-227,yP2
-234,yP2
-0,xV2
-0,cTanh,cF3
-160,xV2
-161,xV2
-216,xV2
-227,xV2
-234,xV2
-0,cTrunc,tG2
-15384,cSub,xZ
-2,15384,cDiv,xZ
-2,420251,cDiv,xZ
-xG3
-tK2
-nU
-t41
-tK2
-tG2
-30720,tK2
-nU
-0x20
-tY3
-30727,tK2
-nU
-0x24
-tY3
-30727,tK2
-tG2
-114743,tK2
-tG2
-114743,t71,tG2
-39936,cLess,l6
-2,39936,cLess,tG2
-7,cLess,eF1
-cLess,nU
-t41
-cLessOrEq,tG2
-256216,cLessOrEq,tG2
-39936,e82
-l6
-2,39936,e82
-tG2
-7,e82
-eF1
-e82
-nU
-t41
-cGreaterOrEq,tG2
-256216,cGreaterOrEq
-eJ3
-l42
-7,l42
-15,l42
-30,l42
-156,l42
-494,l42
-497,l42
-498,l42
-501,l42
-504,l42
-505,cNot,eF1
-l52
-29726,l52
-34823,l52
-394270,l52
-398366,l52
-7651,cAnd,lP
-0,0,cAnd,AnyParams,1}
-,0,0x0}
-,{{xG3
-nJ2
-29726,nJ2
-34823,nJ2
-394270,nJ2
-398366,nJ2
-7651,cOr,lP
-1,0
-t31
-81
-t31
-121
-t31
-156
-t31
-159
-t31
-216,cDeg
-nR
-216,cRad,eF1
-cAbsAnd,lP
-xG3
-cAbsOr,lP
-1,0,yR3
-eJ3
-cAbsNotNot,l0
-3,31464448,eP3
-nU
-0x0}
-,}
-;}
-iO2
-l41{const
-Rule
-grammar_rules[253]={{ProduceNewTree,1,1,0,{1,0,cAbs,xJ
-361,{1,172,cAtan,xJ
-354
-tS
-1337
-i23,xJ
-356
-tS
-320513
-i23
-l7
-2,2,222424
-tS
-226524
-i23
-l7
-2,2,224474
-tS
-228574
-i23,xJ
-148
-x13
-cCeil,xJ
-435,{1,80,tL2
-429,{1,115,tL2
-430,{1,117,tL2
-146,{1,118,tL2
-370,{1,116,tL2
-0,{1,354,cCos
-l7
-2,1,0,{1,351,cCos
-l7
-2,1,216
-x13
-tL2
-314,{1,357,cCosh
-l7
-2,1,0,{1,351,cCosh
-l7
-2,1,216
-x13
-cH3
-xJ
-144
-x13
-cFloor,xJ
-403,{1,114,cFloor,eL3
-214,{3,7379968,c8
-518,{3,31464450,c8
-499,{3,8428544,c8
-501,{3,8434688,c8
-215,{3,40901632,c8
-494,{3,40902656,c8
-507,{3,40940544,c8
-506,{3,47194112,c8
-483,{3,47225856,c8
-414,{3,1058266,c8
-418,{3,1058272,c8
-418,{3,9438682,c8
-414,{3,9438688,c8
-460,{3,396733911,c8
-460,{3,381020637,cIf
-l7
-0,3,31492569,{3,35682779,cIf
-l7
-0,3,31492575,{3,35682785,cIf,xJ
-111,{1,228,eM3
-110,{1,244,eM3
-355,{1,106,eM3
-204,{1,205,cLog
-l7
-0,1,395
-cP2,cMax
-yF
-0
-tS
-431105,cMax
-yF
-396
-cP2,cMin
-yF
-0
-tS
-427009,cMin,AnyParams,0}
-}
-,{ProduceNewTree,0,1,203
-tS
-24804,cPow,eL3
-203
-tS
-25827,cPow,eL3
-202
-tS
-126991,cPow
-xM1
-30988,cPow
-xM1
-30989,cPow
-xM1
-30990,cPow
-t93
-166239
-tS
-31066,cPow
-xM1
-32015,cPow
-t93
-7168
-tS
-12639,cPow
-t93
-7392
-tS
-12535
-x23
-380
-tS
-44095
-x23
-381
-tS
-44141
-x23
-382
-tS
-44140
-x23
-201
-tS
-109583
-x23
-200
-tS
-132129
-x23
-155
-tS
-133153
-n52
-419840
-tS
-413711
-n52
-254976
-tS
-253967
-n52
-221184
-tS
-251937
-n52
-221184
-tS
-248850
-x23
-150
-x13
-yQ2
-372,{1,80,yQ2
-146,{1,115,yQ2
-370,{1,117,yQ2
-149,{1,118,yQ2
-429,{1,116,yQ2
-0,{1,356,yQ2
-152
-x13
-cSinh,xJ
-312,{1,355,cSinh,xJ
-153
-x13
-eN3
-0,{1,359,eN3
-170,{1,360,eN3
-154
-x13
-cTanh
-l7
-0,1,392
-tS
-395279,tM2
-391
-cP2,tM2
-199
-tS
-242924,tM2
-198
-tS
-230636,tM2
-164
-tS
-240869,tM2
-163
-tS
-240660,t51
-0
-nM1
-263,{1,311,t51
-1
-nM1
-262,{1,310,t51
-1
-l1
-2,1,261
-tS
-1333
-lW1
-259
-tS
-1331
-lW1
-407
-tS
-415124
-lW1
-45
-tS
-331093
-lW1
-324
-tS
-146477
-lW1
-342
-tS
-145453
-lW1
-427
-tS
-213202
-lW1
-428
-tS
-217298
-lW1
-368
-tS
-216270
-lW1
-145
-tS
-216271
-lW1
-369
-tS
-218318
-lW1
-197
-tS
-144665
-lW1
-194
-tS
-348441
-lW1
-193
-tS
-348300
-lW1
-195
-tS
-200875
-lW1
-192
-tS
-177323
-lW1
-257
-tS
-446837
-lW1
-181
-tS
-446653
-lW1
-151
-tS
-187765
-lW1
-147
-tS
-187828
-lW1
-255
-tS
-195957
-lW1
-374
-tS
-264383
-lW1
-437
-tS
-264381
-lW1
-437
-tS
-186741
-lW1
-374
-tS
-262580
-lW1
-151
-tS
-262333,tM2
-98
-tS
-1155
-eG1
-97
-tS
-1156
-eG1
-305
-tS
-1330
-eG1
-99
-tS
-24704
-eG1
-100
-tS
-24698
-eG1
-394
-tS
-395279
-eG1
-393
-cP2
-eG1
-353
-tS
-360799
-eG1
-96
-tS
-89360
-eG1
-105
-tS
-80155
-eG1
-95
-tS
-79131
-cQ2
-56671
-tS
-1424
-cQ2
-15711
-tS
-1426
-cQ2
-107535
-tS
-93467
-cQ2
-97295
-tS
-96539,l8
-1,1,0,{1,351,l8
-1,1,55,{1,14,lK
-0
-nM1
-93
-tS
-70674,cMul,SelectedParams,0
-nM1
-512,{1,50,lK
-1
-nM1
-513,{1,40,lK
-1
-l1
-2,1,435
-tS
-443429,eA
-442
-tS
-451621,eA
-336
-tS
-382285,eA
-437
-tS
-382406,eA
-374
-tS
-446801,eA
-365
-tS
-435534,eA
-444
-tS
-325033,eA
-318
-tS
-340413,eA
-335
-tS
-375116,eA
-424
-tS
-375229,eA
-45
-tS
-456126,eA
-450
-tS
-328114,eA
-45
-tS
-460223,eA
-452
-tS
-461861,eA
-453
-tS
-329140,eA
-322
-tS
-341446,eA
-456
-tS
-335286,eA
-448
-tS
-327087,eA
-459
-tS
-469029,eA
-455
-tS
-311360,eA
-338
-tS
-309322,eA
-412
-tS
-43412,eA
-330
-tS
-49480,eA
-413
-tS
-47508,eA
-331
-tS
-45384,l8
-2,2,334277
-tS
-333236
-cQ2
-39936
-tS
-xH3
-cEqual
-yP
-cEqual
-yQ
-cEqual
-yR
-cEqual
-lA1
-24807
-t61
-iD
-t61
-l62
-237799
-t61
-n11
-cEqual
-l72
-tK2
-eH1
-39,tK2
-eO3
-0
-tS
-5165,cEqual
-t93
-39936
-tS
-xH3
-t71
-yP
-t71
-yQ
-t71
-yR
-t71
-lA1
-24807
-tI2
-iD
-tI2
-l62
-237799
-tI2
-n11
-t71
-l72
-t71
-tJ2
-39,t71,eH1
-5165,t71
-yP
-cLess
-yQ
-cLess
-yR
-cLess,xJ
-516
-tS
-44032,cLess
-lA1
-24804
-t21
-yM1
-t21
-iD
-t21
-l62
-237796
-t21
-xN1
-t21
-n11
-cLess
-l72
-cLess
-tJ2
-xH3
-cLess
-yP
-cLessOrEq
-yQ
-cLessOrEq
-yR
-cLessOrEq,xJ
-510
-tS
-359439,cLessOrEq
-lA1
-24804
-xC1
-yM1
-xC1
-iD
-xC1
-l62
-237796
-xC1
-xN1
-xC1
-n11
-cLessOrEq
-l72
-cLessOrEq
-tJ2
-359469,cLessOrEq
-yP
-cGreater
-yQ
-cGreater
-yR
-e82
-xJ
-487
-tS
-359439,cGreater
-lA1
-24804
-y61
-yM1
-y61
-iD
-y61
-l62
-237796
-y61
-xN1
-y61
-n11
-cGreater
-l72
-e82
-eH1
-359469,cGreater
-yP
-cGreaterOrEq
-yQ
-cGreaterOrEq
-yR
-cGreaterOrEq,xJ
-517
-tS
-44032
-yX
-473304
-tS
-24804
-yX
-yM1
-yX
-iD
-yX
-l62
-237796
-yX
-xN1
-yX
-7168
-tS
-279818
-yX
-lB1
-cGreaterOrEq,eH1
-xH3
-cGreaterOrEq,eL3
-516,{1,2,cNot,eO3
-469,{1,123,cNot,eL3
-511,{1,5,cAnd,AnyParams,1
-l1
-0,1,514
-tS
-13314,cAnd
-yF
-397
-cP2,cAnd
-yF
-491
-tS
-496099,cAnd
-yF
-492
-tS
-399846,cAnd
-yF
-493
-tS
-393702,cAnd,AnyParams,0
-l1
-0,2,479697,{3,489115088,cAnd
-yF
-515
-tS
-13314,xI3
-508
-tS
-8197,xI3
-398
-cP2,xI3
-488
-tS
-496099,xI3
-489
-tS
-399846,xI3
-490
-tS
-393702,xI3
-509
-tS
-136197,cOr,AnyParams,0}
-}
-,{ProduceNewTree,0,1,517,{1,2,xJ3
-l3
-1,1,0,{1,0,xJ3
-eO3
-470,{1,123,xJ3
-xJ
-482,{1,228,cAbsNotNot,AnyParams,0
-nM1
-476,{1,227,cAbsNotNot,AnyParams,0}
-}
-,{ProduceNewTree,0,1,383,{3,31464955,eP3
-eL3
-517,{3,40940544,eP3
-eL3
-516,{3,47225856,i03
-l7
-0,3,31492569,{3,35682779,eP3
-PositionalParams,0}
-}
-,}
-;e92
-grammar_optimize_abslogical_type{xS
-9
-eI
-grammar_optimize_abslogical_type
-grammar_optimize_abslogical={9,{21,183,219,228,231,237,244,249,252}
-}
-;}
-e92
-grammar_optimize_ignore_if_sideeffects_type{xS
-59
-eI
-grammar_optimize_ignore_if_sideeffects_type
-grammar_optimize_ignore_if_sideeffects={59,{0,20,22,23,24,25,26,27,cV
-tY1
-78,cZ
-xR
-grammar_optimize_nonshortcut_logical_evaluation_type{xS
-56
-eI
-grammar_optimize_nonshortcut_logical_evaluation_type
-grammar_optimize_nonshortcut_logical_evaluation={56,{0,26,cV
-tY1
-78,cZ
-158,167,168,169,178,179,191,195,203,207,215,227,229,230,232,233,234,235,236,238,239,240,241,242,243,245,246,247,248,250,251}
-}
-;}
-e92
-grammar_optimize_round1_type{xS
-118
-eI
-grammar_optimize_round1_type
-grammar_optimize_round1={118,{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,26,cV
-37,38,tY1
-45,46,47,48,49,50,51,52,53,54,58,59,60,61,62,63,64,65,66,67,68,69,70,71,78,79,80,81,82,83,88,89,90,91,92,93,94,95,96,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,132,xR
-grammar_optimize_round2_type{xS
-100
-eI
-grammar_optimize_round2_type
-grammar_optimize_round2={100,{0,15,16,17,26,cV
-39,40,tY1
-45,46,47,48,49,50,51,52,53,54,59,60,72,73,78,79,84,85,86,87,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,117,118,119,120,121,122,123,124,125,126,127,128,133,157,xR
-grammar_optimize_round3_type{xS
-79
-eI
-grammar_optimize_round3_type
-grammar_optimize_round3={79,{74,75,76,77,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,159,160,161,162,163,164,165,166,170,171,172,173,174,175,176,177,180,181,182,184,185,186,187,188,189,190,192,193,194,196,197,198,199,200,201,202,204,205,206,208,209,210,211,212,213,214,216,217,218,220,221,222,223,224,225,226}
-}
-;}
-e92
-grammar_optimize_round4_type{xS
-10
-eI
-grammar_optimize_round4_type
-grammar_optimize_round4={10,{19,55,56,57,130,131,153,154,155,156}
-}
-;}
-e92
-grammar_optimize_shortcut_logical_evaluation_type{xS
-53
-eI
-grammar_optimize_shortcut_logical_evaluation_type
-grammar_optimize_shortcut_logical_evaluation={53,{0,26,cV
-tY1
-78,cZ
-158,167,168,169,178,179,191,195,203,207,215,227,229,232,233,234,235,236,239,240,241,242,245,246,247,248,250,251}
-}
-;}
-}
-iO2
-l41{yV1
-cG2
-e01
-iL1
-paramlist,lC1){index=(paramlist>>(index*10))&1023;if(index>=55
-nZ2
-cG2(SubFunction
-tZ1
-plist_s[index-55]);if(index>=36
-nZ2
-cG2(NumConstant
-tZ1
-plist_n_container
-x8::plist_n[index-36])l81
-cG2(ParamHolder
-tZ1
-plist_p[index]);}
-}
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <stdio.h>
-#include <algorithm>
-#include <map>
-#include <sstream>
-xQ
-using
-iO2
-l41;using
-iO2
-FPoptimizer_CodeTree;using
-iO2
-FPoptimizer_Optimize;iO2{nT1
-It,typename
-T,typename
-Comp>eI1
-MyEqualRange(It
-first,It
-last,const
-T&val,Comp
-comp){size_t
-len=last-first;while(len>0){size_t
-nJ3
-len/2;It
-n43(first);n43+=half;if(comp(*n43,val)){first=n43;++first;len=len-half-1;}
-tP1
-comp(val,*n43)){len=half;}
-else{It
-left(first);{It&cR2=left;It
-last2(n43);size_t
-len2=last2-cR2;while(len2>0){size_t
-half2=len2/2;It
-middle2(cR2);middle2+=half2;if(comp(*middle2,val)){cR2=middle2;++cR2;len2=len2-half2-1;}
-else
-len2=half2;}
-}
-first+=len;It
-right(++n43);{It&cR2=right;It&last2=first;size_t
-len2=last2-cR2;while(len2>0){size_t
-half2=len2/2;It
-middle2(cR2);middle2+=half2;if(comp(val,*middle2))len2=half2;else{cR2=middle2;++cR2;len2=len2-half2-1;}
-}
-}
-return
-eI1(left,right);}
-}
-return
-eI1(first,first);}
-yT1
-OpcodeRuleCompare{i12()(lM1&tree,i02
-xW2)const{const
-Rule&rule=grammar_rules[xW2]l81
-tree
-nE<rule
-nT2.subfunc_opcode;}
-i12()iL1
-xW2,const
-eR
-const{const
-Rule&rule=grammar_rules[xW2]l81
-rule
-nT2.subfunc_opcode<tree
-nE;}
-}
-;xG1
-TestRuleAndApplyIfMatch
-eX3
-yK2&tree,bool
-cD{MatchInfo
-x8
-info;lZ1
-found(false,e1());if((rule.eL1
-LogicalContextOnly)&&!cD{yR2
-if(nD
-IsIntType
-x8::result){if(rule.eL1
-NotForIntegers)yR2
-else{if(rule.eL1
-OnlyForIntegers)yR2
-for(;;){
-#ifdef DEBUG_SUBSTITUTIONS
-#endif
-found=TestParams(rule
-nT2,tree,found.specs,info,true);if(found.found)break;if(!&*found.specs){fail:;
-#ifdef DEBUG_SUBSTITUTIONS
-DumpMatch
-t81,false);
-#endif
-nX2}
-#ifdef DEBUG_SUBSTITUTIONS
-DumpMatch
-t81,true);
-#endif
-SynthesizeRule
-t81)nS2}
-iO2
-FPoptimizer_Optimize{xG1
-ApplyGrammar
-i01
-Grammar&tN2,yK2&tree,bool
-cD{if(tree.GetOptimizedUsing()==&tN2){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Already optimized: "
-;xE3(tree)lN1"\n"
-<<std::flush;
-#endif
-nX2
-if(true){bool
-changed
-i13
-switch
-xU2
-iY2
-cNot:case
-cNotNot:case
-cAnd:case
-cOr:for
-xK2
-0
-nP
-true))yI1
-lC
-cIf:case
-i03:if(ApplyGrammar(tN2,e72,cV2
-cIf))yI1
-for
-xK2
-1
-nP
-cD)yI1
-break;default:for
-xK2
-0
-nP
-false))yI1}
-if(changed){tree.Mark_Incompletely_Hashed()nS2}
-typedef
-const
-i02
-char*lE3;std::pair<lE3,lE3>range=MyEqualRange(tN2.rule_list,tN2.rule_list+tN2.rule_count,tree,OpcodeRuleCompare
-x8());if(range.eQ3
-range
-eE3){
-#ifdef DEBUG_SUBSTITUTIONS
-yG<i02
-char>rules;rules.nH3
-range
-eE3-range.first);yD
-if(IsLogisticallyPlausibleParamsMatch(cW1
-nT2
-n72
-rules
-yL*r);}
-range.first=&rules[0];range
-eE3=&rules[rules
-yA3-1]+1;if(range.eQ3
-range
-eE3){std::cout<<"Input ("
-<<FP_GetOpcodeName
-xU2)<<")["
-<<iT<<"]"
-;if(cD
-std::cout<<"(Logical)"
-;i02
-first=i21,prev=i21;const
-char*sep=", rules "
-;yD
-if(first==i21)first=prev=*r;tP1*r==prev+1)prev=*r;else{std::cout<<sep<<first;sep=","
-;if(prev!=first)std::cout<<'-'<<prev;first=prev=*r;}
-}
-if(eQ3
-i21){std::cout<<sep<<first;if(prev!=first)std::cout<<'-'<<prev;}
-std::cout<<": "
-;xE3(tree)lN1"\n"
-<<std::flush;}
-#endif
-bool
-changed
-i13
-yD
-#ifndef DEBUG_SUBSTITUTIONS
-if(!IsLogisticallyPlausibleParamsMatch(cW1
-nT2
-n72
-y81
-#endif
-if(TestRuleAndApplyIfMatch(cW1,tree,cD){yI1
-nM3}
-if(changed){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Changed."
-<<std::endl
-lN1"Output: "
-;xE3(tree)lN1"\n"
-<<std::flush;
-#endif
-tree.Mark_Incompletely_Hashed()nS2}
-tree.SetOptimizedUsing(&tN2)l81
-false;}
-xB1
-ApplyGrammars(x2){
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_round1\n"
-;
-#endif
-n4
-grammar_optimize_round1
-n53
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_round2\n"
-;
-#endif
-n4
-grammar_optimize_round2
-n53
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_round3\n"
-;
-#endif
-n4
-grammar_optimize_round3
-n53
-#ifndef FP_ENABLE_SHORTCUT_LOGICAL_EVALUATION
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_nonshortcut_logical_evaluation\n"
-;
-#endif
-n4
-grammar_optimize_nonshortcut_logical_evaluation
-n53
-#endif
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_round4\n"
-;
-#endif
-n4
-grammar_optimize_round4
-n53
-#ifdef FP_ENABLE_SHORTCUT_LOGICAL_EVALUATION
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_shortcut_logical_evaluation\n"
-;
-#endif
-n4
-grammar_optimize_shortcut_logical_evaluation
-n53
-#endif
-#ifdef FP_ENABLE_IGNORE_IF_SIDEEFFECTS
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_ignore_if_sideeffects\n"
-;
-#endif
-n4
-grammar_optimize_ignore_if_sideeffects
-n53
-#endif
-#ifdef DEBUG_SUBSTITUTIONS
-std
-tJ3"grammar_optimize_abslogical\n"
-;
-#endif
-n4
-grammar_optimize_abslogical
-n53
-#undef C
-}
-}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <algorithm>
-#include <assert.h>
-#include <cstring>
-#include <cmath>
-#include <memory> /* for auto_ptr */
-xQ
-using
-iO2
-l41;using
-iO2
-FPoptimizer_CodeTree;using
-iO2
-FPoptimizer_Optimize;iO2{xG1
-TestImmedConstraints
-iL1
-bitmask,const
-eR{switch(bitmask&ValueMask
-iY2
-Value_AnyNum:case
-ValueMask:lC
-n12:if(GetEvennessInfo
-nO3
-l82
-Value_OddInt:if(GetEvennessInfo
-nO3
-n82
-t01:if(GetIntegerInfo
-nO3
-l82
-Value_NonInteger:if(GetIntegerInfo
-nO3
-n82
-eE1:if(!IsLogicalValue(tree)yI
-nK1
-SignMask
-iY2
-Sign_AnySign:lC
-nJ1:if(l01
-l82
-n02:if(l01
-n82
-Sign_NoIdea:if(l01
-Unknown
-yI
-nK1
-OnenessMask
-iY2
-Oneness_Any:case
-OnenessMask:lC
-Oneness_One:if(!cW2
-if(!fp_equal(fp_abs(yZ3),eS1(1))yI
-lC
-Oneness_NotOne:if(!cW2
-if(fp_equal(fp_abs(yZ3),eS1(1))yI
-nK1
-ConstnessMask
-iY2
-Constness_Any:lC
-yL1:if(!cW2
-lC
-Constness_NotConst:if(cW2
-nM3
-return
-true;}
-n73<i02
-extent,i02
-nbits,typename
-cS2=i02
-int>e92
-nbitmap{private:static
-const
-i02
-bits_in_char=8;static
-const
-i02
-cT2=(xK3
-cS2)*bits_in_char)/nbits;cS2
-data[(extent+cT2-1)/cT2];e13
-void
-inc(lC1,int
-by=1){data[pos(index)]+=by*cS2(1<<xX2);i6
-void
-dec(lC1){inc(index,-1);}
-int
-get(lC1
-n61(data[pos(index)]>>xX2)&mask()xJ2
-pos(lC1){return
-index/cT2
-xJ2
-shift(lC1){return
-nbits*(index%cT2)xJ2
-mask(){return(1<<nbits)-1
-xJ2
-mask(lC1){return
-mask()<<xX2;}
-}
-;e92
-c83{int
-SubTrees:8;int
-Others:8;int
-i31:8;int
-cG3:8;nbitmap<iE2,2>SubTreesDetail;c83(){std::memset(this,0,xK3*this));}
-c83
-i01
-c83&b){std::memcpy(this,&b,xK3
-b));}
-c83&e31=i01
-c83&b){std::memcpy(this,&b,xK3
-b))l81*this;}
-}
-;yV1
-c83
-CreateNeedList_uncached(t0&cB2){c83
-x11
-xS3
-a=0;a<cB2
-xY2;++a){const
-cG2&lF3=e01
-x8(cB2.param_list,a);xT3
-lZ2
-const
-xI&t82
-xI*x01;yZ
-GroupFunction)++tA3;else{++tA2;assert(param.data.subfunc_opcode<VarBegin);x11.SubTreesDetail.inc
-iZ2
-cS);}
-++x11.i31;nM3
-case
-NumConstant:case
-ParamHolder:++t92;++x11.i31;nM3}
-return
-x11;}
-yV1
-c83&CreateNeedList(t0&cB2){typedef
-std::map<t0*,c83>cX1;static
-cX1
-yO1;cX1::nX3
-i=yO1.xE2&cB2);if(i!=yO1.cP1&cB2
-nZ2
-i
-cJ2
-l81
-yO1.nT3,std::make_pair(&cB2,CreateNeedList_uncached
-x8(cB2)))cJ2;}
-yV1
-yK2
-CalculateGroupFunction
-i01
-cG2&xZ2
-const
-t9
-info){xT3
-NumConstant:{const
-eZ&t82
-eZ*x01
-l81
-CodeTreeImmed
-iZ2
-xZ3)cM3
-lY2
-yK3&t82
-xH*x01
-l81
-info.GetParamHolderValueIfFound
-iZ2
-index)iD2
-const
-xI&t82
-xI*x01
-yJ
-result;result
-tU
-xF3
-cS);tC1
-iE1).reserve
-iZ2
-data
-xY2)xS3
-a=0;a<xF3
-data
-xY2;++a)nG1
-tmp(CalculateGroupFunction(e01
-x8
-iZ2
-data.param_list,a),info));result
-yA
-tmp);}
-tC1
-Rehash()l81
-result;}
-}
-return
-yK2();}
-}
-iO2
-FPoptimizer_Optimize{xG1
-IsLogisticallyPlausibleParamsMatch(t0&cB2,const
-eR{c83
-x11(CreateNeedList
-x8(cB2));size_t
-eR3=iT;if(eR3<size_t(x11.i31)){nX2
-for
-xK2
-0;a<eR3;++a){i02
-opcode=xI2
-nE;switch(opcode
-iY2
-cImmed:if(tA3>0)--tA3;else--t92;lC
-iE2:case
-cFCall:case
-cPCall:--t92;break;default:assert(opcode<VarBegin);if(tA2>0&&x11.SubTreesDetail.get(opcode)>0){--tA2;x11.SubTreesDetail.dec(opcode);}
-else--t92;}
-}
-if(tA3>0||tA2>0||t92>0){nX2
-if(cB2.match_type!=AnyParams){if(0||tA2<0||t92<0){nX2}
-return
-true;}
-yV1
-lZ1
-TestParam
-i01
-cG2&xZ2
-lM1&tree
-eA2
-start_at,t9
-info){xT3
-NumConstant:{const
-eZ&t82
-eZ*x01;if(!cW2
-eS1
-imm=yZ3;switch
-iZ2
-modulo
-iY2
-Modulo_None:lC
-Modulo_Radians:imm=fp_mod(imm,y8
-imm<0)imm
-c5
-if(imm>fp_const_pi
-x8())imm-=fp_const_twopi
-x8(nW2
-return
-fp_equal(imm,xF3
-xZ3)cM3
-lY2
-yK3&t82
-xH*x01;if(!x0
-return
-info.SaveOrTestParamHolder
-iZ2
-index,tree)iD2
-const
-xI&t82
-xI*x01;yZ
-GroupFunction){if(!x0
-yK2
-xO1=CalculateGroupFunction(xZ2
-info);
-#ifdef DEBUG_SUBSTITUTIONS
-DumpHashes(xO1)lN1*i01
-void**)&xO1.xJ1
-lN1"\n"
-lN1*i01
-void**)&yZ3
-lN1"\n"
-;DumpHashes(tree)lN1"Comparing "
-;xE3(xO1)lN1" and "
-;xE3(tree)lN1": "
-lN1(xO1
-iA
-tree)?"true"
-:"false"
-)lN1"\n"
-;
-#endif
-return
-xO1
-iA
-tree);}
-else{if(!&*start_at){if(!x0
-if
-xU2!=xF3
-cS
-yI}
-return
-TestParams
-iZ2
-data,tree,start_at,info,false);}
-}
-}
-nX2
-yT1
-iS
-x22
-MatchInfo
-x8
-info;iS()yC3,info(){}
-}
-;iP2
-MatchPositionSpec_PositionalParams:xP1
-iS
-x8>{e13
-iF2
-MatchPositionSpec_PositionalParams(xL3):xM3
-iS
-x8>(n){}
-}
-;e92
-i41
-x22
-i41()yC3{}
-}
-;class
-c0:xP1
-i41>{e13
-i02
-trypos;iF2
-c0(xL3):xM3
-i41>(n),trypos(0){}
-}
-;yV1
-lZ1
-TestParam_AnyWhere
-i01
-cG2&xZ2
-lM1&tree
-eA2
-start_at,t9
-info,yG<bool>&used,bool
-tA1{xN<c0>x6;i02
-lG3
-c0
-n92
-a=x6->trypos;goto
-retry_anywhere_2
-x42
-c0(iT);a=0;}
-eS3
-iT;++a){if(used[a])y81
-retry_anywhere:{lZ1
-r=TestParam(xZ2
-xI2
-lH3);lI3
-used[a]=true;if(tA1
-eT3
-a);x6->trypos=a
-l81
-lZ1(true,&*x6);}
-}
-retry_anywhere_2:if(&*lV1){goto
-retry_anywhere;}
-}
-nX2
-yT1
-y91
-x22
-MatchInfo
-x8
-info;yG<bool>used;iF2
-y91(size_t
-eR3)yC3,info(),used(eR3){}
-}
-;iP2
-MatchPositionSpec_AnyParams:xP1
-y91
-x8>{e13
-iF2
-MatchPositionSpec_AnyParams(xL3,size_t
-m):xM3
-y91
-x8>(n,y91
-x8(m)){}
-}
-;yV1
-lZ1
-TestParams(t0&nM,lM1&tree
-eA2
-start_at,t9
-info,bool
-tA1{if(nM.match_type!=AnyParams){if(xT!=iT
-yI}
-if(!IsLogisticallyPlausibleParamsMatch(nM
-n72{nX2
-switch(nM.match_type
-iY2
-PositionalParams:{xN<cL>x6;i02
-lG3
-cL
-n92
-a=xT-1;goto
-lD1
-x42
-cL(xT);a=0;}
-eS3
-xT;++a){cX2=info;retry_positionalparams:{lZ1
-r=TestParam(cX
-a),xI2
-lH3);lI3
-y81}
-}
-lD1:if(&*lV1){info=cX2;goto
-retry_positionalparams;}
-if(a>0){--a;goto
-lD1;}
-info=(*x6)[0].info
-l81
-false;}
-if(tA1
-for
-iL1
-a=0;a<xT;++a)eT3
-a)l81
-lZ1(true,&*x6)cM3
-SelectedParams:case
-AnyParams:{xN<t6>x6;yG<bool>used(iT);yG<i02>iG2(xT);yG<i02>y02(xT)lO1{const
-cG2
-lF3=cX
-a);iG2[a]=ParamSpec_GetDepCode(lF3);}
-{i02
-b=0
-lO1
-if(iG2[a]!=0)y02[b++]=a
-lO1
-if(iG2[a]==0)y02[b++]=a;}
-i02
-lG3
-t6
-n92
-if(xT==0){a=0;goto
-retry_anyparams_4;}
-a=xT-1;goto
-cY1
-x42
-t6(xT,iT);a=0;if(xT!=0){(*x6)[0].info=info;(*x6)[0].used=used;}
-}
-eS3
-xT;++a){if(a>0){cX2=info;(*x6)[a].used=used;}
-retry_anyparams:{lZ1
-r=TestParam_AnyWhere
-x8(cX
-y02[a]),tree
-lH3,used,tA1;lI3
-y81}
-}
-cY1:if(&*lV1){info=cX2;used=(*x6)[a].used;goto
-retry_anyparams;}
-cZ1:if(a>0){--a;goto
-cY1;}
-info=(*x6)[0].info
-l81
-false;}
-retry_anyparams_4:if(nM.n2!=0){if(!TopLevel||!info.HasRestHolder(nM.n2)){yG
-nV1
-yS2;yS2.nH3
-iT)xS3
-b=0;b<iT;++b){if(xN3)y81
-yS2
-yL
-tree
-lD
-b));xN3=true;if(tA1
-eT3
-b);}
-if(!info.SaveOrTestRestHolder(nM.n2,yS2)){goto
-cZ1;}
-}
-else{lL1&yS2=info.GetRestHolderValues(nM.n2)c23
-0;a<yS2
-eW2
-a){bool
-found=false
-xS3
-b=0;b<iT;++b){if(xN3)y81
-if(yS2[a]iA
-tree
-lD
-b))){xN3=true;if(tA1
-eT3
-b);found=true;nM3}
-if(!found){goto
-cZ1;}
-}
-}
-}
-return
-lZ1(true,xT?&*x6:0)cM3
-GroupFunction:nM3
-nX2}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <algorithm>
-#include <assert.h>
-using
-iO2
-FPoptimizer_CodeTree;using
-iO2
-FPoptimizer_Optimize;iO2{yV1
-yK2
-xQ1
-const
-cG2&xZ2
-t9
-info,bool
-inner=true){xT3
-NumConstant:{const
-eZ&t82
-eZ*x01
-l81
-CodeTreeImmed
-iZ2
-xZ3)cM3
-lY2
-yK3&t82
-xH*x01
-l81
-info.GetParamHolderValue
-iZ2
-index)iD2
-const
-xI&t82
-xI*x01
-yJ
-tree;tH
-xF3
-cS)xS3
-a=0;a<xF3
-data
-xY2;++a)nG1
-nparam=xQ1
-e01
-x8
-iZ2
-data.param_list,a),info,true
-tT
-yA
-nparam);}
-if
-iZ2
-data.n2!=0){yG
-nV1
-trees(info.GetRestHolderValues
-iZ2
-data.n2)tT.AddParamsMove(trees);if(iT==1){assert(tree.tU3()==cAdd tI3()==cMul tI3()==cMin tI3()==cMax tI3()==cAnd tI3()==cOr tI3()==cAbsAnd tI3()==cAbsOr);tree.xO2
-0));}
-tP1
-iT==0){switch
-xU2
-iY2
-cAdd:case
-cOr:tree=nB1
-0));lC
-cMul:case
-cAnd:tree=nB1
-1));default:nM3}
-}
-if(inner)tree
-x02
-l81
-tree;}
-}
-return
-yK2();}
-}
-iO2
-FPoptimizer_Optimize{xB1
-SynthesizeRule
-eX3
-yK2&tree,t9
-info){switch(rule.ruletype
-iY2
-ProduceNewTree:{tree.Become(xQ1
-e01
-x21
-0),info,false)nW2
-case
-ReplaceParams:default:{yG<i02>list=info.GetMatchedParamIndexes();std::sort(list.i62
-list.end())c23
-list
-yA3;a-->0;)tree.iH1
-list[a])xS3
-a=0;a<rule.repl_param_count;++a)nG1
-nparam=xQ1
-e01
-x21
-a),info,true
-tT
-yA
-nparam);}
-nM3}
-}
-}
-#endif
-#ifdef DEBUG_SUBSTITUTIONS
-#include <sstream>
-#include <cstring>
-xQ
-using
-iO2
-l41;using
-iO2
-FPoptimizer_CodeTree;using
-iO2
-FPoptimizer_Optimize;iO2
-l41{xB1
-DumpMatch
-eX3
-lM1&tree,const
-t9
-info,bool
-DidMatch,std::ostream&o){DumpMatch
-t81,DidMatch?tZ3"match"
-:tZ3"mismatch"
-,o);}
-xB1
-DumpMatch
-eX3
-lM1&tree,const
-t9
-info,const
-char*eY3,std::ostream&o){static
-const
-char
-ParamHolderNames[][2]={"%"
-,"&"
-,"x"
-,"y"
-,"z"
-,"a"
-,"b"
-,"c"
-}
-;o<<eY3<<" (rule "
-<<(&rule-grammar_rules)<<")"
-<<":\n Pattern : "
-;{cG2
-tmp;tmp.first=SubFunction;xI
-tmp2;tmp2.data=rule
-nT2;tmp
-eE3=i01
-void*)&tmp2;DumpParam
-x8(tmp,o);}
-o<<"\n Replacement: "
-;DumpParams
-x21
-rule.repl_param_count,o);o<<"\n"
-;o<<" Tree : "
-;xE3(tree,o);o<<"\n"
-;if(!std::strcmp(eY3,tZ3"match"
-))DumpHashes(tree,o)c23
-0;a<i33
-eW2
-a){if(!i33[a].iA1
-y81
-o<<" "
-<<ParamHolderNames[a]<<" = "
-;xE3(i33[a],o);o<<"\n"
-;}
-eW3
-info.lQ
-eW2
-b){if(!eH2
-first)y81
-for
-xK2
-0;a<eH2
-second
-eW2
-a){o<<" <"
-<<b<<"> = "
-;xE3(eH2
-second[a],o);o<<std::endl;}
-}
-o<<std::flush;}
-}
-#endif
-#include <list>
-#include <algorithm>
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-iO2{xG1
-MarkIncompletes(x2){if(tree.Is_Incompletely_Hashed(iF1;bool
-i51
-i13
-for
-yS
-i51|=MarkIncompletes
-nW1
-a));if(i51)tree.Mark_Incompletely_Hashed()l81
-i51;}
-xB1
-FixIncompletes(x2){if(tree.Is_Incompletely_Hashed()){for
-yS
-FixIncompletes
-nW1
-a)tT
-x02;}
-}
-}
-iO2
-FPoptimizer_CodeTree{lA
-Sort()cX3
-Sort();}
-lA
-Rehash(bool
-constantfolding){if(constantfolding)ConstantFolding(*this);else
-Sort();data
-xB
-yV1
-l11{c2
-e62
-eZ3
-nP3=0;
-#if 0
-long
-double
-value=Value;eB=crc32::calc(i01
-i02
-char*)&value,xK3
-value));key^=(key<<24);
-#elif 0
-union{e92{i02
-char
-filler1[16];eS1
-v;i02
-char
-filler2[16];}
-buf2;e92{i02
-char
-filler3[xK3
-eS1)+16-x
-K3
-iC1)];eB;}
-buf1;}
-data;memset(&data,0,xK3
-data));data.buf2.v=Value;eB=data.buf1.key;
-#else
-int
-cE2;eS1
-lQ2=std::frexp(Value,&cE2);eB=iL1(cE2+0x8000)&0xFFFF);if(lQ2<0){lQ2=-lQ2;key=key^0xFFFF;}
-else
-key+=0x10000;lQ2-=yF3;key<<=39;key|=iC1((lQ2+lQ2)*eS1(1u<<31))<<8;
-#endif
-iU
-tM
-#ifdef FP_SUPPORT_LONG_INT_TYPE
-n73<>l11<long>{c2
-long
-eZ3
-eB=Value;iU
-tM
-#endif
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-n73<>l11<GmpInt>{c2
-const
-GmpInt&eZ3
-eB=Value.toInt();iU
-tM
-#endif
-xB1
-nO2
-x8::Recalculate_Hash_NoRecursion(){fphash_t
-iU(iC1(Opcode)<<56,Opcode*tM3(0x1131462E270012B));Depth=1;switch(Opcode
-iY2
-cImmed:{ImmedHashGenerator
-x8::MakeHash(iU,Value
-nW2
-case
-iE2:{nP3|=eC<<48
-eC2((eC)*11)^tM3(0x3A83A83A83A83A0);nM3
-case
-cFCall:case
-cPCall:{nP3|=eC<<48
-eC2((~eC)*7)^3456789;}
-default:{size_t
-eM1=0
-c23
-0;a<c93
-eW2
-a){if(c93[a].xT2>eM1)eM1=c93[a].xT2;nP3+=((c93[a]eE2
-hash1*(a+1))>>12)eC2
-c93[a]eE2
-hash1
-eC2(3)*tM3(0x9ABCD801357);iU.hash2*=tM3(0xECADB912345)eC2(~c93[a]eE2
-hash2)^4567890;}
-Depth+=eM1;}
-}
-if(Hash!=iU){Hash=iU;iK1=0;}
-}
-lA
-FixIncompleteHashes(){MarkIncompletes(*this);FixIncompletes(*this);}
-}
-#endif
-#include <cmath>
-#include <list>
-#include <cassert>
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-iO2{using
-iO2
-FPoptimizer_CodeTree;xG1
-x31
-lM1&tree,long
-count,const
-yV2
-SequenceOpCode
-x8&eQ,yW2&synth,size_t
-max_bytecode_grow_length);static
-const
-e92
-SinCosTanDataType{OPCODE
-whichopcode;OPCODE
-inverse_opcode;enum{nominator,denominator,inverse_nominator,inverse_denominator}
-;OPCODE
-codes[4];}
-SinCosTanData[12]={{cTan,cCot,{cSin,cCos,cCsc,cSec}
-}
-,{cCot,cCot,{cCos,cSin,cSec,cCsc}
-}
-,{cCos,cSec,{cSin,cTan,cCsc,cCot}
-}
-,{cSec,cCos,{cTan,cSin,cCot,cCsc}
-}
-,{cSin,cCsc,{cCos,cCot,cSec,cTan}
-}
-,{cCsc,cSin,{cCot,cCos,cTan,cSec}
-}
-,{yT2{cSinh,cH3
-yY2,{cSinh,cNop,{yT2
-cNop,cCosh}
-}
-,{cH3
-cNop,{cSinh,yT2
-cNop}
-}
-,{cNop,cTanh,{cH3
-cSinh,yY2,{cNop,cSinh,{cNop,cTanh,cH3
-cNop}
-}
-,{cNop,cH3{cTanh,cSinh,yY2}
-;}
-iO2
-FPoptimizer_CodeTree{lA
-SynthesizeByteCode(yG<i02>&nN,yG
-x8&Immed,size_t&stacktop_max){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Making bytecode for:\n"
-;iO
-#endif
-while(RecreateInversionsAndNegations()){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"One change issued, produced:\n"
-;iO
-#endif
-FixIncompleteHashes();}
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Actually synthesizing, after recreating inv/neg:\n"
-;iO
-#endif
-yW2
-synth;SynthesizeByteCode(synth,false
-eU3.Pull(nN,Immed,stacktop_max);}
-lA
-SynthesizeByteCode(yW2&synth,bool
-MustPopTemps)const{xR1*this)){return;}
-for
-xK2
-0;a<12;++a){const
-SinCosTanDataType&data=SinCosTanData[a];if(data.whichopcode!=cNop){if(lM2!=data.whichopcode)y81
-yL2
-lJ3;lJ3.lI1
-lJ3
-tU
-data.inverse_opcode);lJ3.y12);xR1
-lJ3)){synth.l21
-else{if(lM2!=cInv)y81
-if(GetParam(0)nE!=data.inverse_opcode)y81
-xR1
-GetParam(0))){synth.l21
-size_t
-found[4];eW3
-4;++b){yL2
-tree;if(data.t03]==cNop){tH
-cInv);yL2
-lK3;lK3.lI1
-lK3
-tU
-data.t03^2]);lK3.y12
-tT
-yA
-lK3);}
-else{tree.lI1
-tH
-data.t03]);}
-tree.y12);found[b]t13
-e33(tree);}
-if(found[data.y22!=tG
-i61
-yK
-y22);lJ1
-i61);lK1
-cDiv
-nL1
-y22!=tG
-iV
-yK
-y22);lJ1
-iV);lK1
-cMul
-nL1
-lS1!=tG
-iV
-yK
-lS1);lJ1
-iV);lK1
-cRDiv
-nL1
-lS1!=tG
-i61
-yK
-lS1);lJ1
-i61);lK1
-cMul,2,1
-eU3.l21
-size_t
-n_subexpressions_synthesized=SynthCommonSubExpressions(synth);switch(lM2
-iY2
-iE2:synth.PushVar(GetVar());lC
-cImmed:yX2
-xJ1);lC
-cAdd:case
-cMul:case
-cMin:case
-cMax:case
-cAnd:case
-cOr:case
-cAbsAnd:case
-cAbsOr:{if(lM2==cMul){bool
-xU3
-i13
-c3
-lT1
-y21&&isLongInteger(lT1.xJ1)){yW1=makeLongInteger(lT1.xJ1);yL2
-tmp(*this,typename
-yL2::CloneTag());tmp
-cP3
-tmp
-x02;if(x31
-tmp,value,yV2
-eX1
-x8::AddSequence,synth,MAX_MULI_BYTECODE_LENGTH)){xU3=true;nM3}
-}
-if(xU3)nM3
-int
-yA1=0;yG<bool>done(GetParamCount(),false);yL2
-iE;iE
-tU
-lM2);for(;;){bool
-found
-i13
-c3
-done[a])y81
-if(synth.IsStackTop(lT1)){found=true;done[a]=true;lT1.nB
-iE
-eT
-lT1);if(++yA1>1){synth
-c4
-2);iE.y12
-eU3.yZ2
-iE);yA1=yA1-2+1;}
-}
-}
-if(!found)nM3
-c3
-done[a])y81
-lT1.nB
-iE
-eT
-lT1);if(++yA1>1){synth
-c4
-2);iE.y12
-eU3.yZ2
-iE);yA1=yA1-2+1;}
-}
-if(yA1==0){switch(lM2
-iY2
-cAdd:case
-cOr:case
-cAbsOr:yX2
-0);lC
-cMul:case
-cAnd:case
-cAbsAnd:yX2
-1);lC
-cMin:case
-cMax:yX2
-0);break;default:nM3++yA1;}
-assert(n_stacked==1);nM3
-case
-cPow:{iQ2
-p0
-tW2
-0);iQ2
-p1
-tW2
-1);if(!p1
-y21||!isLongInteger
-n03)||!x31
-p0,makeLongInteger
-n03),yV2
-eX1
-x8::MulSequence,synth,MAX_POWI_BYTECODE_LENGTH)){p0.nB
-p1
-t33
-c4
-2);c91
-cIf:case
-i03:{typename
-yW2::IfData
-yJ2;GetParam(0)t33.SynthIfStep1(yJ2,lM2);GetParam(1)t33.SynthIfStep2(yJ2);GetParam(2)t33.SynthIfStep3(yJ2
-nW2
-case
-cFCall:case
-cPCall:{for
-xK2
-0;a<cN3++a)lT1
-t33
-c4
-iL1)GetParamCount());lK1
-yM|GetFuncNo(),0,0
-nW2
-default:{for
-xK2
-0;a<cN3++a)lT1
-t33
-c4
-iL1)GetParamCount()nW2}
-synth.yZ2*this);if(MustPopTemps&&n_subexpressions_synthesized>0){size_t
-top
-t13
-GetStackTop(eU3.DoPopNMov(top-1-n_subexpressions_synthesized,top-1);}
-}
-}
-iO2{xG1
-x31
-lM1&tree,long
-count,const
-yV2
-SequenceOpCode
-x8&eQ,yW2&synth,size_t
-max_bytecode_grow_length){if
-cR3!=0){yW2
-backup=synth;tree.nB
-size_t
-bytecodesize_backup
-t13
-GetByteCodeSize();yV2
-x31
-count
-eR2
-size_t
-bytecode_grow_amount
-t13
-GetByteCodeSize()-bytecodesize_backup;if(bytecode_grow_amount>max_bytecode_grow_length){synth=backup
-l81
-false;}
-return
-true;}
-else{yV2
-x31
-count,eQ,synth)nS2}
-}
-#endif
-#include <cmath>
-#include <cassert>
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-iO2{using
-iO2
-FPoptimizer_CodeTree;
-#define FactorStack yG
-const
-e92
-PowiMuliType{i02
-opcode_square;i02
-opcode_cumulate;i02
-opcode_invert;i02
-opcode_half;i02
-opcode_invhalf;}
-iseq_powi={cSqr,cMul,cInv,cSqrt,cRSqrt}
-,iseq_muli={i21,cAdd,cNeg,i21,i21}
-;yB1
-cF1
-const
-PowiMuliType&xV3,const
-yG<i02>&nA2,l92&stack){eS1
-cY3
-1);while(IP<limit){if(xW3
-xV3.opcode_square){if(!eY2
-cZ3
-2;e4
-opcode_invert){result=-result;e4
-opcode_half){if(result>eS1(0)&&isEvenInteger(cZ3
-yF3;e4
-opcode_invhalf){if(result>eS1(0)&&isEvenInteger(cZ3
-eS1(-0.5);++IP;y81}
-size_t
-nB2=IP;eS1
-lhs(1);if(xW3
-cFetch){lC1=yL3;if(index<y1||size_t(index-y1)>=stack
-yA3){IP=nB2;nM3
-lhs=stack[index-y1];goto
-y32;}
-if(xW3
-cDup){lhs=result;goto
-y32;y32:y63
-result);++IP;eS1
-subexponent=cF1
-xV3
-lQ1
-if(IP>=limit||nN[IP]!=xV3.opcode_cumulate){IP=nB2;nM3++IP;stack.pop_back();result+=lhs*subexponent;y81}
-nM3
-return
-result;}
-yB1
-ParsePowiSequence
-i01
-yG<i02>&nA2){l92
-stack;y63
-eS1(1))l81
-cF1
-iseq_powi
-lQ1}
-yB1
-ParseMuliSequence
-i01
-yG<i02>&nA2){l92
-stack;y63
-eS1(1))l81
-cF1
-iseq_muli
-lQ1}
-iP2
-CodeTreeParserData{e13
-iF2
-CodeTreeParserData(bool
-k_powi):stack(),clones(),keep_powi(k_powi){}
-void
-Eat(size_t
-eR3,OPCODE
-opcode
-xX3;xK
-tU
-opcode);yG
-nV1
-cB2=Pop(eR3);xK
-tI1
-cB2);if(!keep_powi)switch(opcode
-iY2
-cTanh:nG1
-sinh,cosh;sinh
-tU
-cSinh);sinh
-eT
-xK
-xY3
-sinh
-x02;cosh
-tU
-cCosh);cosh
-yA
-xK
-xY3
-cosh
-i72
-pow
-yB2
-yA
-cosh);pow
-yT
-eS1(-1)));pow
-x02;xK
-tU
-y13.nC1
-0,sinh);xK
-yA
-pow
-nW2
-case
-cTan:nG1
-sin,cos;sin
-tU
-cSin);sin
-eT
-xK
-xY3
-sin
-x02;cos
-tU
-cCos);cos
-yA
-xK
-xY3
-cos
-i72
-pow
-yB2
-yA
-cos);pow
-yT
-eS1(-1)));pow
-x02;xK
-tU
-y13.nC1
-0,sin);xK
-yA
-pow
-nW2
-case
-cPow:{lM1&p0=xK
-lD
-0);lM1&p1=xK
-lD
-1);if(p1
-nE==cAdd){yG
-nV1
-n83(p1.GetParamCount())c23
-0;a<p1.cN3++a)nG1
-pow
-yB2
-eT
-p0);pow
-eT
-p1
-lD
-a));pow
-x02;n83[a
-t23
-pow);}
-xK
-tU
-y13
-tI1
-n83);}
-nM3
-default:nM3
-xK.Rehash(!keep_powi);i71,false);
-#ifdef DEBUG_SUBSTITUTIONS
-lC2<<eR3<<", "
-<<FP_GetOpcodeName(opcode)<<"->"
-<<FP_GetOpcodeName(xK
-nE)<<": "
-tP3
-xK)tW
-xK);
-#endif
-y63
-xK
-iR2
-EatFunc(size_t
-eR3,OPCODE
-opcode,i02
-funcno
-xX3=CodeTreeFuncOp
-x8(opcode,funcno);yG
-nV1
-cB2=Pop(eR3);xK
-tI1
-cB2);xK.y12);
-#ifdef DEBUG_SUBSTITUTIONS
-lC2<<eR3<<", "
-tP3
-xK)tW
-xK);
-#endif
-i71);y63
-xK
-iR2
-AddConst(yF1
-xX3=CodeTreeImmed(value);i71);Push(xK
-iR2
-AddVar
-iL1
-varno
-xX3=CodeTreeVar
-x8(varno);i71);Push(xK
-iR2
-SwapLastTwoInStack(){y73
-1
-t23
-y73
-2]iR2
-Dup(){Fetch
-lB2
-1
-iR2
-Fetch(size_t
-which){Push(stack[which]);}
-nT1
-T>void
-Push(T
-tree){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<tP3
-tree)tW
-tree);
-#endif
-y63
-tree
-iR2
-PopNMov(size_t
-target,size_t
-source){stack[target]=stack[source];stack
-nE3
-target+1);}
-yK2
-y42{clones.clear()yJ
-cY3
-stack.back());stack.resize
-lB2
-1)l81
-result;}
-yG
-nV1
-Pop(size_t
-n_pop){yG
-nV1
-cY3
-n_pop)xS3
-n=0;n<n_pop;++n)result[n
-t23
-y73
-n_pop+n]);
-#ifdef DEBUG_SUBSTITUTIONS
-for(xL3=n_pop;n-->0;){lC2;xE3(result[n])tW
-result[n]);}
-#endif
-stack.resize
-lB2
-n_pop)l81
-result;}
-size_t
-GetStackTop(n61
-stack
-yA3;}
-private:void
-FindClone(yK2&,bool=true){return;}
-private:yG
-nV1
-stack;std::multimap<fphash_t,yK2>clones;bool
-keep_powi;private:CodeTreeParserData
-i01
-CodeTreeParserData&);CodeTreeParserData&e31=i01
-CodeTreeParserData&);}
-;yT1
-IfInfo
-nG1
-cU2
-yJ
-thenbranch;size_t
-endif_location;IfInfo():cU2(),thenbranch(),endif_location(){}
-}
-;}
-iO2
-FPoptimizer_CodeTree{lA
-GenerateFrom
-i01
-yG<i02>&nN,const
-yG
-x8&Immed,const
-typename
-FunctionParserBase
-x8::Data&cJ3,bool
-keep_powi){yG
-nV1
-nK2;nK2.nH3
-cJ3.mVariablesAmount)xS3
-n=0;n<cJ3.mVariablesAmount;++n){nK2
-yL
-CodeTreeVar
-x8(n+iE2));}
-GenerateFrom(nN,Immed,cJ3,nK2,keep_powi);}
-lA
-GenerateFrom
-i01
-yG<i02>&nN,const
-yG
-x8&Immed,const
-typename
-FunctionParserBase
-x8::Data&cJ3,const
-i22
-nK2,bool
-keep_powi){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"ENTERS GenerateFrom()\n"
-;
-#endif
-CodeTreeParserData
-x8
-sim(keep_powi);yG<IfInfo
-x8>eN;for(size_t
-IP=0,DP=0;;++IP){tO2:while(!eN
-cQ3&&(eN.eD==IP||(IP<nN
-yA3&&xW3
-cJump&&eN.e11.iA1)){yL2
-elsebranch=sim.y42
-yG3
-eN.back().cU2)yG3
-eN.e11)yG3
-elsebranch);iJ
-3,cIf);eN.pop_back();}
-if(IP>=nN
-yA3)break;i02
-opcode=nN[IP];if((opcode==cSqr||opcode==cDup||(opcode==cInv&&!IsIntType
-x8::result)||opcode==cNeg||opcode==cSqrt||opcode==cRSqrt||opcode==cFetch)){size_t
-was_ip=IP;eS1
-cE2=ParsePowiSequence
-x8(nN,IP,eN
-cQ3?nN
-yA3:eN.eD,sim.x5
-1);if(cE2!=1.0){x9
-cE2)yJ3;goto
-tO2;}
-if(opcode==cDup||opcode==cFetch||opcode==cNeg){eS1
-xD2=ParseMuliSequence
-x8(nN,IP,eN
-cQ3?nN
-yA3:eN.eD,sim.x5
-1);if(xD2!=1.0){x9
-xD2)yE
-cMul);goto
-tO2;}
-}
-IP=was_ip;}
-if(lD2>=iE2){sim.Push(nK2[opcode-iE2]);}
-else{switch(lD2
-iY2
-cIf:case
-i03:{eN
-nE3
-eN
-yA3+1);yL2
-res(sim.y42);eN.back().cU2.swap(res);eN.eD=nN
-yA3;IP+=2;y81}
-case
-cJump:{yL2
-res(sim.y42);eN.e11.swap(res);eN.eD=nN[IP+1]+1;IP+=2;y81}
-case
-cImmed:x9
-Immed[DP++]);lC
-cDup:sim.Dup();lC
-cNop:lC
-cFCall:{i02
-funcno=yL3;assert(funcno<fpdata.mFuncPtrs.size());i02
-cB2=cJ3.mFuncPtrs
-yD3
-mParams;sim.EatFunc(cB2,lD2,funcno
-nW2
-case
-cPCall:{i02
-funcno=yL3;assert(funcno<fpdata.tQ3.size());const
-FunctionParserBase
-x8&p=*cJ3.tQ3
-yD3
-mParserPtr;i02
-cB2=cJ3.tQ3
-yD3
-mParams;yG<yL2>paramlist=sim.Pop(cB2);yL2
-tP2;tP2.GenerateFrom(p.mData->mByteCode,p.mData->mImmed,*p.mData,paramlist)yG3
-tP2
-nW2
-case
-cInv:x9
-1
-nY2
-cDiv);lC
-cNeg:yE3
-cNeg);break;x9
-0
-nY2
-cSub);lC
-cSqr:x9
-2
-e21
-cSqrt:x9
-yF3
-e21
-cRSqrt:x9
-eS1(-0.5)e21
-cCbrt:x9
-eS1(1)/eS1(3)e21
-cDeg:x9
-fp_const_rad_to_deg
-x8
-cI1
-cRad:x9
-fp_const_deg_to_rad
-x8
-cI1
-cExp:iF)goto
-yI3;x9
-fp_const_e
-x8()nY2
-cPow);lC
-cExp2:iF)goto
-yI3;x9
-2.0
-nY2
-cPow);lC
-cCot:yE3
-cTan);iF)nY
-cCsc:yE3
-cSin);iF)nY
-cSec:yE3
-cCos);iF)nY
-cInt:
-#ifndef __x86_64
-iF){yE3
-cInt
-nW2
-#endif
-x9
-yF3)lL3
-yE3
-cFloor);lC
-cLog10:yE3
-yH3
-fp_const_log10inv
-x8
-cI1
-cLog2:yE3
-yH3
-fp_const_log2inv
-x8
-cI1
-cLog2by:cK3
-yE3
-yH3
-fp_const_log2inv
-x8());iJ
-3,cMul);lC
-cHypot:x9
-2)yJ3;cK3
-x9
-2)yJ3
-lL3
-x9
-yF3
-e21
-cSinCos:sim.Dup();yE3
-cSin);cK3
-yE3
-cCos);lC
-cRSub:cK3
-case
-cSub:iF){iJ
-2,cSub
-nW2
-x9-1)yE
-cMul)lL3
-lC
-cRDiv:cK3
-case
-cDiv:iF||IsIntType
-x8::result){iJ
-2,cDiv
-nW2
-x9-1)yJ3
-yE
-cMul);lC
-cAdd:case
-cMul:case
-cMod:case
-cPow:case
-cEqual:case
-cLess:case
-cGreater:case
-t71:case
-cLessOrEq:case
-cGreaterOrEq:case
-cAnd:case
-cOr:case
-cAbsAnd:case
-cAbsOr:iJ
-2,xS1
-lC
-cNot:case
-cNotNot:case
-yR3:case
-cAbsNotNot:yE3
-xS1
-lC
-cFetch:sim.Fetch(yL3);lC
-cPopNMov:{i02
-stackOffs_target=yL3;i02
-stackOffs_source=yL3;sim.PopNMov(stackOffs_target,stackOffs_source
-nW2
-#ifndef FP_DISABLE_EVAL
-case
-cEval:{size_t
-paramcount=cJ3.mVariablesAmount;iJ
-paramcount,xS1
-nM3
-#endif
-default:yI3:;i02
-funcno=opcode-cAbs;assert(funcno<FUNC_AMOUNT);const
-FuncDefinition&func=Functions[funcno];iJ
-func.cB2,xS1
-nM3}
-}
-Become(sim.y42);
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Produced tree:\n"
-;iO
-#endif
-}
-}
-#endif
-#include <algorithm>
-#ifdef FP_SUPPORT_OPTIMIZER
-#include <assert.h>
-#define FP_MUL_COMBINE_EXPONENTS
-iO2{xQ
-using
-iO2
-FPoptimizer_CodeTree;yV1
-static
-void
-AdoptChildrenWithSameOpcode(eR{
-#ifdef DEBUG_SUBSTITUTIONS
-bool
-lR2
-i13
-#endif
-for
-xU
-if
-nW1
-a)nE==tree
-nE){
-#ifdef DEBUG_SUBSTITUTIONS
-if(!lR2){std::cout<<"Before assimilation: "
-eS
-lR2=true;}
-#endif
-tree.AddParamsMove
-nW1
-a).GetUniqueRef().iE1),a);}
-#ifdef DEBUG_SUBSTITUTIONS
-if(lR2){std::cout<<"After assimilation: "
-eS}
-#endif
-}
-}
-iO2
-FPoptimizer_CodeTree{xB1
-ConstantFolding(eR{tree.Sort();
-#ifdef DEBUG_SUBSTITUTIONS
-void*yM3=0
-lN1"["
-<<(&yM3)<<"]Runs ConstantFolding for: "
-eS
-DumpHashes(tree);
-#endif
-if(false){redo:;tree.Sort();
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"["
-<<(&yM3)<<"]Re-runs ConstantFolding: "
-eS
-DumpHashes(tree);
-#endif
-}
-if
-xU2!=cImmed){range
-x8
-p=iM
-tree);if(p
-y41
-p
-i0&&p.min==p.max)lL
-p.min)n5}
-if(false){ReplaceTreeWithOne
-xP3
-ReplaceWithImmed(eS1(1));goto
-do_return;ReplaceTreeWithZero
-xP3
-ReplaceWithImmed(eS1(0));goto
-do_return;ReplaceTreeWithParam0:
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Before replace: "
-lN1
-std::hex<<'['<<tree
-eE2
-hash1<<','<<tree
-eE2
-hash2<<']'<<std::dec
-eS
-#endif
-tree.xO2
-0));
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"After replace: "
-lN1
-std::hex<<'['<<tree
-eE2
-hash1<<','<<tree
-eE2
-hash2<<']'<<std::dec
-eS
-#endif
-e5
-yN3
-xU2
-iY2
-cImmed:lC
-iE2:lC
-cAnd:case
-cAbsAnd
-cP
-bool
-cE
-i13
-for
-xU{if(!y93
-a)))cE=true;yQ3
-a),cV2
-cAbsAnd)iY2
-yO3:yP3
-IsAlways:nF1);lC
-lX1
-yN3(iT
-iY2
-0
-tY
-1:tH
-cV2
-cAnd?cNotNot:cAbsNotNot);e5
-default:if
-xU2==cAnd||!cE)if(ConstantFolding_AndLogic
-y83
-c91
-cOr:case
-cAbsOr
-cP
-bool
-cE
-i13
-for
-xU{if(!y93
-a)))cE=true;yQ3
-a),cV2
-cAbsOr)iY2
-IsAlways
-tY
-yO3:nF1);lC
-lX1
-yN3(iT
-iY2
-0:yP3
-1:tH
-cV2
-cOr?cNotNot:cAbsNotNot);e5
-default:if
-xU2==cOr||!cE)if(ConstantFolding_OrLogic
-y83
-c91
-cNot:case
-yR3:{i02
-n21
-0;switch
-nW1
-0)nE
-iY2
-cEqual:n21
-t71;lC
-t71:n21
-cEqual;lC
-cLess:n21
-cGreaterOrEq;lC
-cGreater:n21
-cLessOrEq;lC
-cLessOrEq:n21
-cGreater;lC
-cGreaterOrEq:n21
-cLess;lC
-cNotNot:n21
-cNot;lC
-cNot:n21
-cNotNot;lC
-yR3:n21
-cAbsNotNot;lC
-cAbsNotNot:n21
-yR3;break;default:nM3
-if(opposite){tH
-OPCODE(opposite)tT.SetParamsMove
-nW1
-0).GetUniqueRef().iE1));e5
-yN3(tX
-0),tree
-cG1)tF1
-yP3
-yO3
-tY
-lX1
-if
-xU2==cNot&&GetPositivityInfo
-nW1
-0))==IsAlways)tH
-yR3);l23
-nE==cIf||e72
-nE==i03)nG1
-iH2
-cL2
-0);lM1&ifp1=iH2
-lD
-1);lM1&ifp2=iH2
-lD
-2);if(ifp1
-nE==cNot||ifp1
-cG1{tree.x1
-ifp1
-nE==cNot?cNotNot:cAbsNotNot);tQ2
-lD
-0))yC1)yS3
-xQ2
-yT3)tV
-if(ifp2
-nE==cNot||ifp2
-cG1{tree.x1
-tree
-nE);tQ2)yC1)yS3
-tU
-ifp2
-nE==cNot?cNotNot:cAbsNotNot);yT3
-lD
-0))tV
-c91
-cNotNot:case
-cAbsNotNot:{if(y93
-0)))lN3
-yQ3
-0),cV2
-cAbsNotNot)iY2
-yO3:yP3
-IsAlways
-tY
-lX1
-if
-xU2==cNotNot&&GetPositivityInfo
-nW1
-0))==IsAlways)tH
-cAbsNotNot);l23
-nE==cIf||e72
-nE==i03)nG1
-iH2
-cL2
-0);lM1&ifp1=iH2
-lD
-1);lM1&ifp2=iH2
-lD
-2);if(ifp1
-nE==cNot||ifp1
-cG1{tree.SetParam(0,iH2
-lD
-0)tT
-eT
-ifp1)yS3
-xQ2
-yT3)tV
-if(ifp2
-nE==cNot||ifp2
-cG1{tree.x1
-tree
-nE);tQ2)yC1
-tT
-eT
-ifp2);tH
-iH2
-nE);e5}
-c91
-cIf:case
-i03:{if(ConstantFolding_IfOperations
-y83
-nM3
-case
-cMul:{NowWeAreMulGroup:;AdoptChildrenWithSameOpcode(tree);eS1
-nN1=eS1(1);size_t
-i81=0;bool
-nO1=false
-eV3
-if(!xI2
-y21)y81
-eS1
-immed=xI2.xJ1;if(immed==eS1(0))tZ
-nN1*=immed;++i81;}
-if(i81>1||(i81==1&&fp_equal(nN1,nY3)nO1=true;if(nO1){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"cMul: Will add new "
-tR3
-nN1<<"\n"
-;
-#endif
-for
-xU
-if
-nW1
-a)y21){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<" - For that, deleting "
-tR3
-xI2.xJ1
-lN1"\n"
-;
-#endif
-lM3!fp_equal(nN1,nY3
-tree
-eT
-cU1
-nN1));yN3(iT
-iY2
-0
-tY
-1:lN3
-default:if(ConstantFolding_MulGrouping
-y83
-if(ConstantFolding_MulLogicItems
-y83
-c91
-cAdd
-cP
-eS1
-lE2=0.0;size_t
-i81=0;bool
-nO1=false
-eV3
-if(!xI2
-y21)y81
-eS1
-immed=xI2.xJ1;lE2+=immed;++i81;}
-if(i81>1||(i81==1&&lE2==0.0))nO1=true;if(nO1){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"cAdd: Will add new "
-tR3
-lE2<<"\n"
-lN1"In: "
-eS
-#endif
-for
-xU
-if
-nW1
-a)y21){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<" - For that, deleting "
-tR3
-xI2.xJ1
-lN1"\n"
-;
-#endif
-lM3!(lE2==0.0))tree
-eT
-cU1
-lE2));yN3(iT
-iY2
-0:yP3
-1:lN3
-default:if(ConstantFolding_AddGrouping
-y83
-if(ConstantFolding_AddLogicItems
-y83
-c91
-cMin
-cP
-size_t
-y52=0;range
-x8
-e6
-eV3
-while(a+1<iT&&xI2
-iA
-tree
-lD
-a+1)))nF1+1);range<nI
-has_max&&(!e6
-i0||(p.max)<e6.max)){e6.max=p.max;e6
-i0=true;y52=a;}
-}
-if(e6
-i0)for
-xU{range<nI
-iV2&&a!=y52&&p.min>=e6.max)lM3
-iT==1){lN3
-c91
-cMax
-cP
-size_t
-y52=0;range
-x8
-t1
-eV3
-while(a+1<iT&&xI2
-iA
-tree
-lD
-a+1)))nF1+1);range<nI
-iV2&&(!t1.iV2||p.min>t1.min)){t1.min=p.min;t1.iV2=true;y52=a;}
-}
-if(t1.iV2){for
-xU{range<nI
-has_max&&a!=y52&&(p.max)<t1.min){nF1);}
-}
-}
-if(iT==1){lN3
-c91
-cEqual:case
-t71:case
-cLess:case
-cGreater:case
-cLessOrEq:case
-cGreaterOrEq:if(ConstantFolding_Comparison
-y83
-lC
-cAbs:{range
-x8
-p0=y6
-0));if(p0
-eN1
-lN3
-if(p0
-i0
-yU3
-tN{tH
-cMul
-tT
-yT
-nY3;goto
-NowWeAreMulGroup;}
-l23
-nE==cMul){lM1&p
-cL2
-0);yG
-nV1
-lO3;yG
-nV1
-c02
-c23
-0;a<p.cN3++a){p0=iM
-p
-lD
-a));if(p0
-eN1{lO3
-yL
-p
-lD
-a));}
-if(p0
-i0
-yU3
-tN{c02
-yL
-p
-lD
-a));}
-}
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"Abs: mul group has "
-<<lO3
-yA3<<" pos, "
-<<c02
-yA3<<"neg\n"
-;
-#endif
-if(!lO3
-cQ3||!c02
-cQ3){
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"AbsReplace-Before: "
-;xE3(tree)lN1"\n"
-<<std::flush;DumpHashes
-tJ1;
-#endif
-yK2
-cL3;cL3
-tU
-cMul)c23
-0;a<p.cN3++a){p0=iM
-p
-lD
-a));if((p0
-eN1||(p0
-i0
-yU3
-tN){}
-else
-cL3
-eT
-p
-lD
-a));}
-cL3
-i72
-lP3;lP3
-tU
-cAbs);lP3
-yA
-cL3);lP3
-i72
-xW1
-cMul);n83
-yA
-lP3);xX1
-AddParamsMove(lO3);if(!c02
-cQ3){if(c02
-yA3%2)n83
-yT
-eS1(-1)));xX1
-AddParamsMove(c02);}
-tree.Become(n83);
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"AbsReplace-After: "
-;xE3
-tJ1
-lN1"\n"
-<<std::flush;DumpHashes
-tJ1;
-#endif
-goto
-NowWeAreMulGroup;}
-}
-nM3
-#define HANDLE_UNARY_CONST_FUNC(funcname) lX)lL funcname(n6))n5
-case
-cLog:tH3(fp_log);l23
-nE==cPow)nG1
-pow
-cL2
-0);if(GetPositivityInfo(pow
-lD
-0))==IsAlways){pow
-lF2
-tI
-tree.lW
-if(GetEvennessInfo(pow
-x03==IsAlways){pow
-lF2
-yJ
-abs;abs
-tU
-cAbs);abs
-yA
-pow
-xY3
-abs
-x02
-tI
-pow.nC1
-0,abs
-tT.lW}
-else
-l23
-nE==cAbs)nG1
-pow
-cL2
-0)lD
-0);if(pow
-nE==cPow){pow
-lF2
-yJ
-abs;abs
-tU
-cAbs);abs
-yA
-pow
-xY3
-abs
-x02
-tI
-pow.nC1
-0,abs
-tT.lW}
-lC
-cAcosh:tH3(fp_acosh);lC
-cAsinh:tH3(fp_asinh);lC
-cAtanh:tH3(fp_atanh);lC
-cAcos:tH3(fp_acos);lC
-cAsin:tH3(fp_asin);lC
-cAtan:tH3(fp_atan);lC
-cCosh:tH3(fp_cosh);lC
-cSinh:tH3(fp_sinh);lC
-cTanh:tH3(fp_tanh);lC
-cSin:tH3(fp_sin);lC
-cCos:tH3(fp_cos);lC
-cTan:tH3(fp_tan);lC
-cCeil:if(n8
-tH3(fp_ceil);lC
-cTrunc:if(n8
-tH3(fp_trunc);lC
-cFloor:if(n8
-tH3(fp_floor);lC
-cInt:if(n8
-tH3(fp_int);lC
-cCbrt:tH3(fp_cbrt);lC
-cSqrt:tH3(fp_sqrt);lC
-cExp:tH3(fp_exp);lC
-cLog2:tH3(fp_log2);lC
-cLog10:tH3(fp_log10);lC
-cLog2by:y2)lL
-fp_log2(n6)*y4
-nN3
-cMod:y2)lL
-fp_mod(n6,y4)nN3
-cAtan2:{range
-x8
-p0
-y5
-p1=y6
-1));lX&&fp_equal(n6,eS1(0))){if(p1
-i0&&(p1.max)<0)lL
-fp_const_pi
-x8())n5
-if(p1
-y41
-p1.min>=0.0)lL
-eS1(0))n5}
-if(nE1
-fp_equal(y4,eS1(0))){if(p0
-i0&&(p0.max)<0)lL-fp_const_pihalf
-x8())n5
-if(p0
-y41
-p0.min>0)lL
-fp_const_pihalf
-x8())n5}
-y2)lL
-fp_atan2(n6,y4))n5
-if((p1
-y41
-p1.min>0.0)||(p1
-i0&&(p1.max)<fp_const_negativezero
-x8()))nG1
-y62;y62
-tU
-cPow);y62
-yA
-tree
-x03;y62
-yT
-eS1(-1)));y62
-i72
-y72;y72
-e53
-y72
-yA
-e72);y72
-yA
-y62);y72
-y3
-cAtan
-tT.nC1
-0,y72
-tW1
-1);c91
-cPow:{if(ConstantFolding_PowOperations
-y83
-nM3
-case
-cDiv:y2&&y4!=0.0)lL
-n6/y4
-nN3
-cInv:lX&&n6!=0.0)lL
-eS1(1)/n6
-nN3
-cSub:y2)lL
-n6-y4
-nN3
-cNeg:lX)lL-n6
-nN3
-cRad:lX)lL
-RadiansToDegrees
-t63
-cDeg:lX)lL
-DegreesToRadians
-t63
-cSqr:lX)lL
-n6*n6
-nN3
-cExp2:tH3(fp_exp2);lC
-cRSqrt:lX)lL
-eS1(1)/fp_sqrt
-t63
-cCot:lX)nQ3=fp_tan(n6)xE
-cSec:lX)nQ3=fp_cos(n6)xE
-cCsc:lX)nQ3=fp_sin(n6)xE
-cHypot:y2)lL
-fp_hypot(n6,y4)nN3
-cRDiv:case
-cRSub:case
-cDup:case
-cFetch:case
-cPopNMov:case
-cSinCos:case
-cNop:case
-cJump:lC
-cPCall:case
-cFCall:case
-cEval:nM3
-do_return:;
-#ifdef DEBUG_SUBSTITUTIONS
-std::cout<<"["
-<<(&yM3)<<"]Done ConstantFolding, result: "
-eS
-DumpHashes(tree);
-#endif
-}
-}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-using
-iO2
-FPoptimizer_CodeTree;iO2{n73<i02
-cY2
-e92
-Comp{}
-;n73<>e92
-Comp<cLess>{n73<lF<yU
-cLessOrEq>{n73<lF<=yU
-cGreater>{n73<lF>yU
-cGreaterOrEq>{n73<lF>=yU
-cEqual>{n73<lF==yU
-t71>{n73<lF!=b;}
-}
-;}
-iO2
-FPoptimizer_CodeTree{c12
-set_abs(){if(!iV2&&!iI2{iV2=yV3}
-tP1!iV2&&max
-t83){iV2=true;min=-max;iJ2
-false;}
-tP1!iV2){iV2=yV3
-iJ2
-false;}
-tP1
-min
-cH1
-nZ2;tP1!iI2{iV2=yV3}
-tP1
-max
-t83)nQ3(-max);max=-min;min=tmp;}
-tP1-min>=max){max=-min;n31}
-else{n31}
-}
-c12
-set_neg(){std::swap(iV2,iI2;std::swap(min,max);min=-min;max=-max;}
-yV
-set_min_if(c31
-if(iV2&&Comp<cY2()(min,v))min=func(min
-t73
-iV2=yW3
-iV2;min=yW3
-min;}
-}
-yV
-set_max_if(c31
-if(has_max&&Comp<cY2()(max,v))max=func(max
-t73
-iJ2
-model
-i0;max=yW3
-max;}
-}
-yV
-set_min_max_if(c31
-set_min_if<cY2(v,func,model);set_max_if<cY2(v,func,model);}
-c12
-set_min(n7
-if(iV2)min=func(min
-t73
-iV2=yW3
-iV2;min=yW3
-min;}
-}
-c12
-set_max(n7
-if(iI2
-max=func(max
-t73
-iJ2
-model
-i0;max=yW3
-max;}
-}
-c12
-y82
-n7
-set_min(func,model);set_max(func,model);}
-yV1
-range
-x8
-iM
-const
-eR
-#ifdef DEBUG_SUBSTITUTIONS_extra_verbose
-{range
-x8
-tmp=CalculateResultBoundaries_do(tree)lN1"Estimated boundaries: "
-;if(tmp.iV2)std::cout<<tmp.min;else
-std::cout<<"-inf"
-lN1" .. "
-;if(tmp
-i0)std::cout<<tmp.max;else
-std::cout<<"+inf"
-lN1": "
-;xE3(tree)lN1
-std::endl
-l81
-tmp;}
-yV1
-range
-x8
-yK2::CalculateResultBoundaries_do
-i01
-eR
-#endif
-{x81
-eO1(-fp_const_pihalf
-x8(),fp_const_pihalf
-x8());x81
-pi_limits(-fp_const_pi
-x8(),fp_const_pi
-x8());x81
-abs_pi_limits(eS1(0),fp_const_pi
-x8());using
-iO2
-std;switch
-xU2
-iY2
-cImmed:nL
-yZ3,yZ3);case
-cAnd:case
-cAbsAnd:case
-cOr:case
-cAbsOr:case
-cNot:case
-yR3:case
-cNotNot:case
-cAbsNotNot:case
-cEqual:case
-t71:case
-cLess:case
-cLessOrEq:case
-cGreater:case
-cGreaterOrEq:e83
-0),eS1(1))cM3
-cAbs:lB
-m.set_abs(cY
-cLog:lB
-m.y7
-fp_log
-cY
-cLog2:lB
-m.y7
-fp_log2
-cY
-cLog10:lB
-m.y7
-fp_log10
-cY
-cAcosh:lB
-m
-nL2
-set_min_max_if<cGreaterOrEq
-lQ3
-fp_acosh
-cY
-cAsinh:lB
-m.y82
-fp_asinh
-cY
-cAtanh:lB
-m
-nL2
-set_min_if<cGreater>(eS1(-1),fp_atanh);m
-nL2
-set_max_if<cLess
-lQ3
-fp_atanh
-cY
-cAcos:lB
-nL(m
-i0&&(m.max)<eS1(1))?fp_acos(m.max):eS1(0),(m
-y41(m.min)>=eS1(-1))?fp_acos(m.min):fp_const_pi
-x8())cM3
-cAsin:lB
-m
-nL2
-set_min_if<cGreater>(eS1(-1),fp_asin,eO1);m
-nL2
-set_max_if<cLess
-lQ3
-fp_asin,eO1
-cY
-cAtan:lB
-m.y82
-fp_atan,eO1
-cY
-cAtan2:{range
-x8
-p0
-y5
-p1=y6
-1));lX&&fp_equal(n6,eS1(0))){return
-abs_pi_limits;}
-if(nE1
-fp_equal(y4,eS1(0))){return
-eO1;}
-return
-pi_limits
-cM3
-cSin:lB
-bool
-x41=!m.iV2||!m
-i0||(m.max-m.min)>=(y8
-x41)e0
-eS1
-min=cZ2
-min,y8
-min
-t83)min
-c5
-eS1
-max=cZ2
-max,y8
-max
-t83)max
-c5
-if(max<min)max
-c5
-bool
-xT1=(min<=fp_const_pihalf
-x8()&&max>=fp_const_pihalf
-x8());bool
-nP1=(min<=cK&&max>=cK);if(xT1&&nP1)e0
-if(nP1)nL
-eS1(-1),lS2
-if(xT1)nL
-y92
-eS1(1));nL
-y92
-lS2}
-case
-cCos:lB
-if(m.iV2)m.min+=fp_const_pihalf
-x8();if(m
-i0)m.max+=fp_const_pihalf
-x8();bool
-x41=!m.iV2||!m
-i0||(m.max-m.min)>=(y8
-x41)e0
-eS1
-min=cZ2
-min,y8
-min
-t83)min
-c5
-eS1
-max=cZ2
-max,y8
-max
-t83)max
-c5
-if(max<min)max
-c5
-bool
-xT1=(min<=fp_const_pihalf
-x8()&&max>=fp_const_pihalf
-x8());bool
-nP1=(min<=cK&&max>=cK);if(xT1&&nP1)e0
-if(nP1)nL
-eS1(-1),lS2
-if(xT1)nL
-y92
-eS1(1));nL
-y92
-lS2}
-case
-cTan:{nL)cM3
-cCeil:lB
-m.c41
-cFloor:lB
-m.eP1
-cY
-cTrunc:lB
-m.eP1);m.c41
-cInt:lB
-m.eP1);m.c41
-cSinh:lB
-m.y82
-fp_sinh
-cY
-cTanh:lB
-m.y82
-fp_tanh,range
-x8(eS1(-y03
-cY
-cCosh:lB
-if(m.iV2){if(m
-i0){if(m.min
-cH1&&m.max
-cH1){m.min
-cM}
-tP1(m.min)t83&&m.max
-cH1)nQ3
-cM
-if(tmp>m.max)m.max=tmp;m.min=eS1(1);}
-else{m.min
-cM
-std::swap(m.min,m.max);}
-}
-else{if(m.min
-cH1){m
-nM2
-m.min=fp_cosh(m.min);}
-else{m
-nM2
-m.min=eS1(1);}
-}
-}
-else{m.iV2=true;m.min=eS1(1);if(m
-i0){m.min=fp_cosh(m.max);m
-nM2}
-else
-m
-nM2}
-return
-m
-cM3
-cIf:case
-i03:{range
-x8
-res1=y6
-1));range
-x8
-res2=y6
-2));if(!res2.iV2)res1.iV2
-i13
-tP1
-res1
-y41(res2.min)<res1.min)res1.min=res2.min;if(!res2
-i0)res1
-nM2
-tP1
-res1
-i0&&(res2.max)>res1.max)res1.max=res2.max
-l81
-res1
-cM3
-cMin:{bool
-iG
-i13
-bool
-iH
-i13
-tB1;x4
-m
-xO3!m.iV2)iG=true;yP1.iV2||(m.min)<i11)i11=m.min;if(!m
-i0)iH=true;yP1
-i0||(m.max)<e63)e63=m.max;}
-if(iG)c42
-iH)tE1
-l81
-yA2
-cMax:{bool
-iG
-i13
-bool
-iH
-i13
-tB1;x4
-m
-xO3!m.iV2)iG=true;yP1.iV2||m.min>i11)i11=m.min;if(!m
-i0)iH=true;yP1
-i0||m.max>e63)e63=m.max;}
-if(iG)c42
-iH)tE1
-l81
-yA2
-cAdd:{tB1(eS1(0),eS1(0));x4
-item
-xO3
-item.iV2)i11+=item.min;else
-c42
-item
-i0)e63+=item.max;else
-tE1;if(!result
-y41!e02)nM3
-if(result
-y41
-e02&&i11>e63)std::swap(i11,e63)l81
-yA2
-cMul:{e92
-Value{enum
-lR3{tR2,i91,PlusInf}
-;lR3
-eF;eS1
-value;Value(lR3
-t):eF(t),value(0){}
-Value(eS1
-v):eF(tR2),value(v){}
-bool
-c22
-n61
-eF==i91||(eF==tR2&&value
-t83
-iR2
-e31*=i01
-Value&rhs){if(eF==tR2&&rhs.eF==tR2)value*=rhs.value;else
-eF=(c22)!=rhs.c22)?i91:PlusInf);}
-i12<i01
-Value&rhs
-n61(eF==i91&&rhs.eF!=i91)||(eF==tR2&&(rhs.eF==PlusInf||(rhs.eF==tR2&&value<rhs.value)));}
-}
-;e92
-yD1{Value
-yC2,yD2;yD1():yC2(Value::PlusInf),yD2(Value::i91){}
-void
-nN2
-Value
-yX3,const
-Value&value2){yX3*=value2;if(yX3<yC2)yC2=yX3;if(yD2<yX3)yD2=yX3;}
-}
-;tB1(eS1(y03;x4
-item
-xO3!item
-y41!item
-i0)nL);Value
-lS3=c32?Value(i11):nC2
-i91);Value
-lT3=e02?Value(e63):nC2
-PlusInf);Value
-lU3=item.iV2?Value(item.min):nC2
-i91);Value
-lV3=item
-i0?Value(item.max):nC2
-PlusInf);yD1
-range;range.nN2
-lS3,lU3
-eN2
-lS3,lV3
-eN2
-lT3,lU3
-eN2
-lT3,lV3);if(range.yC2.eF==Value::tR2)i11=range.yC2.value;else
-c42
-range.yD2.eF==Value::tR2)e63=range.yD2.value;else
-tE1;if(!result
-y41!e02)nM3
-if(result
-y41
-e02&&i11>e63)std::swap(i11,e63)l81
-yA2
-cMod:{range
-x8
-x
-y5
-y=y6
-1));if(y
-i0){if(y.max
-cH1){if(!x.iV2||(x.min)<0)nL-y.max,y.max);else
-nL
-eS1(0),y.max);}
-else{if(!x
-i0||(x.max)>=0)nL
-y.max,-y.max);else
-nL
-y.max,fp_const_negativezero
-x8());}
-}
-else
-nL)cM3
-cPow:{if(nE1
-y4==eS1(0))e83
-y03;}
-lX&&n6==eS1(0))e83
-0),eS1(0));}
-lX&&fp_equal(n6,nY3
-e83
-y03;}
-if(nE1
-y4>0&&GetEvennessInfo
-nW1
-1))==IsAlways)c21
-y4;range
-x8
-tmp
-y5
-result;c32=true;i11=0;if(tmp
-y41
-tmp.min>=0)i11=eG3
-tmp.min,cE2);tP1
-tmp
-i0&&tmp.max<=0)i11=eG3
-tmp.max,cE2);tE1;if(tmp
-y41
-tmp
-i0){e02=true;e63=std::max(fp_abs(tmp.min),fp_abs(tmp.max));e63=eG3
-e63,cE2);}
-return
-result;}
-range
-x8
-p0
-y5
-p1=y6
-1
-eO2
-p0_positivity=(p0
-y41(p0.min)cH1)?IsAlways:(p0
-i0&&(p0.max)t83?yO3:Unknown);TriTruthValue
-c52=GetEvennessInfo
-nW1
-1
-eO2
-t2=Unknown;switch(p0_positivity)tF1
-t2=IsAlways;lC
-yO3:{t2=c52;nM3
-default:switch(c52)tF1
-t2=IsAlways;lC
-yO3:lC
-Unknown:{if(nE1!eY2
-y4)&&y4
-cH1){t2=IsAlways;}
-nM3}
-yN3(t2)tF1{eS1
-n31
-if(p0
-y41
-p1.iV2){min=eG3
-p0.min,p1.min);if(p0.min
-t83&&(!p1
-i0||p1.max
-cH1)&&min
-cH1)n31}
-if(p0
-y41
-p0.min
-cH1&&p0
-i0&&p1
-i0){eS1
-max=eG3
-p0.max,p1.max);if(min>max)std::swap(min,max);nL
-min,max);}
-nL
-min,false)cM3
-yO3:{nL
-false,fp_const_negativezero
-x8());}
-default:{nM3
-c91
-cNeg:lB
-m.set_neg(cY
-cSub
-x7
-cNeg
-y23
-1
-y43
-cAdd);y53;tmp
-yY3
-l81
-lH
-cInv:lV-1
-e12
-cDiv
-x7
-cInv
-y23
-1
-y43
-xU1
-yY3
-l81
-lH
-cRad:{cF
-xU1
-yT
-fp_const_rad_to_deg
-x8(e12
-cDeg:{cF
-xU1
-yT
-fp_const_deg_to_rad
-x8(e12
-cSqr:lV
-2
-e12
-cExp:{cF
-cPow);tmp
-yT
-fp_const_e
-x8()));y53
-l81
-lH
-cExp2:{cF
-cPow);tmp
-yT
-nR3
-y53
-l81
-lH
-cCbrt:lB
-m.y82
-fp_cbrt
-cY
-cSqrt:lB
-if(m.iV2)m.min=(m.min)<0?0:fp_sqrt(m.min);if(m
-i0)m.max=(m.max)<0?0:fp_sqrt(m.max
-cY
-cRSqrt:lV-0.5
-e12
-cHypot:nG1
-xsqr,ysqr,add,sqrt;xsqr
-yC
-0));xsqr
-yT
-nR3
-ysqr
-yC
-1));ysqr
-yT
-nR3
-xsqr
-tU
-cPow);ysqr
-tU
-cPow);add
-yA
-xsqr);add
-yA
-ysqr);add
-tU
-cAdd);sqrt
-yA
-add);sqrt
-tU
-cSqrt)l81
-iM
-sqrt)cM3
-cLog2by
-x7
-cLog2
-y23
-0
-y43
-cMul);tmp
-yY3;tmp
-yC
-1))l81
-lH
-cCot
-x7
-cTan)nG
-lH
-cSec
-x7
-cCos)nG
-lH
-cCsc
-x7
-cSin)nG
-iM
-tmp);}
-lC
-cRDiv:case
-cRSub:case
-cDup:case
-cFetch:case
-cPopNMov:case
-cSinCos:case
-cNop:case
-cJump:case
-iE2:lC
-cPCall:lC
-cFCall:lC
-cEval:nM3
-nL);}
-yV1
-TriTruthValue
-GetIntegerInfo
-i01
-eR{switch
-xU2
-iY2
-cImmed:return
-eY2
-yZ3)?IsAlways:yO3;case
-cFloor:case
-cCeil:case
-cTrunc:case
-cInt:return
-IsAlways;case
-cAnd:case
-cOr:case
-cNot:case
-cNotNot:case
-cEqual:case
-t71:case
-cLess:case
-cLessOrEq:case
-cGreater:case
-cGreaterOrEq:return
-IsAlways;case
-cIf:{TriTruthValue
-a=GetIntegerInfo
-nW1
-1
-eO2
-b=GetIntegerInfo
-nW1
-2));if(a==b
-nZ2
-a
-l81
-Unknown
-cM3
-cAdd:case
-cMul:{for
-xU
-if(GetIntegerInfo
-nW1
-a))!=IsAlways
-nZ2
-Unknown
-l81
-IsAlways;}
-default:nM3
-return
-Unknown;}
-xG1
-IsLogicalValue
-i01
-eR{switch
-xU2
-iY2
-cImmed:return
-fp_equal(yZ3,eS1(0))||fp_equal(yZ3,eS1(1));case
-cAnd:case
-cOr:case
-cNot:case
-cNotNot:case
-cAbsAnd:case
-cAbsOr:case
-yR3:case
-cAbsNotNot:case
-cEqual:case
-t71:case
-cLess:case
-cLessOrEq:case
-cGreater:case
-cGreaterOrEq:nW
-cMul:{for
-xU
-if(!y93
-a))yI
-return
-true
-cM3
-cIf:case
-i03:{return
-y93
-1))&&y93
-2));}
-default:nM3
-nX2}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-#if defined(__x86_64) || !defined(FP_SUPPORT_CBRT)
-# define CBRT_IS_SLOW
-#endif
-#if defined(DEBUG_POWI) || defined(DEBUG_SUBSTITUTIONS)
-#include <cstdio>
-#endif
-t5{extern
-const
-i02
-char
-powi_table[256];}
-iO2{using
-iO2
-FPoptimizer_CodeTree;xG1
-IsOptimizableUsingPowi(long
-immed,long
-penalty=0){yW2
-synth;synth.PushVar(iE2);size_t
-bytecodesize_backup
-t13
-GetByteCodeSize();yV2
-x31
-immed,yV2
-eX1
-x8::MulSequence,synth);size_t
-bytecode_grow_amount
-t13
-GetByteCodeSize()-bytecodesize_backup
-l81
-bytecode_grow_amount<size_t(MAX_POWI_BYTECODE_LENGTH-penalty);}
-xB1
-ChangeIntoRootChain(yK2&tree,bool
-iK2,long
-tS2,long
-tT2){while(tT2>0){cF
-cCbrt);nZ3);tmp.Rehash(nD2--tT2;}
-while(tS2>0){cF
-cSqrt);if(iK2){tmp
-tU
-cRSqrt);iK2
-i13}
-nZ3);tmp.Rehash(nD2--tS2;}
-if(iK2){cF
-cInv);nZ3
-nD2}
-}
-yT1
-RootPowerTable{static
-const
-eS1
-RootPowers[(1+4)*(1+3)];}
-;yV1
-const
-eS1
-t7(1+4)*(1+3)]={eS1(1)lS
-tB3
-tB3
-2*tB3
-2*2*2)lS
-3
-x32
-2
-x32
-2*2
-x32
-2*2*2
-x32
-2*2*2*2
-x32
-3
-x32
-3*2
-x32
-3*2*2
-x32
-3*2*2*2
-x32
-3*2*2*2*2
-x32
-3*3
-x32
-3*3*2
-x32
-3*3*2*2
-x32
-3*3*2*2*2
-x32
-3*3*2*2*2*2)}
-;e92
-PowiResolver{static
-const
-i02
-MaxSep=4;static
-lX3
-tC3=5;typedef
-int
-c03;typedef
-long
-n63;typedef
-long
-t8;e92
-yE2{yE2():n_int_sqrt(0),n_int_cbrt(0),sep_list(),lY1(0){}
-int
-n_int_sqrt;int
-n_int_cbrt;int
-eW1
-MaxSep];t8
-lY1;}
-;yV1
-static
-yE2
-CreatePowiResult(eS1
-cE2){yE2
-result;c03
-eE=FindIntegerFactor(cE2);if(eE==0){
-#ifdef DEBUG_POWI
-tU2"no factor found for %Lg\n"
-y33);
-#endif
-return
-result;}
-c13=xV1
-cE2,eE);n63
-e22=EvaluateFactorCost(eE,0,0,0)+cH
-c13);int
-tD3=0;int
-tE3=0;int
-lW3=0;
-#ifdef DEBUG_POWI
-tU2"orig = %Lg\n"
-y33);tU2"plain factor = "
-tS3"%ld\n"
-,(int)eE,(long)e22);
-#endif
-for
-iL1
-n_s=0;n_s<MaxSep;++n_s){int
-xC=0;n63
-yE1=e22;c03
-yQ1=eE;for(int
-s=1;s<tC3*4;++s){
-#ifdef CBRT_IS_SLOW
-if(s>=tC3)break;
-#endif
-int
-n_sqrt=s%tC3;int
-n_cbrt=s/tC3;if(n_sqrt+n_cbrt>4)y81
-eS1
-lE1=cE2;lE1-=t7
-s];tH1=FindIntegerFactor(lE1);if(xD2!=0){t8
-xL=xV1
-lE1,xD2);n63
-cost=EvaluateFactorCost(xD2,tD3+n_sqrt,tE3+n_cbrt,lW3+1)+cH
-xL);
-#ifdef DEBUG_POWI
-tU2"Candidate sep %u (%d*sqrt %d*cbrt)factor = "
-tS3"%ld (for %Lg to %ld)\n"
-,s,n_sqrt,n_cbrt,xD2,(long)cost
-x12
-lE1,(long)xL);
-#endif
-if(cost<yE1){xC=s;yQ1=xD2;yE1=cost;}
-}
-}
-if(!xC)break;
-#ifdef DEBUG_POWI
-tU2"CHOSEN sep %u (%d*sqrt %d*cbrt)factor = "
-tS3"%ld, exponent %Lg->%Lg\n"
-,xC,xC%tC3,xC/tC3,yQ1,yE1
-x12(cE2)x12(cE2-t7
-xC]));
-#endif
-tC1
-eW1
-n_s]=xC;cE2-=t7
-xC];tD3+=xC%tC3;tE3+=xC/tC3;e22=yE1;eE=yQ1;lW3+=1;}
-c13=xV1
-cE2,eE);
-#ifdef DEBUG_POWI
-tU2"resulting exponent is %ld (from exponent=%Lg, best_factor=%Lg)\n"
-,c13
-y33
-x12
-eE);
-#endif
-while(eE%2==0){++tC1
-n_int_sqrt;eE/=2;}
-while(eE%3==0){++tC1
-n_int_cbrt;eE/=3;}
-return
-result;}
-private:static
-n63
-cH
-t8
-xL){static
-std::map
-c62
-i7;if(xL<0){n63
-cost=22
-l81
-cost+cH-xL);}
-std::map
-c62::nX3
-i=i7.xE2
-xL);if(i!=i7.cP1
-xL
-nZ2
-i
-cJ2;std::pair
-c62
-cY3
-xL,0.0);n63&cost=tC1
-second;while(xL>1){int
-xD2=0;if(xL<256){xD2=yV2
-powi_table[xL];if(xD2&128)xD2&=127;else
-xD2=0;if(xD2&64)xD2=-(xD2&63)-1;}
-if(xD2){cost+=cH
-xD2);xL/=xD2;y81}
-if(!(xL&1)){xL/=2;cost+=6;}
-else{cost+=7;xL-=1;}
-}
-i7.nT3,result)l81
-cost
-eI2
-t8
-xV1
-yF1,tH1){return
-makeLongInteger(value*eS1(xD2))eI2
-bool
-yG1
-yF1,tH1){eS1
-v=value*eS1(xD2)l81
-isLongInteger(v)eI2
-c03
-FindIntegerFactor(yF1){tH1=(2*2*2*2);
-#ifdef CBRT_IS_SLOW
-#else
-xD2*=(3*3*3);
-#endif
-c03
-result=0;if(yG1
-value,xD2)){result=xD2;while((xD2%2)==0&&yG1
-value,xD2/2))result=xD2/=2;while((xD2%3)==0&&yG1
-value,xD2/3))result=xD2/=3;}
-#ifdef CBRT_IS_SLOW
-if(result==0){if(yG1
-value,3)nZ2
-3;}
-#endif
-return
-result;}
-static
-int
-EvaluateFactorCost(int
-xD2,int
-s,int
-c,int
-nmuls){lX3
-lY3=6;
-#ifdef CBRT_IS_SLOW
-lX3
-e32=25;
-#else
-lX3
-e32=8;
-#endif
-int
-result=s*lY3+c*e32;while(xD2%2==0){xD2/=2;result+=lY3;}
-while(xD2%3==0){xD2/=3;result+=e32;}
-result+=nmuls
-l81
-result;}
-}
-;}
-iO2
-FPoptimizer_CodeTree{xG1
-yK2::RecreateInversionsAndNegations(bool
-prefer_base2){bool
-changed=false
-c23
-0;a<cN3++a)if(lT1.RecreateInversionsAndNegations(prefer_base2))yI1
-if(changed){exit_changed:Mark_Incompletely_Hashed()nS2
-switch(lM2
-iY2
-cMul:{yG
-nV1
-lG2
-yJ
-lH2,cJ1;if(true){bool
-nQ1
-i13
-eS1
-nE2=0
-c23
-cO3
-yF2
-0)c82
-tJ
-1)y21){nQ1=true;nE2=tJ
-1).xJ1;nM3}
-if(nQ1){eS1
-immeds=1.0
-c23
-cO3
-y21){immeds*=powgroup.xJ1;yH1}
-for
-xK2
-cN3
-a-->0;)nG1&powgroup=lT1;if(powgroup
-yF2
-0)c82
-tJ
-1)y21)nG1&log2=tJ
-0);log2.iY
-log2
-tU
-lZ3
-log2
-yT
-eG3
-immeds,eS1(1)/nE2)));log2.Rehash(nW2}
-}
-}
-for
-xK2
-cO3
-yF2
-1)y21){lM1&exp_param=tJ
-1);eS1
-cE2=exp_param.xJ1;if(cR1,eS1(-1))){iY
-lG2
-yL
-lT1
-xY3
-yH1
-tP1
-cE2<0&&eY2
-cE2))nG1
-iI;iI
-tU
-cPow);iI
-eT
-tJ
-0));iI
-yT-cE2));iI
-x02;lG2
-yL
-iI);iY
-yH1}
-tP1
-powgroup
-c82!lH2.iA1{lH2=tJ
-0);iY
-yH1
-tP1
-powgroup
-nE==cLog2by&&!cJ1.iA1{cJ1=powgroup;iY
-yH1}
-if(!lG2
-cQ3){changed=true
-yJ
-eR1;eR1
-e53
-eR1
-tI1
-lG2);eR1
-i72
-xW1
-cMul);xX1
-SetParamsMove(t3
-if(xX1
-IsImmed()&&fp_equal(xX1
-xJ1,nY3{lI2
-cInv);eG
-eR1);}
-else{if(xX1
-xT2>=eR1.xT2){lI2
-cDiv
-eV1
-eG
-eR1);}
-else{lI2
-cRDiv);eG
-eR1
-eV1}
-}
-}
-if(lH2.iA1
-nG1
-xW1
-lM2);xX1
-SetParamsMove(t3
-while(xX1
-RecreateInversionsAndNegations(prefer_base2))xX1
-FixIncompleteHashes();lI2
-lZ3
-eG
-lH2
-eV1
-yI1}
-if(cJ1.iA1
-nG1
-xW1
-cMul);n83
-yA
-cJ1
-x03;xX1
-AddParamsMove(t3
-while(xX1
-RecreateInversionsAndNegations(prefer_base2))xX1
-FixIncompleteHashes();DelParams();lI2
-lZ3
-eG
-cJ1
-lD
-0)eV1
-yI1
-c91
-cAdd:{yG
-nV1
-tV2
-c23
-tD
-c33
-cMul){lJ2
-xY1:yJ&n83
-c72
-for(iX2
-xX1
-cN3
-b-->0;){if(n83
-lD
-b)xC3
-xD2=n83
-lD
-b).xJ1
-i82
-xD2
-eQ1
-xY1;}
-xX1
-iY
-xX1
-iH1
-b
-eJ2
-tP1
-fp_equal(xD2,eS1(-2)))xF
-xY1;}
-xX1
-iY
-xX1
-iH1
-b);n83
-yT
-eS1(2))eJ2}
-}
-if(t4){xX1
-nR1
-n83);yH1}
-tP1
-c33
-cDiv&&!IsIntType
-x8::result){lJ2
-xZ1:yJ&eR1
-c72
-if(eR1
-lD
-0)tF3(fp_equal(eR1
-lD
-0).xJ1
-eQ1
-xZ1;}
-eR1.iY
-eR1.iH1
-0);eR1
-tU
-cInv
-eJ2}
-if(t4)xF
-xZ1;}
-eR1.nR1
-eR1);yH1}
-tP1
-c33
-cRDiv&&!IsIntType
-x8::result){lJ2
-x91:yJ&eR1
-c72
-if(eR1
-lD
-1)tF3(fp_equal(eR1
-lD
-1).xJ1
-eQ1
-x91;}
-eR1.iY
-eR1.iH1
-1);eR1
-tU
-cInv
-eJ2}
-if(t4)xF
-x91;}
-eR1.nR1
-eR1);yH1}
-if(!tV2
-cQ3){
-#ifdef DEBUG_SUBSTITUTIONS
-tU2"Will make a Sub conversion in:\n"
-);fflush(stdout);iO
-#endif
-yK2
-yR1;yR1
-tU
-cAdd);yR1
-tI1
-tV2);yR1
-i72
-cK1;cK1
-tU
-cAdd);cK1
-tI1
-iE1));cK1
-x02;if(cK1
-y21&&fp_equal(cK1.xJ1,eS1(0))){lI2
-cNeg);cU3);}
-else{if(cK1.xT2==1){lI2
-cRSub);cU3);cV3}
-tP1
-yR1
-nE==cAdd){lI2
-cSub);cV3
-cU3
-xY3
-for
-xK2
-1;a<yR1.cN3++a)nG1
-e42;e42
-tU
-cSub);e42
-tI1
-iE1));e42.y12);eG
-e42);cU3
-lD
-a));}
-}
-else{lI2
-cSub);cV3
-cU3);}
-}
-#ifdef DEBUG_SUBSTITUTIONS
-tU2"After Sub conversion:\n"
-);fflush(stdout);iO
-#endif
-c91
-cPow:{lM1&p0
-tW2
-0);lM1&p1
-tW2
-1);if(p1
-tF3
-n03!=eS1(0)&&!eY2
-p1.xJ1)){eJ
-yE2
-r=eJ
-CreatePowiResult(fp_abs
-n03));if(r.lY1!=0){bool
-iB1
-i13
-if
-n03<0&&r.eW1
-0]==0&&r
-x33>0){iB1=true;}
-#ifdef DEBUG_POWI
-tU2"Will resolve powi %Lg as powi(chain(%d,%d),%ld)"
-x12
-fp_abs
-n03),r
-x33,r.n_int_cbrt,r.lY1)xS3
-n=0;n<eJ
-MaxSep;++n){if(r
-cW3==0)break;int
-n_sqrt=r
-cW3%eJ
-tC3;int
-n_cbrt=r
-cW3/eJ
-tC3;tU2"*chain(%d,%d)"
-,n_sqrt,n_cbrt);}
-tU2"\n"
-);
-#endif
-yK2
-c92
-tW2
-0)yJ
-yG2=c92;yG2.iY
-ChangeIntoRootChain(yG2,iB1,r
-x33,r.n_int_cbrt);yG2
-i72
-pow;if(r.lY1!=1){pow
-tU
-cPow);pow
-yA
-yG2);pow
-yT
-eS1(r.lY1)));}
-else
-pow.swap(yG2)yJ
-mul;mul
-e53
-mul
-yA
-pow)xS3
-n=0;n<eJ
-MaxSep;++n){if(r
-cW3==0)break;int
-n_sqrt=r
-cW3%eJ
-tC3;int
-n_cbrt=r
-cW3/eJ
-tC3
-yJ
-e52=c92;e52.iY
-ChangeIntoRootChain(e52,false,n_sqrt,n_cbrt);e52
-x02;mul
-yA
-e52);}
-if
-n03<0&&!iB1){mul
-x02;lI2
-cInv);nC1
-0,mul);iH1
-1);}
-else{lI2
-cMul);SetParamsMove(mul.iE1));}
-#ifdef DEBUG_POWI
-iO
-#endif
-yI1
-nM3}
-}
-if(lM2==cPow&&(!p1
-y21||!isLongInteger
-n03)||!IsOptimizableUsingPowi
-x8(makeLongInteger
-n03)))){if(p0
-y21&&p0.xJ1>0.0){if(prefer_base2){eS1
-yH2=fp_log2(p0.xJ1)i82
-yH2,nY3{iH1
-0);}
-else{n1
-cU1
-yH2));cE2
-eT
-p1)tD1
-iP}
-lI2
-cExp2);yI1}
-else{eS1
-yH2=fp_log(p0.xJ1)i82
-yH2,nY3{iH1
-0);}
-else{n1
-cU1
-yH2));cE2
-eT
-p1)tD1
-iP}
-lI2
-cExp);yI1}
-}
-tP1
-GetPositivityInfo(p0)==IsAlways){if(prefer_base2)nG1
-log;log
-tU
-cLog2);log
-eT
-p0);log
-x02;n1
-p1);cE2
-yA
-log)tD1);lI2
-cExp2
-iP
-yI1}
-else
-nG1
-log;log
-tU
-cLog);log
-eT
-p0);log
-x02;n1
-p1);cE2
-yA
-log)tD1);lI2
-cExp
-iP
-yI1}
-}
-c91
-cDiv:{if(GetParam(0)y21&&fp_equal(GetParam(0).xJ1,nY3{lI2
-cInv);iH1
-0);}
-nM3
-default:nM3
-if(changed)goto
-exit_changed
-l81
-changed;}
-}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-xQ
-iO2{using
-iO2
-FPoptimizer_CodeTree;class
-eT1{size_t
-yJ1;size_t
-eK;size_t
-eL;size_t
-lF1;e13
-eT1():yJ1(0),eK(0),eL(0),lF1(0){}
-void
-c43
-OPCODE
-op){yJ1+=1;n13
-cCos)++eK;n13
-cSin)++eL;n13
-cSec)++eK;n13
-cCsc)++eL;n13
-cTan)++lF1;n13
-cCot)++lF1;}
-size_t
-GetCSEscore()const{size_t
-result=yJ1
-l81
-result;}
-int
-NeedsSinCos()const{bool
-always_sincostan=(yJ1==(eK+eL+lF1));if((lF1&&(eL||eK))||(eL&&eK)){if(always_sincostan
-nZ2
-1
-l81
-2;}
-return
-0;}
-size_t
-MinimumDepth()const{size_t
-n_sincos=std::min(eK,eL);if(n_sincos==0
-nZ2
-2
-l81
-1;}
-}
-;iP2
-TreeCountType:public
-std::multimap<fphash_t,std::pair<eT1,yK2> >{}
-;xB1
-FindTreeCounts(nX1&lK2,lM1&tree,OPCODE
-lL2{iG1
-i=lK2.xE2
-tree.GetHash());bool
-found
-i13
-for(;i!=lK2.cP1
-tree.GetHash();++i){if(tree
-iA
-i
-cJ2
-eE3)){i
-cJ2.first.c43
-lL2;found=true;nM3}
-if(!found){eT1
-count;count.c43
-lL2;lK2.nT3,std::make_pair(tree.GetHash(),std::make_pair
-cR3
-n72);}
-for
-yS
-FindTreeCounts(lK2,xI2,tree
-nE);}
-e92
-c9{bool
-BalanceGood;bool
-cI;}
-;yV1
-c9
-lG1
-lM1&root,lM1&c53{if(root
-iA
-c53){c9
-result={true,true}
-l81
-result;}
-c9
-result={true,false}
-;if(root
-nE==cIf||root
-nE==i03){c9
-cond=lG1
-root
-lD
-0),c53;c9
-xW=lG1
-root
-lD
-1),c53;c9
-y9=lG1
-root
-lD
-2),c53;if(cond.cI||xW.cI||y9.cI){tC1
-cI=true;}
-result
-eH=((xW.cI==y9.cI)||eX2&&(cond
-eH||(xW.cI&&y9.cI))&&(xW
-eH||eX2&&(y9
-eH||eX2;}
-else{bool
-tK1
-i13
-bool
-nS1
-i13
-for(iX2
-root.GetParamCount(),a=0;a<b;++a){c9
-tmp=lG1
-root
-lD
-a),c53;if(tmp.cI)tC1
-cI=true;if(tmp
-eH==false)tK1=true;tP1
-tmp.cI)nS1=true;}
-if(tK1&&!nS1)result
-eH
-i13}
-return
-result;}
-xG1
-n62
-lM1&tG3
-lM1&tree,const
-yW2&synth,const
-nX1&lK2){for(iX2
-iT,a=0;a<b;++a){lM1&leaf=xI2;iG1
-lT2;xH2
-nX1::const_iterator
-i=lK2.nW3
-i!=lK2.end();++i){if(i->eQ3
-leaf.GetHash())y81
-const
-c63
-i->nF2
-size_t
-score=occ.GetCSEscore();lM1&candidate=i->nG2
-if(cC2
-candidate))y81
-if(leaf.xT2<occ.MinimumDepth())y81
-if(score<2)y81
-if(lG1
-tG3
-leaf)eH==false)continue
-nS2
-if(n62
-tG3
-leaf,synth,lK2
-iF1;}
-nX2
-xG1
-tL1
-lM1&nU3,lM1&expr){for
-iT1
-nU3
-lD
-a)iA
-expr
-iF1;for
-iT1
-tL1
-nU3
-lD
-a),expr
-iF1
-l81
-false;}
-xG1
-GoodMomentForCSE(lM1&nU3,lM1&expr){if(nU3
-nE==cIf
-nZ2
-true;for
-iT1
-nU3
-lD
-a)iA
-expr
-iF1;size_t
-tX2=0;for
-iT1
-tL1
-nU3
-lD
-a),expr))++tX2
-l81
-tX2!=1;}
-}
-iO2
-FPoptimizer_CodeTree{yV1
-size_t
-yK2::SynthCommonSubExpressions(yV2
-lP1
-const{size_t
-stacktop_before
-t13
-GetStackTop();nX1
-lK2;FindTreeCounts(lK2,*this,lM2);
-#ifdef DEBUG_SUBSTITUTIONS_CSE
-DumpHashes(*this);
-#endif
-for(;;){size_t
-yI2=0;iG1
-lT2;for(iG1
-j,i=lK2.nW3
-i!=lK2.end();i=j){j=i;++j;const
-c63
-i->nF2
-size_t
-score=occ.GetCSEscore();lM1&tree=i->nG2
-#ifdef DEBUG_SUBSTITUTIONS_CSE
-std::cout<<"Score "
-<<score<<":\n"
-;DumpTreeWithIndent(tree);
-#endif
-if(cC2
-tree))xV
-if(tree.xT2<occ.MinimumDepth())xV
-if(score<2)xV
-if(lG1*this,tree)eH==false)xV
-if(n62*this,tree,synth,lK2)){y81}
-if(!GoodMomentForCSE(*this
-n72
-xV
-score*=tree.xT2;if(score>yI2){yI2=score;lT2=i;}
-}
-if(yI2<=0)break;const
-c63
-lT2->nF2
-lM1&tree=lT2->nG2
-#ifdef DEBUG_SUBSTITUTIONS_CSE
-std::cout<<tZ3"Common Subexpression:"
-;xE3
-x8(tree)lN1"\n"
-;
-#endif
-int
-y01=occ.NeedsSinCos()yJ
-tY2,tZ2;if(y01){tY2
-eT
-tree);tY2
-tU
-cSin);tY2
-x02;tZ2
-eT
-tree);tZ2
-tU
-cCos);tZ2
-x02;if(cC2
-tY2)||cC2
-tZ2)){if(y01==2){lK2.erase(lT2);y81}
-y01=0;}
-}
-tree.SynthesizeByteCode(synth,false);lK2.erase(lT2);
-#ifdef DEBUG_SUBSTITUTIONS_CSE
-std::cout<<"Done with Common Subexpression:"
-;xE3
-x8(tree)lN1"\n"
-;
-#endif
-if(y01){if(y01==2){tQ1
-c71);}
-lK1
-cSinCos,1,2
-eU3.yZ2
-tY2,1
-eU3.yZ2
-tZ2,0);}
-}
-return
-synth.x5
-stacktop_before;}
-}
-#endif
-#ifdef FP_SUPPORT_OPTIMIZER
-yV1
-lR1
-x8
-nH2
-using
-iO2
-FPoptimizer_CodeTree;CopyOnWrite()yJ
-tree;tree.GenerateFrom(mData->mByteCode,mData->mImmed,*mData);FPoptimizer_Optimize::ApplyGrammars(tree);yG<i02>c73;yG
-x8
-immed;size_t
-stacktop_max=0;tree.SynthesizeByteCode(c73,immed,stacktop_max);if(mData->mStackSize!=stacktop_max){mData->mStackSize=i02(stacktop_max);
-#if !defined(FP_USE_THREAD_SAFE_EVAL) && \
- !defined(FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA)
-mData->mStack
-nE3
-stacktop_max);
-#endif
-}
-mData->mByteCode.swap(c73);mData->mImmed.swap(immed);}
-#ifdef FP_SUPPORT_MPFR_FLOAT_TYPE
-n73<>lR1<MpfrFloat>nH2}
-#endif
-#ifdef FP_SUPPORT_GMP_INT_TYPE
-n73<>lR1<GmpInt>nH2}
-#endif
-FUNCTIONPARSER_INSTANTIATE_TYPES
-#endif
-
-#endif
diff --git a/fparser/fptypes.hh b/fparser/fptypes.hh
deleted file mode 100644
index ef6357e..0000000
--- a/fparser/fptypes.hh
+++ /dev/null
@@ -1,282 +0,0 @@
-/***************************************************************************\
-|* Function Parser for C++ v4.3 *|
-|*-------------------------------------------------------------------------*|
-|* Copyright: Juha Nieminen, Joel Yliluoma *|
-|* *|
-|* This library is distributed under the terms of the *|
-|* GNU Lesser General Public License version 3. *|
-|* (See lgpl.txt and gpl.txt for the license text.) *|
-\***************************************************************************/
-
-// NOTE:
-// This file contains only internal types for the function parser library.
-// You don't need to include this file in your code. Include "fparser.hh"
-// only.
-
-#ifndef ONCE_FPARSER_TYPES_H_
-#define ONCE_FPARSER_TYPES_H_
-
-#include "fpconfig.hh"
-#include <cstring>
-
-#ifdef ONCE_FPARSER_H_
-#include <map>
-#endif
-
-namespace FUNCTIONPARSERTYPES
-{
- enum OPCODE
- {
-// The order of opcodes in the function list must
-// match that which is in the Functions[] array.
- cAbs,
- cAcos, cAcosh,
- cAsin, cAsinh,
- cAtan, cAtan2, cAtanh,
- cCbrt, cCeil,
- cCos, cCosh, cCot, cCsc,
- cEval,
- cExp, cExp2, cFloor, cHypot,
- cIf, cInt, cLog, cLog10, cLog2, cMax, cMin,
- cPow, cSec, cSin, cSinh, cSqrt, cTan, cTanh,
- cTrunc,
-
-// These do not need any ordering:
-// Except that if you change the order of {eq,neq,lt,le,gt,ge}, you
-// must also change the order in ConstantFolding_ComparisonOperations().
- cImmed, cJump,
- cNeg, cAdd, cSub, cMul, cDiv, cMod,
- cEqual, cNEqual, cLess, cLessOrEq, cGreater, cGreaterOrEq,
- cNot, cAnd, cOr,
- cNotNot, /* Protects the double-not sequence from optimizations */
-
- cDeg, cRad, /* Multiplication and division by 180 / pi */
-
- cFCall, cPCall,
-
-#ifdef FP_SUPPORT_OPTIMIZER
- cPopNMov, /* cPopNMov(x,y) moves [y] to [x] and deletes anything
- * above [x]. Used for disposing of temporaries.
- */
- cLog2by, /* log2by(x,y) = log2(x) * y */
- cNop, /* Used by fpoptimizer internally; should not occur in bytecode */
-#endif
- cSinCos, /* sin(x) followed by cos(x) (two values are pushed to stack) */
- cAbsAnd, /* As cAnd, but assume both operands are absolute values */
- cAbsOr, /* As cOr, but assume both operands are absolute values */
- cAbsNot, /* As cAbsNot, but assume the operand is an absolute value */
- cAbsNotNot, /* As cAbsNotNot, but assume the operand is an absolute value */
- cAbsIf, /* As cAbsIf, but assume the 1st operand is an absolute value */
-
- cDup, /* Duplicates the last value in the stack: Push [Stacktop] */
- cFetch, /* Same as Dup, except with absolute index
- * (next value is index) */
- cInv, /* Inverts the last value in the stack (x = 1/x) */
- cSqr, /* squares the last operand in the stack, no push/pop */
- cRDiv, /* reverse division (not x/y, but y/x) */
- cRSub, /* reverse subtraction (not x-y, but y-x) */
- cRSqrt, /* inverse square-root (1/sqrt(x)) */
-
- VarBegin
- };
-
-#ifdef ONCE_FPARSER_H_
- struct FuncDefinition
- {
- enum FunctionFlags
- {
- Enabled = 0x01,
- AngleIn = 0x02,
- AngleOut = 0x04,
- OkForInt = 0x08
- };
-
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
- const char name[8];
-#else
- struct name { } name;
-#endif
- unsigned params : 8;
- unsigned flags : 8;
-
- inline bool enabled() const { return flags != 0; }
- inline bool okForInt() const { return (flags & OkForInt) != 0; }
- };
-
-#ifndef FP_DISABLE_EVAL
-# define FP_EVAL_FUNCTION_ENABLED \
- FuncDefinition::Enabled | FuncDefinition::OkForInt
-#else
-# define FP_EVAL_FUNCTION_ENABLED 0
-#endif
-#ifdef FUNCTIONPARSER_SUPPORT_DEBUGGING
-# define FP_FNAME(n) n
-#else
-# define FP_FNAME(n) {}
-#endif
-// This list must be in the same order as that in OPCODE enum,
-// because the opcode value is used to index this array, and
-// the pointer to array element is used for generating the opcode.
- const FuncDefinition Functions[]=
- {
- /*cAbs */ { FP_FNAME("abs"), 1,
- FuncDefinition::Enabled | FuncDefinition::OkForInt },
- /*cAcos */ { FP_FNAME("acos"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleOut },
- /*cAcosh*/ { FP_FNAME("acosh"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleOut },
- /*cAsin */ { FP_FNAME("asin"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleOut },
- /*cAsinh*/ { FP_FNAME("asinh"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleOut },
- /*cAtan */ { FP_FNAME("atan"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleOut },
- /*cAtan2*/ { FP_FNAME("atan2"), 2,
- FuncDefinition::Enabled | FuncDefinition::AngleOut },
- /*cAtanh*/ { FP_FNAME("atanh"), 1, FuncDefinition::Enabled },
- /*cCbrt */ { FP_FNAME("cbrt"), 1, FuncDefinition::Enabled },
- /*cCeil */ { FP_FNAME("ceil"), 1, FuncDefinition::Enabled },
- /*cCos */ { FP_FNAME("cos"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cCosh */ { FP_FNAME("cosh"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cCot */ { FP_FNAME("cot"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cCsc */ { FP_FNAME("csc"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cEval */ { FP_FNAME("eval"), 0, FP_EVAL_FUNCTION_ENABLED },
- /*cExp */ { FP_FNAME("exp"), 1, FuncDefinition::Enabled },
- /*cExp2 */ { FP_FNAME("exp2"), 1, FuncDefinition::Enabled },
- /*cFloor*/ { FP_FNAME("floor"), 1, FuncDefinition::Enabled },
- /*cHypot*/ { FP_FNAME("hypot"), 2, FuncDefinition::Enabled },
- /*cIf */ { FP_FNAME("if"), 0,
- FuncDefinition::Enabled | FuncDefinition::OkForInt },
- /*cInt */ { FP_FNAME("int"), 1, FuncDefinition::Enabled },
- /*cLog */ { FP_FNAME("log"), 1, FuncDefinition::Enabled },
- /*cLog10*/ { FP_FNAME("log10"), 1, FuncDefinition::Enabled },
- /*cLog2 */ { FP_FNAME("log2"), 1, FuncDefinition::Enabled },
- /*cMax */ { FP_FNAME("max"), 2,
- FuncDefinition::Enabled | FuncDefinition::OkForInt },
- /*cMin */ { FP_FNAME("min"), 2,
- FuncDefinition::Enabled | FuncDefinition::OkForInt },
- /*cPow */ { FP_FNAME("pow"), 2, FuncDefinition::Enabled },
- /*cSec */ { FP_FNAME("sec"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cSin */ { FP_FNAME("sin"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cSinh */ { FP_FNAME("sinh"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cSqrt */ { FP_FNAME("sqrt"), 1,
- FuncDefinition::Enabled },
- /*cTan */ { FP_FNAME("tan"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cTanh */ { FP_FNAME("tanh"), 1,
- FuncDefinition::Enabled | FuncDefinition::AngleIn },
- /*cTrunc*/ { FP_FNAME("trunc"), 1,
- FuncDefinition::Enabled }
- };
-#undef FP_FNAME
-
- struct NamePtr
- {
- const char* name;
- unsigned nameLength;
-
- NamePtr(const char* n, unsigned l): name(n), nameLength(l) {}
-
- inline bool operator==(const NamePtr& rhs) const
- {
- return nameLength == rhs.nameLength
- && std::memcmp(name, rhs.name, nameLength) == 0;
- }
- inline bool operator<(const NamePtr& rhs) const
- {
- for(unsigned i = 0; i < nameLength; ++i)
- {
- if(i == rhs.nameLength) return false;
- const char c1 = name[i], c2 = rhs.name[i];
- if(c1 < c2) return true;
- if(c2 < c1) return false;
- }
- return nameLength < rhs.nameLength;
- }
- };
-
- template<typename Value_t>
- struct NameData
- {
- enum DataType { CONSTANT, UNIT, FUNC_PTR, PARSER_PTR, VARIABLE };
- DataType type;
- unsigned index;
- Value_t value;
-
- NameData(DataType t, unsigned v) : type(t), index(v), value() { }
- NameData(DataType t, Value_t v) : type(t), index(), value(v) { }
- NameData() { }
- };
-
- template<typename Value_t>
- class NamePtrsMap: public
- std::map<FUNCTIONPARSERTYPES::NamePtr,
- FUNCTIONPARSERTYPES::NameData<Value_t> >
- {
- };
-
- const unsigned FUNC_AMOUNT = sizeof(Functions)/sizeof(Functions[0]);
-#endif // ONCE_FPARSER_H_
-}
-
-#ifdef ONCE_FPARSER_H_
-#include <vector>
-
-template<typename Value_t>
-struct FunctionParserBase<Value_t>::Data
-{
- unsigned mReferenceCounter;
-
- unsigned mVariablesAmount;
- std::string mVariablesString;
- FUNCTIONPARSERTYPES::NamePtrsMap<Value_t> mNamePtrs;
-
- struct InlineVariable
- {
- FUNCTIONPARSERTYPES::NamePtr mName;
- unsigned mFetchIndex;
- };
-
- typedef std::vector<InlineVariable> InlineVarNamesContainer;
- InlineVarNamesContainer mInlineVarNames;
-
- struct FuncPtrData
- {
- union
- {
- FunctionPtr mFuncPtr;
- FunctionParserBase<Value_t>* mParserPtr;
- };
- unsigned mParams;
- };
-
- std::vector<FuncPtrData> mFuncPtrs;
- std::vector<FuncPtrData> mFuncParsers;
-
- std::vector<unsigned> mByteCode;
- std::vector<Value_t> mImmed;
-#if !defined(FP_USE_THREAD_SAFE_EVAL) && \
- !defined(FP_USE_THREAD_SAFE_EVAL_WITH_ALLOCA)
- std::vector<Value_t> mStack;
- // Note: When mStack exists,
- // mStack.size() and mStackSize are mutually redundant.
-#endif
- unsigned mStackSize;
-
- Data();
- Data(const Data&);
- Data& operator=(const Data&); // not implemented on purpose
- ~Data();
-};
-#endif
-
-#include "fpaux.hh"
-
-#endif
diff --git a/fparser/mpfr/GmpInt.cc b/fparser/mpfr/GmpInt.cc
deleted file mode 100644
index 490add4..0000000
--- a/fparser/mpfr/GmpInt.cc
+++ /dev/null
@@ -1,710 +0,0 @@
-#include "GmpInt.hh"
-#include <gmp.h>
-#include <deque>
-#include <vector>
-#include <cstring>
-#include <cctype>
-
-//===========================================================================
-// Shared data
-//===========================================================================
-namespace
-{
- unsigned long gIntDefaultNumberOfBits = 256;
-
- std::vector<char>& intString()
- {
- static std::vector<char> str;
- return str;
- }
-}
-
-//===========================================================================
-// Auxiliary structs
-//===========================================================================
-struct GmpInt::GmpIntData
-{
- unsigned mRefCount;
- GmpIntData* nextFreeNode;
- mpz_t mInteger;
-
- GmpIntData(): mRefCount(1), nextFreeNode(0) {}
-};
-
-class GmpInt::GmpIntDataContainer
-{
- std::deque<GmpInt::GmpIntData> mData;
- GmpInt::GmpIntData* mFirstFreeNode;
- GmpInt::GmpIntData* mConst_0;
-
- public:
- GmpIntDataContainer(): mFirstFreeNode(0), mConst_0(0) {}
-
- ~GmpIntDataContainer()
- {
- for(size_t i = 0; i < mData.size(); ++i)
- mpz_clear(mData[i].mInteger);
- }
-
- GmpInt::GmpIntData* allocateGmpIntData(unsigned long numberOfBits,
- bool initToZero)
- {
- if(mFirstFreeNode)
- {
- GmpInt::GmpIntData* node = mFirstFreeNode;
- mFirstFreeNode = node->nextFreeNode;
- if(initToZero) mpz_set_si(node->mInteger, 0);
- ++(node->mRefCount);
- return node;
- }
-
- mData.push_back(GmpInt::GmpIntData());
- if(numberOfBits > 0)
- mpz_init2(mData.back().mInteger, numberOfBits);
- else
- mpz_init(mData.back().mInteger);
- return &mData.back();
- }
-
- void releaseGmpIntData(GmpIntData* data)
- {
- if(--(data->mRefCount) == 0)
- {
- data->nextFreeNode = mFirstFreeNode;
- mFirstFreeNode = data;
- }
- }
-
- GmpInt::GmpIntData* const_0()
- {
- if(!mConst_0)
- mConst_0 = allocateGmpIntData(gIntDefaultNumberOfBits, true);
- return mConst_0;
- }
-};
-
-
-GmpInt::GmpIntDataContainer& GmpInt::gmpIntDataContainer()
-{
- static GmpIntDataContainer container;
- return container;
-}
-
-//===========================================================================
-// Auxiliary functions
-//===========================================================================
-void GmpInt::setDefaultNumberOfBits(unsigned long value)
-{
- gIntDefaultNumberOfBits = value;
-}
-
-unsigned long GmpInt::getDefaultNumberOfBits()
-{
- return gIntDefaultNumberOfBits;
-}
-
-inline void GmpInt::copyIfShared()
-{
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- GmpIntData* oldData = mData;
- mData = gmpIntDataContainer().allocateGmpIntData(0, false);
- mpz_set(mData->mInteger, oldData->mInteger);
- }
-}
-
-
-//===========================================================================
-// Constructors, destructor, assignment
-//===========================================================================
-GmpInt::GmpInt(DummyType):
- mData(gmpIntDataContainer().allocateGmpIntData(0, false))
-{}
-
-GmpInt::GmpInt()
-{
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
-}
-
-GmpInt::GmpInt(long value)
-{
- if(value == 0)
- {
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = gmpIntDataContainer().allocateGmpIntData
- (gIntDefaultNumberOfBits, false);
- mpz_set_si(mData->mInteger, value);
- }
-}
-
-GmpInt::GmpInt(unsigned long value)
-{
- if(value == 0)
- {
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = gmpIntDataContainer().allocateGmpIntData
- (gIntDefaultNumberOfBits, false);
- mpz_set_ui(mData->mInteger, value);
- }
-}
-
-GmpInt::GmpInt(int value)
-{
- if(value == 0)
- {
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = gmpIntDataContainer().allocateGmpIntData
- (gIntDefaultNumberOfBits, false);
- mpz_set_si(mData->mInteger, value);
- }
-}
-
-GmpInt::GmpInt(double value)
-{
- const double absValue = value >= 0.0 ? value : -value;
- if(absValue < 1.0)
- {
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = gmpIntDataContainer().allocateGmpIntData
- (gIntDefaultNumberOfBits, false);
- mpz_set_d(mData->mInteger, value);
- }
-}
-
-GmpInt::GmpInt(long double value)
-{
- const long double absValue = value >= 0.0L ? value : -value;
- if(absValue < 1.0L)
- {
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = gmpIntDataContainer().allocateGmpIntData
- (gIntDefaultNumberOfBits, false);
- mpz_set_d(mData->mInteger, double(value));
- }
-}
-
-GmpInt::GmpInt(const GmpInt& rhs):
- mData(rhs.mData)
-{
- ++(mData->mRefCount);
-}
-
-GmpInt& GmpInt::operator=(const GmpInt& rhs)
-{
- if(mData != rhs.mData)
- {
- gmpIntDataContainer().releaseGmpIntData(mData);
- mData = rhs.mData;
- ++(mData->mRefCount);
- }
- return *this;
-}
-
-GmpInt& GmpInt::operator=(signed long value)
-{
- if(value == 0)
- {
- gmpIntDataContainer().releaseGmpIntData(mData);
- mData = gmpIntDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- mData = gmpIntDataContainer().allocateGmpIntData
- (gIntDefaultNumberOfBits, false);
- }
- mpz_set_si(mData->mInteger, value);
- }
- return *this;
-}
-
-GmpInt::~GmpInt()
-{
- gmpIntDataContainer().releaseGmpIntData(mData);
-}
-
-
-//===========================================================================
-// Data getters
-//===========================================================================
-template<>
-void GmpInt::get_raw_mpfr_data<mpz_t>(mpz_t& dest_mpz_t)
-{
- std::memcpy(&dest_mpz_t, mData->mInteger, sizeof(mpz_t));
-}
-
-const char* GmpInt::getAsString(int base) const
-{
- intString().resize(mpz_sizeinbase(mData->mInteger, base) + 2);
- return mpz_get_str(&intString()[0], base, mData->mInteger);
-}
-
-long GmpInt::toInt() const
-{
- return mpz_get_si(mData->mInteger);
-}
-
-
-//===========================================================================
-// Modifying operators
-//===========================================================================
-GmpInt& GmpInt::operator+=(const GmpInt& rhs)
-{
- copyIfShared();
- mpz_add(mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return *this;
-}
-
-GmpInt& GmpInt::operator+=(long value)
-{
- copyIfShared();
- if(value >= 0)
- mpz_add_ui(mData->mInteger, mData->mInteger, value);
- else
- mpz_sub_ui(mData->mInteger, mData->mInteger, -value);
- return *this;
-}
-
-GmpInt& GmpInt::operator-=(const GmpInt& rhs)
-{
- copyIfShared();
- mpz_sub(mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return *this;
-}
-
-GmpInt& GmpInt::operator-=(long value)
-{
- copyIfShared();
- if(value >= 0)
- mpz_sub_ui(mData->mInteger, mData->mInteger, value);
- else
- mpz_add_ui(mData->mInteger, mData->mInteger, -value);
- return *this;
-}
-
-GmpInt& GmpInt::operator*=(const GmpInt& rhs)
-{
- copyIfShared();
- mpz_mul(mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return *this;
-}
-
-GmpInt& GmpInt::operator*=(long value)
-{
- copyIfShared();
- mpz_mul_si(mData->mInteger, mData->mInteger, value);
- return *this;
-}
-
-GmpInt& GmpInt::operator/=(const GmpInt& rhs)
-{
- copyIfShared();
- mpz_tdiv_q(mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return *this;
-}
-
-GmpInt& GmpInt::operator/=(long value)
-{
- copyIfShared();
- if(value >= 0)
- mpz_tdiv_q_ui(mData->mInteger, mData->mInteger, value);
- else
- {
- mpz_neg(mData->mInteger, mData->mInteger);
- mpz_tdiv_q_ui(mData->mInteger, mData->mInteger, -value);
- }
- return *this;
-}
-
-GmpInt& GmpInt::operator%=(const GmpInt& rhs)
-{
- copyIfShared();
- if(operator<(0))
- {
- negate();
- mpz_mod(mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- negate();
- }
- else
- {
- mpz_mod(mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- }
- return *this;
-}
-
-GmpInt& GmpInt::operator%=(long value)
-{
- copyIfShared();
- if(value < 0) value = -value;
- if(operator<(0))
- {
- negate();
- mpz_mod_ui(mData->mInteger, mData->mInteger, value);
- negate();
- }
- else
- {
- mpz_mod_ui(mData->mInteger, mData->mInteger, value);
- }
- return *this;
-}
-
-GmpInt& GmpInt::operator<<=(unsigned long bits)
-{
- copyIfShared();
- mpz_mul_2exp(mData->mInteger, mData->mInteger, bits);
- return *this;
-}
-
-GmpInt& GmpInt::operator>>=(unsigned long bits)
-{
- copyIfShared();
- mpz_tdiv_q_2exp(mData->mInteger, mData->mInteger, bits);
- return *this;
-}
-
-
-//===========================================================================
-// Modifying functions
-//===========================================================================
-void GmpInt::addProduct(const GmpInt& value1, const GmpInt& value2)
-{
- copyIfShared();
- mpz_addmul(mData->mInteger, value1.mData->mInteger, value2.mData->mInteger);
-}
-
-void GmpInt::addProduct(const GmpInt& value1, unsigned long value2)
-{
- copyIfShared();
- mpz_addmul_ui(mData->mInteger, value1.mData->mInteger, value2);
-}
-
-void GmpInt::subProduct(const GmpInt& value1, const GmpInt& value2)
-{
- copyIfShared();
- mpz_submul(mData->mInteger, value1.mData->mInteger, value2.mData->mInteger);
-}
-
-void GmpInt::subProduct(const GmpInt& value1, unsigned long value2)
-{
- copyIfShared();
- mpz_submul_ui(mData->mInteger, value1.mData->mInteger, value2);
-}
-
-void GmpInt::negate()
-{
- copyIfShared();
- mpz_neg(mData->mInteger, mData->mInteger);
-}
-
-void GmpInt::abs()
-{
- copyIfShared();
- mpz_abs(mData->mInteger, mData->mInteger);
-}
-
-GmpInt GmpInt::abs(const GmpInt& value)
-{
- GmpInt retval(kNoInitialization);
- mpz_abs(retval.mData->mInteger, value.mData->mInteger);
- return retval;
-}
-
-
-//===========================================================================
-// Non-modifying operators
-//===========================================================================
-GmpInt GmpInt::operator+(const GmpInt& rhs) const
-{
- GmpInt retval(kNoInitialization);
- mpz_add(retval.mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return retval;
-}
-
-GmpInt GmpInt::operator+(long value) const
-{
- GmpInt retval(kNoInitialization);
- if(value >= 0)
- mpz_add_ui(retval.mData->mInteger, mData->mInteger, value);
- else
- mpz_sub_ui(retval.mData->mInteger, mData->mInteger, -value);
- return retval;
-}
-
-GmpInt GmpInt::operator-(const GmpInt& rhs) const
-{
- GmpInt retval(kNoInitialization);
- mpz_sub(retval.mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return retval;
-}
-
-GmpInt GmpInt::operator-(long value) const
-{
- GmpInt retval(kNoInitialization);
- if(value >= 0)
- mpz_sub_ui(retval.mData->mInteger, mData->mInteger, value);
- else
- mpz_add_ui(retval.mData->mInteger, mData->mInteger, -value);
- return retval;
-}
-
-GmpInt GmpInt::operator*(const GmpInt& rhs) const
-{
- GmpInt retval(kNoInitialization);
- mpz_mul(retval.mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return retval;
-}
-
-GmpInt GmpInt::operator*(long value) const
-{
- GmpInt retval(kNoInitialization);
- mpz_mul_si(retval.mData->mInteger, mData->mInteger, value);
- return retval;
-}
-
-GmpInt GmpInt::operator/(const GmpInt& rhs) const
-{
- GmpInt retval(kNoInitialization);
- mpz_tdiv_q(retval.mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- return retval;
-}
-
-GmpInt GmpInt::operator/(long value) const
-{
- GmpInt retval(kNoInitialization);
- if(value >= 0)
- mpz_tdiv_q_ui(retval.mData->mInteger, mData->mInteger, value);
- else
- {
- mpz_neg(retval.mData->mInteger, mData->mInteger);
- mpz_tdiv_q_ui(retval.mData->mInteger, retval.mData->mInteger, -value);
- }
- return retval;
-}
-
-GmpInt GmpInt::operator%(const GmpInt& rhs) const
-{
- GmpInt retval(kNoInitialization);
- if(operator<(0))
- {
- mpz_neg(retval.mData->mInteger, mData->mInteger);
- mpz_mod(retval.mData->mInteger,
- retval.mData->mInteger, rhs.mData->mInteger);
- retval.negate();
- }
- else
- {
- mpz_mod(retval.mData->mInteger, mData->mInteger, rhs.mData->mInteger);
- }
- return retval;
-}
-
-GmpInt GmpInt::operator%(long value) const
-{
- GmpInt retval(kNoInitialization);
- if(value < 0) value = -value;
- if(operator<(0))
- {
- mpz_neg(retval.mData->mInteger, mData->mInteger);
- mpz_mod_ui(retval.mData->mInteger, retval.mData->mInteger, value);
- retval.negate();
- }
- else
- {
- mpz_mod_ui(retval.mData->mInteger, mData->mInteger, value);
- }
- return retval;
-}
-
-GmpInt GmpInt::operator-() const
-{
- GmpInt retval(kNoInitialization);
- mpz_neg(retval.mData->mInteger, mData->mInteger);
- return retval;
-}
-
-GmpInt GmpInt::operator<<(unsigned long bits) const
-{
- GmpInt retval(kNoInitialization);
- mpz_mul_2exp(retval.mData->mInteger, mData->mInteger, bits);
- return retval;
-}
-
-GmpInt GmpInt::operator>>(unsigned long bits) const
-{
- GmpInt retval(kNoInitialization);
- mpz_tdiv_q_2exp(retval.mData->mInteger, mData->mInteger, bits);
- return retval;
-}
-
-
-//===========================================================================
-// Comparison operators
-//===========================================================================
-bool GmpInt::operator<(const GmpInt& rhs) const
-{
- return mpz_cmp(mData->mInteger, rhs.mData->mInteger) < 0;
-}
-
-bool GmpInt::operator<(long value) const
-{
- return mpz_cmp_si(mData->mInteger, value) < 0;
-}
-
-bool GmpInt::operator<=(const GmpInt& rhs) const
-{
- return mpz_cmp(mData->mInteger, rhs.mData->mInteger) <= 0;
-}
-
-bool GmpInt::operator<=(long value) const
-{
- return mpz_cmp_si(mData->mInteger, value) <= 0;
-}
-
-bool GmpInt::operator>(const GmpInt& rhs) const
-{
- return mpz_cmp(mData->mInteger, rhs.mData->mInteger) > 0;
-}
-
-bool GmpInt::operator>(long value) const
-{
- return mpz_cmp_si(mData->mInteger, value) > 0;
-}
-
-bool GmpInt::operator>=(const GmpInt& rhs) const
-{
- return mpz_cmp(mData->mInteger, rhs.mData->mInteger) >= 0;
-}
-
-bool GmpInt::operator>=(long value) const
-{
- return mpz_cmp_si(mData->mInteger, value) >= 0;
-}
-
-bool GmpInt::operator==(const GmpInt& rhs) const
-{
- return mpz_cmp(mData->mInteger, rhs.mData->mInteger) == 0;
-}
-
-bool GmpInt::operator==(long value) const
-{
- return mpz_cmp_si(mData->mInteger, value) == 0;
-}
-
-bool GmpInt::operator!=(const GmpInt& rhs) const
-{
- return mpz_cmp(mData->mInteger, rhs.mData->mInteger) != 0;
-}
-
-bool GmpInt::operator!=(long value) const
-{
- return mpz_cmp_si(mData->mInteger, value) != 0;
-}
-
-void GmpInt::parseValue(const char* value)
-{
- mpz_set_str(mData->mInteger, value, 10);
-}
-
-void GmpInt::parseValue(const char* value, char** endptr)
-{
- static std::vector<char> str;
-
- unsigned startIndex = 0;
- while(value[startIndex] && std::isspace(value[startIndex])) ++startIndex;
- if(!value[startIndex]) { *endptr = const_cast<char*>(value); return; }
-
- unsigned endIndex = startIndex;
- if(value[endIndex] == '-') ++endIndex;
- if(!std::isdigit(value[endIndex]))
- { *endptr = const_cast<char*>(value); return; }
- if(value[endIndex] == '0' && value[endIndex+1] == 'x')
- {
- endIndex += 1;
- while(std::isxdigit(value[++endIndex])) {}
- }
- else
- {
- while(std::isdigit(value[++endIndex])) {}
- }
-
- str.reserve(endIndex - startIndex + 1);
- str.assign(value + startIndex, value + endIndex);
- str.push_back(0);
-
- mpz_set_str(mData->mInteger, &str[0], 0);
- *endptr = const_cast<char*>(value + endIndex);
-}
-
-GmpInt GmpInt::parseString(const char* str, char** endptr)
-{
- GmpInt retval(kNoInitialization);
- retval.parseValue(str, endptr);
- return retval;
-}
-
-//===========================================================================
-// Operator functions
-//===========================================================================
-GmpInt operator+(long lhs, const GmpInt& rhs)
-{
- GmpInt retval(GmpInt::kNoInitialization);
- if(lhs >= 0)
- mpz_add_ui(retval.mData->mInteger, rhs.mData->mInteger, lhs);
- else
- mpz_sub_ui(retval.mData->mInteger, rhs.mData->mInteger, -lhs);
- return retval;
-}
-
-GmpInt operator-(long lhs, const GmpInt& rhs)
-{
- GmpInt retval(GmpInt::kNoInitialization);
- if(lhs >= 0)
- mpz_ui_sub(retval.mData->mInteger, lhs, rhs.mData->mInteger);
- else
- {
- mpz_add_ui(retval.mData->mInteger, rhs.mData->mInteger, -lhs);
- mpz_neg(retval.mData->mInteger, retval.mData->mInteger);
- }
- return retval;
-}
-
-GmpInt operator*(long lhs, const GmpInt& rhs)
-{
- return rhs * lhs;
-}
-
-GmpInt operator/(long lhs, const GmpInt& rhs)
-{
- return GmpInt(lhs) / rhs;
-}
-
-GmpInt operator%(long lhs, const GmpInt& rhs)
-{
- return GmpInt(lhs) % rhs;
-}
diff --git a/fparser/mpfr/GmpInt.hh b/fparser/mpfr/GmpInt.hh
deleted file mode 100644
index 1c1c171..0000000
--- a/fparser/mpfr/GmpInt.hh
+++ /dev/null
@@ -1,148 +0,0 @@
-#ifndef ONCE_FP_GMP_INT_HH_
-#define ONCE_FP_GMP_INT_HH_
-
-#include <iostream>
-
-class GmpInt
-{
- public:
- /* A default of 256 bits will be used for all newly-instantiated GmpInt
- objects. This default can be changed with the function below.
- */
- static void setDefaultNumberOfBits(unsigned long);
- static unsigned long getDefaultNumberOfBits();
-
- GmpInt();
- GmpInt(long value);
- GmpInt(unsigned long value);
- GmpInt(int value);
- GmpInt(double value);
- GmpInt(long double value);
-
- GmpInt(const GmpInt&);
- GmpInt& operator=(const GmpInt&);
- GmpInt& operator=(signed long value);
-
- ~GmpInt();
-
-
- /* This function can be used to retrieve the raw mpz_t data structure
- used by this object. (The template trick is used to avoid a dependency
- of this header file with <gmp.h>.)
- In other words, it can be called like:
-
- mpz_t raw_mpz_data;
- intValue.get_raw_mpz_data(raw_mpz_data);
-
- Note that the returned mpz_t should be considered as read-only and
- not be modified from the outside because it may be shared among
- several objects. If the calling code needs to modify the data, it
- should copy it for itself first with the appropriate GMP library
- functions.
- */
- template<typename Mpz_t>
- void get_raw_mpfr_data(Mpz_t& dest_mpz_t);
-
-
- // Note that the returned char* points to an internal (shared) buffer
- // which will be valid until the next time this function is called
- // (by any object).
- const char* getAsString(int base = 10) const;
- long toInt() const;
-
- GmpInt& operator+=(const GmpInt&);
- GmpInt& operator+=(long);
- GmpInt& operator-=(const GmpInt&);
- GmpInt& operator-=(long);
- GmpInt& operator*=(const GmpInt&);
- GmpInt& operator*=(long);
- GmpInt& operator/=(const GmpInt&);
- GmpInt& operator/=(long);
- GmpInt& operator%=(const GmpInt&);
- GmpInt& operator%=(long);
-
- GmpInt& operator<<=(unsigned long);
- GmpInt& operator>>=(unsigned long);
-
- // Equivalent to "+= value1 * value2;"
- void addProduct(const GmpInt& value1, const GmpInt& value2);
- void addProduct(const GmpInt& value1, unsigned long value2);
-
- // Equivalent to "-= value1 * value2;"
- void subProduct(const GmpInt& value1, const GmpInt& value2);
- void subProduct(const GmpInt& value1, unsigned long value2);
-
- void negate();
- void abs();
- static GmpInt abs(const GmpInt&);
-
- GmpInt operator+(const GmpInt&) const;
- GmpInt operator+(long) const;
- GmpInt operator-(const GmpInt&) const;
- GmpInt operator-(long) const;
- GmpInt operator*(const GmpInt&) const;
- GmpInt operator*(long) const;
- GmpInt operator/(const GmpInt&) const;
- GmpInt operator/(long) const;
- GmpInt operator%(const GmpInt&) const;
- GmpInt operator%(long) const;
-
- GmpInt operator-() const;
-
- GmpInt operator<<(unsigned long) const;
- GmpInt operator>>(unsigned long) const;
-
- bool operator<(const GmpInt&) const;
- bool operator<(long) const;
- bool operator<=(const GmpInt&) const;
- bool operator<=(long) const;
- bool operator>(const GmpInt&) const;
- bool operator>(long) const;
- bool operator>=(const GmpInt&) const;
- bool operator>=(long) const;
- bool operator==(const GmpInt&) const;
- bool operator==(long) const;
- bool operator!=(const GmpInt&) const;
- bool operator!=(long) const;
-
- void parseValue(const char* value);
- void parseValue(const char* value, char** endptr);
- static GmpInt parseString(const char* str, char** endptr);
-
-
- private:
- struct GmpIntData;
- class GmpIntDataContainer;
-
- GmpIntData* mData;
-
- enum DummyType { kNoInitialization };
- GmpInt(DummyType);
-
- void copyIfShared();
- static GmpIntDataContainer& gmpIntDataContainer();
-
- friend GmpInt operator+(long lhs, const GmpInt& rhs);
- friend GmpInt operator-(long lhs, const GmpInt& rhs);
-};
-
-GmpInt operator+(long lhs, const GmpInt& rhs);
-GmpInt operator-(long lhs, const GmpInt& rhs);
-GmpInt operator*(long lhs, const GmpInt& rhs);
-GmpInt operator/(long lhs, const GmpInt& rhs);
-GmpInt operator%(long lhs, const GmpInt& rhs);
-
-inline bool operator<(long lhs, const GmpInt& rhs) { return rhs > lhs; }
-inline bool operator<=(long lhs, const GmpInt& rhs) { return rhs >= lhs; }
-inline bool operator>(long lhs, const GmpInt& rhs) { return rhs < lhs; }
-inline bool operator>=(long lhs, const GmpInt& rhs) { return rhs <= lhs; }
-inline bool operator==(long lhs, const GmpInt& rhs) { return rhs == lhs; }
-inline bool operator!=(long lhs, const GmpInt& rhs) { return rhs != lhs; }
-
-inline std::ostream& operator<<(std::ostream& os, const GmpInt& value)
-{
- os << value.getAsString();
- return os;
-}
-
-#endif
diff --git a/fparser/mpfr/MpfrFloat.cc b/fparser/mpfr/MpfrFloat.cc
deleted file mode 100644
index 387d1e8..0000000
--- a/fparser/mpfr/MpfrFloat.cc
+++ /dev/null
@@ -1,974 +0,0 @@
-#include "MpfrFloat.hh"
-#include <stdio.h>
-#include <mpfr.h>
-#include <deque>
-#include <vector>
-#include <cstring>
-#include <cassert>
-
-//===========================================================================
-// Auxiliary structs
-//===========================================================================
-struct MpfrFloat::MpfrFloatData
-{
- unsigned mRefCount;
- MpfrFloatData* nextFreeNode;
- mpfr_t mFloat;
-
- MpfrFloatData(): mRefCount(1), nextFreeNode(0) {}
-};
-
-class MpfrFloat::MpfrFloatDataContainer
-{
- unsigned long mDefaultPrecision;
- std::deque<MpfrFloatData> mData;
- MpfrFloatData* mFirstFreeNode;
-
- MpfrFloatData
- *mConst_0, *mConst_pi, *mConst_e, *mConst_log2, *mConst_epsilon;
-
- void recalculateEpsilon()
- {
- mpfr_set_si(mConst_epsilon->mFloat, 1, GMP_RNDN);
- mpfr_div_2ui(mConst_epsilon->mFloat, mConst_epsilon->mFloat,
- mDefaultPrecision*7/8 - 1, GMP_RNDN);
- }
-
- public:
- MpfrFloatDataContainer():
- mDefaultPrecision(256), mFirstFreeNode(0),
- mConst_pi(0), mConst_e(0), mConst_log2(0), mConst_epsilon(0)
- {}
-
- ~MpfrFloatDataContainer()
- {
- for(size_t i = 0; i < mData.size(); ++i)
- mpfr_clear(mData[i].mFloat);
- }
-
- MpfrFloatData* allocateMpfrFloatData(bool initToZero)
- {
- if(mFirstFreeNode)
- {
- MpfrFloatData* node = mFirstFreeNode;
- mFirstFreeNode = node->nextFreeNode;
- if(initToZero) mpfr_set_si(node->mFloat, 0, GMP_RNDN);
- ++(node->mRefCount);
- return node;
- }
-
- mData.push_back(MpfrFloatData());
- mpfr_init2(mData.back().mFloat, mDefaultPrecision);
- if(initToZero) mpfr_set_si(mData.back().mFloat, 0, GMP_RNDN);
- return &mData.back();
- }
-
- void releaseMpfrFloatData(MpfrFloatData* data)
- {
- if(--(data->mRefCount) == 0)
- {
- data->nextFreeNode = mFirstFreeNode;
- mFirstFreeNode = data;
- }
- }
-
- void setDefaultPrecision(unsigned long bits)
- {
- if(bits != mDefaultPrecision)
- {
- mDefaultPrecision = bits;
- for(size_t i = 0; i < mData.size(); ++i)
- mpfr_prec_round(mData[i].mFloat, bits, GMP_RNDN);
-
- if(mConst_pi) mpfr_const_pi(mConst_pi->mFloat, GMP_RNDN);
- if(mConst_e)
- {
- mpfr_set_si(mConst_e->mFloat, 1, GMP_RNDN);
- mpfr_exp(mConst_e->mFloat, mConst_e->mFloat, GMP_RNDN);
- }
- if(mConst_log2) mpfr_const_log2(mConst_log2->mFloat, GMP_RNDN);
- if(mConst_epsilon) recalculateEpsilon();
- }
- }
-
- unsigned long getDefaultPrecision() const
- {
- return mDefaultPrecision;
- }
-
- MpfrFloatData* const_0()
- {
- if(!mConst_0) mConst_0 = allocateMpfrFloatData(true);
- return mConst_0;
- }
-
- MpfrFloat const_pi()
- {
- if(!mConst_pi)
- {
- mConst_pi = allocateMpfrFloatData(false);
- mpfr_const_pi(mConst_pi->mFloat, GMP_RNDN);
- }
- return MpfrFloat(mConst_pi);
- }
-
- MpfrFloat const_e()
- {
- if(!mConst_e)
- {
- mConst_e = allocateMpfrFloatData(false);
- mpfr_set_si(mConst_e->mFloat, 1, GMP_RNDN);
- mpfr_exp(mConst_e->mFloat, mConst_e->mFloat, GMP_RNDN);
- }
- return MpfrFloat(mConst_e);
- }
-
- MpfrFloat const_log2()
- {
- if(!mConst_log2)
- {
- mConst_log2 = allocateMpfrFloatData(false);
- mpfr_const_log2(mConst_log2->mFloat, GMP_RNDN);
- }
- return MpfrFloat(mConst_log2);
- }
-
- MpfrFloat const_epsilon()
- {
- if(!mConst_epsilon)
- {
- mConst_epsilon = allocateMpfrFloatData(false);
- recalculateEpsilon();
- }
- return MpfrFloat(mConst_epsilon);
- }
-};
-
-
-//===========================================================================
-// Shared data
-//===========================================================================
-// This should ensure that the container is not accessed by any MpfrFloat
-// instance before it has been constructed or after it has been destroyed
-// (which might otherwise happen if MpfrFloat is instantiated globally.)
-MpfrFloat::MpfrFloatDataContainer& MpfrFloat::mpfrFloatDataContainer()
-{
- static MpfrFloat::MpfrFloatDataContainer container;
- return container;
-}
-
-
-//===========================================================================
-// Auxiliary functions
-//===========================================================================
-void MpfrFloat::setDefaultMantissaBits(unsigned long bits)
-{
- mpfrFloatDataContainer().setDefaultPrecision(bits);
-}
-
-unsigned long MpfrFloat::getCurrentDefaultMantissaBits()
-{
- return mpfrFloatDataContainer().getDefaultPrecision();
-}
-
-inline void MpfrFloat::copyIfShared()
-{
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- MpfrFloatData* oldData = mData;
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- mpfr_set(mData->mFloat, oldData->mFloat, GMP_RNDN);
- }
-}
-
-
-//===========================================================================
-// Constructors, destructor, assignment
-//===========================================================================
-MpfrFloat::MpfrFloat(DummyType):
- mData(mpfrFloatDataContainer().allocateMpfrFloatData(false))
-{}
-
-MpfrFloat::MpfrFloat(MpfrFloatData* data):
- mData(data)
-{
- assert(data != 0);
- ++(mData->mRefCount);
-}
-
-MpfrFloat::MpfrFloat():
- mData(mpfrFloatDataContainer().const_0())
-{
- ++(mData->mRefCount);
-}
-
-MpfrFloat::MpfrFloat(double value)
-{
- if(value == 0.0)
- {
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- mpfr_set_d(mData->mFloat, value, GMP_RNDN);
- }
-}
-
-MpfrFloat::MpfrFloat(long double value)
-{
- if(value == 0.0L)
- {
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- mpfr_set_ld(mData->mFloat, value, GMP_RNDN);
- }
-}
-
-MpfrFloat::MpfrFloat(long value)
-{
- if(value == 0)
- {
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- mpfr_set_si(mData->mFloat, value, GMP_RNDN);
- }
-}
-
-MpfrFloat::MpfrFloat(int value)
-{
- if(value == 0)
- {
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- mpfr_set_si(mData->mFloat, value, GMP_RNDN);
- }
-}
-
-MpfrFloat::MpfrFloat(const char* value, char** endptr):
- mData(mpfrFloatDataContainer().allocateMpfrFloatData(false))
-{
- mpfr_strtofr(mData->mFloat, value, endptr, 0, GMP_RNDN);
-}
-
-MpfrFloat::~MpfrFloat()
-{
- mpfrFloatDataContainer().releaseMpfrFloatData(mData);
-}
-
-MpfrFloat::MpfrFloat(const MpfrFloat& rhs):
- mData(rhs.mData)
-{
- ++(mData->mRefCount);
-}
-
-MpfrFloat& MpfrFloat::operator=(const MpfrFloat& rhs)
-{
- if(mData != rhs.mData)
- {
- mpfrFloatDataContainer().releaseMpfrFloatData(mData);
- mData = rhs.mData;
- ++(mData->mRefCount);
- }
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator=(double value)
-{
- if(value == 0.0)
- {
- mpfrFloatDataContainer().releaseMpfrFloatData(mData);
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- }
- mpfr_set_d(mData->mFloat, value, GMP_RNDN);
- }
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator=(long double value)
-{
- if(value == 0.0L)
- {
- mpfrFloatDataContainer().releaseMpfrFloatData(mData);
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- }
- mpfr_set_ld(mData->mFloat, value, GMP_RNDN);
- }
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator=(long value)
-{
- if(value == 0)
- {
- mpfrFloatDataContainer().releaseMpfrFloatData(mData);
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- }
- mpfr_set_si(mData->mFloat, value, GMP_RNDN);
- }
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator=(int value)
-{
- if(value == 0)
- {
- mpfrFloatDataContainer().releaseMpfrFloatData(mData);
- mData = mpfrFloatDataContainer().const_0();
- ++(mData->mRefCount);
- }
- else
- {
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- }
- mpfr_set_si(mData->mFloat, value, GMP_RNDN);
- }
- return *this;
-}
-
-/*
-MpfrFloat& MpfrFloat::operator=(const char* value)
-{
- if(mData->mRefCount > 1)
- {
- --(mData->mRefCount);
- mData = mpfrFloatDataContainer().allocateMpfrFloatData(false);
- }
-
- mpfr_set_str(mData->mFloat, value, 10, GMP_RNDN);
- return *this;
-}
-*/
-
-void MpfrFloat::parseValue(const char* value)
-{
- copyIfShared();
- mpfr_set_str(mData->mFloat, value, 10, GMP_RNDN);
-}
-
-void MpfrFloat::parseValue(const char* value, char** endptr)
-{
- copyIfShared();
- mpfr_strtofr(mData->mFloat, value, endptr, 0, GMP_RNDN);
-}
-
-
-//===========================================================================
-// Data getters
-//===========================================================================
-template<>
-void MpfrFloat::get_raw_mpfr_data<mpfr_t>(mpfr_t& dest_mpfr_t)
-{
- std::memcpy(&dest_mpfr_t, mData->mFloat, sizeof(mpfr_t));
-}
-
-const char* MpfrFloat::getAsString(unsigned precision) const
-{
-#if(MPFR_VERSION_MAJOR < 2 || (MPFR_VERSION_MAJOR == 2 && MPFR_VERSION_MINOR < 4))
- static const char* retval =
- "[mpfr_snprintf() is not supported in mpfr versions prior to 2.4]";
- return retval;
-#else
- static std::vector<char> str;
- str.resize(precision+30);
- mpfr_snprintf(&(str[0]), precision+30, "%.*RNg", precision, mData->mFloat);
- return &(str[0]);
-#endif
-}
-
-bool MpfrFloat::isInteger() const
-{
- return mpfr_integer_p(mData->mFloat) != 0;
-}
-
-long MpfrFloat::toInt() const
-{
- return mpfr_get_si(mData->mFloat, GMP_RNDN);
-}
-
-double MpfrFloat::toDouble() const
-{
- return mpfr_get_d(mData->mFloat, GMP_RNDN);
-}
-
-
-//===========================================================================
-// Modifying operators
-//===========================================================================
-MpfrFloat& MpfrFloat::operator+=(const MpfrFloat& rhs)
-{
- copyIfShared();
- mpfr_add(mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator+=(double value)
-{
- copyIfShared();
- mpfr_add_d(mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator-=(const MpfrFloat& rhs)
-{
- copyIfShared();
- mpfr_sub(mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator-=(double value)
-{
- copyIfShared();
- mpfr_sub_d(mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator*=(const MpfrFloat& rhs)
-{
- copyIfShared();
- mpfr_mul(mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator*=(double value)
-{
- copyIfShared();
- mpfr_mul_d(mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator/=(const MpfrFloat& rhs)
-{
- copyIfShared();
- mpfr_div(mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator/=(double value)
-{
- copyIfShared();
- mpfr_div_d(mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return *this;
-}
-
-MpfrFloat& MpfrFloat::operator%=(const MpfrFloat& rhs)
-{
- copyIfShared();
- mpfr_fmod(mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return *this;
-}
-
-
-//===========================================================================
-// Modifying functions
-//===========================================================================
-void MpfrFloat::negate()
-{
- copyIfShared();
- mpfr_neg(mData->mFloat, mData->mFloat, GMP_RNDN);
-}
-
-void MpfrFloat::abs()
-{
- copyIfShared();
- mpfr_abs(mData->mFloat, mData->mFloat, GMP_RNDN);
-}
-
-
-//===========================================================================
-// Non-modifying operators
-//===========================================================================
-MpfrFloat MpfrFloat::operator+(const MpfrFloat& rhs) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_add(retval.mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator+(double value) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_add_d(retval.mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator-(const MpfrFloat& rhs) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_sub(retval.mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator-(double value) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_sub_d(retval.mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator*(const MpfrFloat& rhs) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_mul(retval.mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator*(double value) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_mul_d(retval.mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator/(const MpfrFloat& rhs) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_div(retval.mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator/(double value) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_div_d(retval.mData->mFloat, mData->mFloat, value, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator%(const MpfrFloat& rhs) const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_fmod(retval.mData->mFloat, mData->mFloat, rhs.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::operator-() const
-{
- MpfrFloat retval(kNoInitialization);
- mpfr_neg(retval.mData->mFloat, mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-
-
-//===========================================================================
-// Comparison operators
-//===========================================================================
-bool MpfrFloat::operator<(const MpfrFloat& rhs) const
-{
- return mpfr_cmp(mData->mFloat, rhs.mData->mFloat) < 0;
-}
-
-bool MpfrFloat::operator<(double value) const
-{
- return mpfr_cmp_d(mData->mFloat, value) < 0;
-}
-
-bool MpfrFloat::operator<=(const MpfrFloat& rhs) const
-{
- return mpfr_cmp(mData->mFloat, rhs.mData->mFloat) <= 0;
-}
-
-bool MpfrFloat::operator<=(double value) const
-{
- return mpfr_cmp_d(mData->mFloat, value) <= 0;
-}
-
-bool MpfrFloat::operator>(const MpfrFloat& rhs) const
-{
- return mpfr_cmp(mData->mFloat, rhs.mData->mFloat) > 0;
-}
-
-bool MpfrFloat::operator>(double value) const
-{
- return mpfr_cmp_d(mData->mFloat, value) > 0;
-}
-
-bool MpfrFloat::operator>=(const MpfrFloat& rhs) const
-{
- return mpfr_cmp(mData->mFloat, rhs.mData->mFloat) >= 0;
-}
-
-bool MpfrFloat::operator>=(double value) const
-{
- return mpfr_cmp_d(mData->mFloat, value) >= 0;
-}
-
-bool MpfrFloat::operator==(const MpfrFloat& rhs) const
-{
- return mpfr_cmp(mData->mFloat, rhs.mData->mFloat) == 0;
-}
-
-bool MpfrFloat::operator==(double value) const
-{
- return mpfr_cmp_d(mData->mFloat, value) == 0;
-}
-
-bool MpfrFloat::operator!=(const MpfrFloat& rhs) const
-{
- return mpfr_cmp(mData->mFloat, rhs.mData->mFloat) != 0;
-}
-
-bool MpfrFloat::operator!=(double value) const
-{
- return mpfr_cmp_d(mData->mFloat, value) != 0;
-}
-
-
-//===========================================================================
-// Operator functions
-//===========================================================================
-MpfrFloat operator+(double lhs, const MpfrFloat& rhs)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_add_d(retval.mData->mFloat, rhs.mData->mFloat, lhs, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat operator-(double lhs, const MpfrFloat& rhs)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_d_sub(retval.mData->mFloat, lhs, rhs.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat operator*(double lhs, const MpfrFloat& rhs)
-{
- return rhs * lhs;
-}
-
-MpfrFloat operator/(double lhs, const MpfrFloat& rhs)
-{
- return MpfrFloat(lhs) / rhs;
-}
-
-MpfrFloat operator%(double lhs, const MpfrFloat& rhs)
-{
- return MpfrFloat(lhs) % rhs;
-}
-
-std::ostream& operator<<(std::ostream& os, const MpfrFloat& value)
-{
- os << value.getAsString(unsigned(os.precision()));
- return os;
-}
-
-//===========================================================================
-// Static functions
-//===========================================================================
-MpfrFloat MpfrFloat::log(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_log(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::log2(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_log2(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::log10(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_log10(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::exp(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_exp(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::exp2(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_exp2(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::exp10(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_exp10(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::cos(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_cos(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::sin(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_sin(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::tan(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_tan(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::sec(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_sec(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::csc(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_csc(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::cot(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_cot(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-void MpfrFloat::sincos(const MpfrFloat& value,
- MpfrFloat& sin,
- MpfrFloat& cos)
-{
- mpfr_sin_cos(
- sin.mData->mFloat, cos.mData->mFloat, value.mData->mFloat, GMP_RNDN);
-}
-
-MpfrFloat MpfrFloat::acos(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_acos(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::asin(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_asin(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::atan(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_atan(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::atan2(const MpfrFloat& value1, const MpfrFloat& value2)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_atan2(retval.mData->mFloat,
- value1.mData->mFloat, value2.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::hypot(const MpfrFloat& value1, const MpfrFloat& value2)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_hypot(retval.mData->mFloat,
- value1.mData->mFloat, value2.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::cosh(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_cosh(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::sinh(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_sinh(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::tanh(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_tanh(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::acosh(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_acosh(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::asinh(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_asinh(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::atanh(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_atanh(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::sqrt(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_sqrt(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::cbrt(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_cbrt(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::root(const MpfrFloat& value, unsigned long root)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_root(retval.mData->mFloat, value.mData->mFloat, root, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::pow(const MpfrFloat& value1, const MpfrFloat& value2)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_pow(retval.mData->mFloat,
- value1.mData->mFloat, value2.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::pow(const MpfrFloat& value, long exponent)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_pow_si(retval.mData->mFloat, value.mData->mFloat, exponent, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::abs(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_abs(retval.mData->mFloat, value.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::dim(const MpfrFloat& value1, const MpfrFloat& value2)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_dim(retval.mData->mFloat,
- value1.mData->mFloat, value2.mData->mFloat, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::round(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_round(retval.mData->mFloat, value.mData->mFloat);
- return retval;
-}
-
-MpfrFloat MpfrFloat::ceil(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_ceil(retval.mData->mFloat, value.mData->mFloat);
- return retval;
-}
-
-MpfrFloat MpfrFloat::floor(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_floor(retval.mData->mFloat, value.mData->mFloat);
- return retval;
-}
-
-MpfrFloat MpfrFloat::trunc(const MpfrFloat& value)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_trunc(retval.mData->mFloat, value.mData->mFloat);
- return retval;
-}
-
-MpfrFloat MpfrFloat::parseString(const char* str, char** endptr)
-{
- MpfrFloat retval(MpfrFloat::kNoInitialization);
- mpfr_strtofr(retval.mData->mFloat, str, endptr, 0, GMP_RNDN);
- return retval;
-}
-
-MpfrFloat MpfrFloat::const_pi()
-{
- return mpfrFloatDataContainer().const_pi();
-}
-
-MpfrFloat MpfrFloat::const_e()
-{
- return mpfrFloatDataContainer().const_e();
-}
-
-MpfrFloat MpfrFloat::const_log2()
-{
- return mpfrFloatDataContainer().const_log2();
-}
-
-MpfrFloat MpfrFloat::someEpsilon()
-{
- return mpfrFloatDataContainer().const_epsilon();
-}
diff --git a/fparser/mpfr/MpfrFloat.hh b/fparser/mpfr/MpfrFloat.hh
deleted file mode 100644
index d455d24..0000000
--- a/fparser/mpfr/MpfrFloat.hh
+++ /dev/null
@@ -1,206 +0,0 @@
-#ifndef ONCE_FP_MPFR_FLOAT_
-#define ONCE_FP_MPFR_FLOAT_
-
-#include <iostream>
-
-class MpfrFloat
-{
- public:
- /* A default of 256 bits will be used unless changed with this function.
- Note that all existing and cached GMP objects will be resized to the
- specified precision (which can be a somewhat heavy operation).
- */
- static void setDefaultMantissaBits(unsigned long bits);
-
- static unsigned long getCurrentDefaultMantissaBits();
-
- /* The default constructor initializes the object to the value 0.
- It's efficient to instantiate such zero-initialized objects because
- all of them will share the same mpfr data. (Also any object initialized
- with or assigned the explicit value of zero will also share that one
- mpfr data.) Thus multiple zero-initialized MpfrFloat instances won't
- consume significant amounts of memory (until they are modified to
- contain some other value, of course).
-
- Important caveat:
- ----------------
- Note that initializing an MpfrFloat object with, for example, 0.1 will
- suffer from accuracy problems (at least if the MpfrFloat object has
- more mantissa bits than a double). The C++ double value 0.1 has only
- 53 mantissa bits, while the MpfrFloat object usually has more. If the
- MpfrFloat object is initialized with a double, only that many bits of
- accuracy will end up in the value of the MpfrFloat object. This can
- create significant rounding/accuracy problems in some cases.
- If you need to initialize the MpfrObject with some value (which cannot
- be represented accurately by base-2 floating point numbers, eg. 0.1)
- at full mantissa precision, you have to use parseValue("0.1") instead,
- rather than relying on the constructor taking a double type value.
- */
- MpfrFloat();
- MpfrFloat(double value);
- MpfrFloat(long double value);
- MpfrFloat(long value);
- MpfrFloat(int value);
- MpfrFloat(const char* value, char** endptr);
-
- ~MpfrFloat();
-
- MpfrFloat(const MpfrFloat&);
-
- MpfrFloat& operator=(const MpfrFloat&);
- MpfrFloat& operator=(double value);
- MpfrFloat& operator=(long double value);
- MpfrFloat& operator=(long value);
- MpfrFloat& operator=(int value);
- //MpfrFloat& operator=(const char* value);
-
- void parseValue(const char* value);
- void parseValue(const char* value, char** endptr);
-
-
- /* This function can be used to retrieve the raw mpfr_t data structure
- used by this object. (The template trick is used to avoid a dependency
- of this header file with <mpfr.h>.)
- In other words, it can be called like:
-
- mpfr_t raw_mpfr_data;
- floatValue.get_raw_mpfr_data(raw_mpfr_data);
-
- Note that the returned mpfr_t should be considered as read-only and
- not be modified from the outside because it may be shared among
- several objects. If the calling code needs to modify the data, it
- should copy it for itself first with the appropriate MPFR library
- functions.
- */
- template<typename Mpfr_t>
- void get_raw_mpfr_data(Mpfr_t& dest_mpfr_t);
-
-
- /* Note that the returned char* points to an internal (shared) buffer
- which will be valid until the next time this function is called
- (by any object).
- */
- const char* getAsString(unsigned precision) const;
-
- bool isInteger() const;
- long toInt() const;
- double toDouble() const;
-
- MpfrFloat& operator+=(const MpfrFloat&);
- MpfrFloat& operator+=(double);
- MpfrFloat& operator-=(const MpfrFloat&);
- MpfrFloat& operator-=(double);
- MpfrFloat& operator*=(const MpfrFloat&);
- MpfrFloat& operator*=(double);
- MpfrFloat& operator/=(const MpfrFloat&);
- MpfrFloat& operator/=(double);
- MpfrFloat& operator%=(const MpfrFloat&);
-
- void negate();
- void abs();
-
- MpfrFloat operator+(const MpfrFloat&) const;
- MpfrFloat operator+(double) const;
- MpfrFloat operator-(const MpfrFloat&) const;
- MpfrFloat operator-(double) const;
- MpfrFloat operator*(const MpfrFloat&) const;
- MpfrFloat operator*(double) const;
- MpfrFloat operator/(const MpfrFloat&) const;
- MpfrFloat operator/(double) const;
- MpfrFloat operator%(const MpfrFloat&) const;
-
- MpfrFloat operator-() const;
-
- bool operator<(const MpfrFloat&) const;
- bool operator<(double) const;
- bool operator<=(const MpfrFloat&) const;
- bool operator<=(double) const;
- bool operator>(const MpfrFloat&) const;
- bool operator>(double) const;
- bool operator>=(const MpfrFloat&) const;
- bool operator>=(double) const;
- bool operator==(const MpfrFloat&) const;
- bool operator==(double) const;
- bool operator!=(const MpfrFloat&) const;
- bool operator!=(double) const;
-
- static MpfrFloat log(const MpfrFloat&);
- static MpfrFloat log2(const MpfrFloat&);
- static MpfrFloat log10(const MpfrFloat&);
- static MpfrFloat exp(const MpfrFloat&);
- static MpfrFloat exp2(const MpfrFloat&);
- static MpfrFloat exp10(const MpfrFloat&);
- static MpfrFloat cos(const MpfrFloat&);
- static MpfrFloat sin(const MpfrFloat&);
- static MpfrFloat tan(const MpfrFloat&);
- static MpfrFloat sec(const MpfrFloat&);
- static MpfrFloat csc(const MpfrFloat&);
- static MpfrFloat cot(const MpfrFloat&);
- static void sincos(const MpfrFloat&, MpfrFloat& sin, MpfrFloat& cos);
- static MpfrFloat acos(const MpfrFloat&);
- static MpfrFloat asin(const MpfrFloat&);
- static MpfrFloat atan(const MpfrFloat&);
- static MpfrFloat atan2(const MpfrFloat&, const MpfrFloat&);
- static MpfrFloat hypot(const MpfrFloat&, const MpfrFloat&);
- static MpfrFloat cosh(const MpfrFloat&);
- static MpfrFloat sinh(const MpfrFloat&);
- static MpfrFloat tanh(const MpfrFloat&);
- static MpfrFloat acosh(const MpfrFloat&);
- static MpfrFloat asinh(const MpfrFloat&);
- static MpfrFloat atanh(const MpfrFloat&);
- static MpfrFloat sqrt(const MpfrFloat&);
- static MpfrFloat cbrt(const MpfrFloat&);
- static MpfrFloat root(const MpfrFloat&, unsigned long root);
- static MpfrFloat pow(const MpfrFloat&, const MpfrFloat&);
- static MpfrFloat pow(const MpfrFloat&, long exponent);
- static MpfrFloat abs(const MpfrFloat&);
- static MpfrFloat dim(const MpfrFloat&, const MpfrFloat&);
- static MpfrFloat round(const MpfrFloat&);
- static MpfrFloat ceil(const MpfrFloat&);
- static MpfrFloat floor(const MpfrFloat&);
- static MpfrFloat trunc(const MpfrFloat&);
-
- static MpfrFloat parseString(const char* str, char** endptr);
-
- // These values are cached (and recalculated every time the mantissa bits
- // change), so it's efficient to call these repeatedly:
- static MpfrFloat const_pi();
- static MpfrFloat const_e();
- static MpfrFloat const_log2();
- static MpfrFloat someEpsilon();
-
-
- private:
- struct MpfrFloatData;
- class MpfrFloatDataContainer;
-
- MpfrFloatData* mData;
-
- enum DummyType { kNoInitialization };
- MpfrFloat(DummyType);
- MpfrFloat(MpfrFloatData*);
-
- void copyIfShared();
- static MpfrFloatDataContainer& mpfrFloatDataContainer();
-
- friend MpfrFloat operator+(double lhs, const MpfrFloat& rhs);
- friend MpfrFloat operator-(double lhs, const MpfrFloat& rhs);
-};
-
-MpfrFloat operator+(double lhs, const MpfrFloat& rhs);
-MpfrFloat operator-(double lhs, const MpfrFloat& rhs);
-MpfrFloat operator*(double lhs, const MpfrFloat& rhs);
-MpfrFloat operator/(double lhs, const MpfrFloat& rhs);
-MpfrFloat operator%(double lhs, const MpfrFloat& rhs);
-
-inline bool operator<(double lhs, const MpfrFloat& rhs) { return rhs > lhs; }
-inline bool operator<=(double lhs, const MpfrFloat& rhs) { return rhs >= lhs; }
-inline bool operator>(double lhs, const MpfrFloat& rhs) { return rhs < lhs; }
-inline bool operator>=(double lhs, const MpfrFloat& rhs) { return rhs <= lhs; }
-inline bool operator==(double lhs, const MpfrFloat& rhs) { return rhs == lhs; }
-inline bool operator!=(double lhs, const MpfrFloat& rhs) { return rhs != lhs; }
-
-// This function takes into account the value of os.precision()
-std::ostream& operator<<(std::ostream& os, const MpfrFloat& value);
-
-#endif
--
2D CAD system
More information about the debian-science-commits
mailing list