premake-3.7.orig/0000755000000000000000000000000011304777115010642 5ustar premake-3.7.orig/LICENSE.txt0000644000000000000000000004365510446776604012512 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. premake-3.7.orig/Src/0000755000000000000000000000000011065435041011362 5ustar premake-3.7.orig/Src/gnu.c0000644000000000000000000001204311045661273012325 0ustar /********************************************************************** * Premake - gnu.c * The GNU makefile target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "arg.h" #include "gnu.h" static int writeRootMakefile(); static const char* listInterPackageDeps(const char* name); int gnu_generate() { int i; puts("Generating GNU makefiles:"); if (!writeRootMakefile()) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { int result; prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c#")) { result = gnu_cs(); } else if (prj_is_lang("c++") || prj_is_lang("c")) { result = gnu_cpp(); } else { printf("** Error: unrecognized language '%s'\n", prj_get_language()); return 0; } if (!result) return 0; } return 1; } static int writeRootMakefile() { const char* arg; int i; if (!io_openfile(path_join(prj_get_path(), "Makefile", ""))) return 0; /* Print the file header, showing the possible build configurations */ io_print("# Makefile autogenerated by premake\n"); io_print("# Don't edit this file! Instead edit `premake.lua` then rerun `make`\n"); io_print("# Options:\n"); io_print("# CONFIG=["); prj_select_package(0); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); if (i > 0) io_print("|"); io_print(prj_get_cfgname()); } io_print("]\n\n"); /* Set a default build config if none specified */ prj_select_config(0); io_print("ifndef CONFIG\n"); io_print(" CONFIG=%s\n", gnu_escapePath(prj_get_cfgname())); io_print("endif\n\n"); io_print("export CONFIG\n\n"); /* List all of the available make targets */ io_print(".PHONY: all clean"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); io_print(" %s", gnu_escapePath(prj_get_pkgname())); } io_print("\n\n"); /* Make rules */ io_print("all:"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); io_print(" %s", gnu_escapePath(prj_get_pkgname())); } io_print("\n\n"); /* Target to regenerate the makefiles when the premake scripts change */ strcpy(g_buffer, path_build(prj_get_path(), ".")); io_print("Makefile: %s", path_combine(g_buffer, prj_get_script())); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); if (!matches(prj_get_script(), prj_get_pkgscript())) { strcpy(g_buffer, path_build(prj_get_path(), ".")); io_print(" %s", path_combine(g_buffer, prj_get_pkgscript())); } } io_print("\n"); io_print("\t@echo ==== Regenerating Makefiles ====\n"); io_print("\t@premake --file $^"); arg_reset(); arg = arg_getflag(); while (arg != NULL) { if (matches(arg, "--file")) { arg_getflagarg(); } else { io_print(" %s", arg); } arg = arg_getflag(); } io_print("\n\n"); /* Individual package targets */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); prj_select_config(0); io_print("%s:", gnu_escapePath(prj_get_pkgname())); print_list(prj_get_links(), " ", "", "", listInterPackageDeps); io_print("\n"); io_print("\t@echo ==== Building %s ====\n", prj_get_pkgname()); io_print("\t@$(MAKE) "); io_print("--no-print-directory -C %s", gnu_escapePath(path_build(prj_get_path(), prj_get_pkgpath()))); if (!gnu_pkgOwnsPath()) io_print(" -f %s.%s", gnu_escapePath(prj_get_pkgname()), DOT_MAKE); io_print("\n\n"); } io_print("clean:\n"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); io_print("\t@$(MAKE) "); io_print("--no-print-directory -C %s", gnu_escapePath(path_build(prj_get_path(), prj_get_pkgpath()))); if (!gnu_pkgOwnsPath()) io_print(" -f %s.%s", gnu_escapePath(prj_get_pkgname()), DOT_MAKE); io_print(" clean\n"); } io_closefile(); return 1; } /************************************************************************ * Checks if a package link matches the name of a sibling package. This * is used to generate a Makefile dependency on the sibling. ***********************************************************************/ static const char* listInterPackageDeps(const char* name) { int i; for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(name, prj_get_pkgname_for(i))) return gnu_escapePath(name); } return NULL; } premake-3.7.orig/Src/cb_cpp.c0000644000000000000000000001737310663071316012773 0ustar /********************************************************************** * Premake - cb_cpp.c * The Code::Blocks C/C++ target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "cb.h" static const char* filterLinks(const char* name); static const char* filterLinksForPaths(const char* name); static const char* listFiles(const char* name); static void print_opt(const char* opt); int cb_cpp() { int i; /* Write the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "cbp"))) return 0; io_print("\n"); io_print("\n"); io_print("\t\n"); io_print("\t\n"); io_print("\t\t\n"); io_print("\n"); io_closefile(); return 1; } static void print_opt(const char* opt) { io_print("\t\t\t\t\t\n", opt); } /************************************************************************ * Output a description block for each source file ***********************************************************************/ static const char* listFiles(const char* filename) { int i; io_print("\t\t\n", filename); if (matches(path_getextension(filename), ".rc")) { io_print("\t\t\t\n"); return NULL; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* filterLinks(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* lang = prj_get_language_for(i); if (matches(lang, "c++") || matches(lang, "c")) { const char* target = prj_get_targetname_for(i); return path_getname(target); } else { return NULL; } } else { return name; } } static const char* filterLinksForPaths(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* lang = prj_get_language_for(i); if (matches(lang, "c++") || matches(lang, "c")) { const char* target = prj_get_target_for(i); const char* dir = path_getdir(target); if (!prj_has_libpath(dir)) { return dir; } } } return NULL; } premake-3.7.orig/Src/arg.c0000644000000000000000000000262110446776604012317 0ustar /********************************************************************** * Premake - arg.c * Command-line argument handling. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "premake.h" #include "arg.h" static int my_argc; static char** my_argv; static int my_next; void arg_set(int argc, char** argv) { my_argc = argc; my_argv = argv; my_next = 1; } void arg_reset() { my_next = 1; } const char* arg_getflag() { if (my_next == my_argc) return NULL; return my_argv[my_next++]; } const char* arg_getflagarg() { if (my_next == my_argc) return NULL; if (strncmp(my_argv[my_next], "--", 2) == 0) return NULL; return my_argv[my_next++]; } premake-3.7.orig/Src/vs2005_cs.c0000644000000000000000000002244310644156034013163 0ustar /********************************************************************** * Premake - vs2005_cs.c * The Visual Studio 2005 C# target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "vs.h" #include "vs2005.h" static const char* listFiles(const char* name); static const char* listReferences(const char* name); int vs2005_cs() { VsPkgData* data = (VsPkgData*)prj_get_data(); int c; if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj"))) return 0; io_print("\n"); io_print(" \n"); /* Write default configuration */ prj_select_config(0); io_print(" %s\n", xmlEscape(prj_get_cfgname())); io_print(" AnyCPU\n"); io_print(" 8.0.50727\n"); io_print(" 2.0\n"); io_print(" {%s}\n", data->projGuid); io_print(" "); if (prj_is_kind("winexe")) io_print("WinExe"); else if (prj_is_kind("exe")) io_print("Exe"); else if (prj_is_kind("dll") || prj_is_kind("aspnet")) io_print("Library"); else { printf("** Error: unknown package kind '%s'\n", prj_get_kind()); return 0; } io_print("\n"); io_print(" Properties\n"); io_print(" %s\n", path_getbasename(prj_get_target())); io_print(" %s\n", path_getbasename(prj_get_target())); io_print(" \n"); for (c = 0; c < prj_get_numconfigs(); ++c) { prj_select_config(c); io_print(" \n", xmlEscape(prj_get_cfgname())); if (!prj_has_flag("no-symbols")) { io_print(" true\n"); io_print(" full\n"); } else { io_print(" pdbonly\n"); } if (prj_has_flag("optimize") || prj_has_flag("optimize-size") || prj_has_flag("optimize-speed")) io_print(" true\n"); else io_print(" false\n"); io_print(" %s\\\n", prj_get_outdir()); io_print(" "); print_list(prj_get_defines(), "", "", ";", xmlEscape); io_print("\n"); io_print(" prompt\n"); io_print(" 4\n"); if (prj_has_flag("unsafe")) io_print(" true\n"); if (prj_has_flag("fatal-warnings")) io_print(" true\n"); io_print(" \n"); } /* Must use same references for all configurations */ prj_select_config(0); io_print(" \n"); print_list(prj_get_links(), "", "", "", listReferences); io_print(" \n"); io_print(" \n"); print_list(prj_get_files(), "", "", "", listFiles); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print("\n"); io_closefile(); /* Now write the .csproj.user file for non-web applications or * .csproj.webinfo for web applications */ if (!prj_is_kind("aspnet")) { if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj.user"))) return 0; io_print("\n"); io_print(" \n"); io_print(" "); strcpy(g_buffer, io_getcwd()); io_chdir(prj_get_pkgpath()); print_list(prj_get_libpaths(), "", ";", "", vs_list_refpaths); io_print(vs_list_refpaths(prj_get_bindir())); io_chdir(g_buffer); io_print("\n"); io_print(" \n"); io_print("\n"); } else { if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj.webinfo"))) return 0; } io_closefile(); return 1; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* listReferences(const char* name) { /* Is this a sibling package? */ int i = prj_find_package(name); if (i >= 0) { VsPkgData* data = (VsPkgData*)prj_get_data_for(i); strcpy(g_buffer, path_build(prj_get_pkgpath(), prj_get_pkgpath_for(i))); io_print(" \n", path_translate(g_buffer, "windows"), name); io_print(" {%s}\n", data->projGuid); io_print(" %s\n", name); io_print(" \n"); } else { io_print(" \n", name); } return NULL; } /************************************************************************ * Builds an entry for each file in the project ***********************************************************************/ static const char* listFiles(const char* name) { const char* related; /* If a build action was specified, use it */ prj_select_file(name); if (prj_get_buildaction() != NULL) { if (matches(prj_get_buildaction(), "Content")) { io_print(" \n", path_translate(name, "windows")); io_print(" PreserveNewest\n"); io_print(" \n"); } else { io_print(" <%s Include=\"%s\" />\n", prj_get_buildaction(), path_translate(name, "windows")); } return NULL; } if (endsWith(name, ".cs")) { int fullstop = 0; io_print(" \n %s\n", path_getname(g_buffer)); fullstop = 1; } else { /* ...look for a .resx dependency */ strcpy(g_buffer, path_swapextension(name, ".Designer.cs", ".resx")); if (prj_has_file(g_buffer)) { io_print(">\n True\n"); io_print(" %s\n", path_getname(g_buffer)); fullstop = 1; } } } else { /* If a matching ".Designer.cs" exists, mark this as a Form */ related = path_swapextension(name, ".cs", ".Designer.cs"); if (prj_has_file(related)) { io_print(">\n Form\n"); fullstop = 1; } } io_print(fullstop ? " \n" : " />\n"); } else if (endsWith(name, ".resx")) { int fullstop = 0; io_print(" \n"); /* Is this related to a form? */ related = path_swapextension(name, ".resx", ".Designer.cs"); if (prj_has_file(related)) io_print(" Designer\n"); io_print(" %s\n", path_getname(g_buffer)); } else { /* If no .cs but .Designer.cs then auto-generated */ strcpy(g_buffer, path_swapextension(name, ".resx", ".Designer.cs")); if (prj_has_file(g_buffer)) { fullstop = 1; io_print(">\n"); io_print(" Designer\n"); io_print(" ResXFileCodeGenerator\n"); io_print(" %s\n", path_getname(g_buffer)); } } io_print(fullstop ? " \n" : " />\n"); } else { io_print(" \n", path_translate(name, "windows")); } return NULL; } premake-3.7.orig/Src/gnu_cs.c0000644000000000000000000004101011062460411012774 0ustar /********************************************************************** * Premake - gnu_cs.c * The GNU C# makefile target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "gnu.h" #include "os.h" static char buffer[8192]; static const char* assignCodeFiles(const char* name); static const char* assignEmbeddedFiles(const char* name); static const char* assignContentFiles(const char* name); static const char* listCodeFiles(const char* name); static const char* listEmbeddedFiles(const char* name); static const char* listLinkedFiles(const char* name); static const char* listContentFiles(const char* name); static const char* listContentTargets(const char* name); static const char* listContentRules(const char* name); static const char* listCopyLocalFiles(const char* name); static const char* listCopyLocalRules(const char* name); static const char* listNonSiblingRefs(const char* name); static const char* listSiblingRefs(const char* name); static const char* listReferenceDeps(const char* name); static const char* listResourceBuildSteps(const char* name); int gnu_cs() { const char* kind; const char* csc; const char* resgen; int i; const char** files; const char* appConfigName; /* Figure out what I'm building */ prj_select_config(0); kind = prj_get_kind(); if (prj_is_kind("dll") || prj_is_kind("aspnet")) { kind = "library"; } else if (prj_is_kind("winexe") || prj_is_kind("exe")) { } else { printf("** Error: unknown package type '%s'\n", kind); return 0; } /* Figure out what I'm building it with */ if (g_dotnet == NULL) { if (os_is("windows")) { csc = "csc"; resgen = "resgen"; } else { csc = "mcs"; resgen = "resgen"; } } else if (matches(g_dotnet, "ms")) { csc = "csc"; resgen = "resgen"; } else if (matches(g_dotnet, "pnet")) { csc = "cscc"; resgen = "resgen"; } else if (matches(g_dotnet, "mono")) { csc = "mcs"; resgen = "resgen"; } else if (matches(g_dotnet, "mono2")) { csc = "gmcs"; resgen = "resgen"; } else { printf("** Error: unknown .NET runtime '%s'\n", g_dotnet); return 0; } /* Open package makefile and write the header */ if (gnu_pkgOwnsPath()) strcpy(buffer, path_join(prj_get_pkgpath(), "Makefile", "")); else strcpy(buffer, path_join(prj_get_pkgpath(), prj_get_pkgname(), DOT_MAKE)); io_openfile(buffer); io_print("# C# "); if (prj_is_kind("exe")) io_print("Console Executable"); else if (prj_is_kind("winexe")) io_print("Windowed Executable"); else if (prj_is_kind("dll")) io_print("Shared Library"); else if (prj_is_kind("lib")) io_print("Static Library"); else if (prj_is_kind("aspnet")) io_print("ASP.NET"); io_print(" Makefile autogenerated by premake\n"); io_print("# Don't edit this file! Instead edit `premake.lua` then rerun `make`\n\n"); /* Set a default configuration */ prj_select_config(0); io_print("ifndef CONFIG\n"); io_print(" CONFIG=%s\n", prj_get_cfgname()); io_print("endif\n\n"); /* Figure out if I have an App.config file */ appConfigName = NULL; files = prj_get_files(); for (i = 0; files[i] != NULL; ++i) { if (matches(files[i], "App.config") || matches(files[i], "app.config")) { appConfigName = files[i]; break; } } /* Specify the build tools */ io_print("CSC := %s\n", csc); io_print("RESGEN := %s\n", resgen); io_print("\n"); /* Where to put compiled resources */ io_print("OBJDIR := %s\n\n", prj_get_objdir()); /* Process the build configurations */ for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print("ifeq ($(CONFIG),%s)\n", prj_get_cfgname()); io_print(" BINDIR := %s\n", gnu_escapePath(prj_get_bindir())); io_print(" OUTDIR := %s\n", gnu_escapePath(prj_get_outdir())); io_print(" FLAGS += /t:%s", kind); if (!prj_has_flag("no-symbols")) { io_print(" /debug"); } if (prj_has_flag("optimize") || prj_has_flag("optimize-size") || prj_has_flag("optimize-speed")) { /* Mono doesn't support the optimize flag */ if (!matches(csc, "mcs")) io_print(" /optimize"); } if (prj_has_flag("unsafe")) { io_print(" /unsafe"); } if (prj_has_flag("fatal-warnings")) { io_print(" /warnaserror"); } print_list(prj_get_defines(), " /d:", "", "", NULL); /* VS.NET doesn't allow per-config link paths */ prj_select_config(0); print_list(prj_get_libpaths(), " /lib:\"", "\"", "", NULL); print_list(prj_get_links(), " /r:", "", "", listNonSiblingRefs); prj_select_config(i); print_list(prj_get_links(), " /r:", "", "", listSiblingRefs); io_print("\n"); /* List any sibling packages as dependencies for make */ prj_select_config(i); io_print(" DEPS :="); print_list(prj_get_links(), " ", " ", "", listReferenceDeps); io_print("\n"); /* VS.NET doesn't allow per-config target names */ prj_select_config(0); io_print(" TARGET := %s\n", gnu_escapePath(path_getname(prj_get_target()))); io_print("endif\n\n"); } /* Sort out the files by build action...start by assigning build actions * to well-known file extensions...these don't write anything to the file */ print_list(prj_get_files(), "", "", "", assignCodeFiles); print_list(prj_get_files(), "", "", "", assignEmbeddedFiles); print_list(prj_get_files(), "", "", "", assignContentFiles); /* Sort out the files by build action */ io_print("SOURCES := \\\n"); print_list(prj_get_files(), "\t", " \\\n", "", listCodeFiles); io_print("\n"); io_print("EMBEDDEDFILES := \\\n"); print_list(prj_get_files(), "\t", " \\\n", "", listEmbeddedFiles); io_print("\n"); io_print("EMBEDDEDCOMMAND := \\\n"); print_list(prj_get_files(), "\t/resource:", " \\\n", "", listEmbeddedFiles); io_print("\n"); io_print("LINKEDFILES := \\\n"); print_list(prj_get_files(), "\t", " \\\n", "", listLinkedFiles); io_print("\n"); io_print("LINKEDCOMMAND := \\\n"); print_list(prj_get_files(), "\t/linkresource:", " \\\n", "", listLinkedFiles); io_print("\n"); io_print("CONTENTFILES := \\\n"); print_list(prj_get_files(), "\t", " \\\n", "", listContentFiles); io_print("\n"); io_print("COPYLOCALFILES := \\\n"); print_list(prj_get_links(), "\t", " \\\n", "", listCopyLocalFiles); io_print("\n"); io_print("COMPILECOMMAND := $(SOURCES) $(EMBEDDEDCOMMAND) $(LINKEDCOMMAND)\n\n"); io_print("CMD := $(subst \\,\\\\,$(ComSpec)$(COMSPEC))\n"); io_print("ifeq (,$(CMD))\n"); io_print(" CMD_MKOUTDIR := mkdir -p $(OUTDIR)\n"); io_print("else\n"); io_print(" CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\\\,$(OUTDIR)) mkdir $(subst /,\\\\,$(OUTDIR))\n"); io_print("endif\n"); io_print("\n"); /* Build targets: add all content files as dependencies so the copy * rules will get fired when they change */ io_print(".PHONY: clean\n\n"); io_print("all: \\\n"); io_print("\t$(OUTDIR)/$(TARGET) \\\n"); if (appConfigName != NULL) { io_print("\t$(OUTDIR)/$(TARGET).config \\\n"); } print_list(prj_get_files(), "\t", " \\\n", "", listContentTargets); io_print("\n"); /* The main build target */ io_print("$(OUTDIR)/$(TARGET): $(SOURCES) $(EMBEDDEDFILES) $(LINKEDFILES) $(COPYLOCALFILES) $(DEPS)\n"); io_print("\t-@$(CMD_MKOUTDIR)\n"); io_print("\t@$(CSC) /nologo /out:\"$@\" /lib:$(BINDIR) $(FLAGS) $(COMPILECOMMAND)\n\n"); /* The App.config rule */ if (appConfigName != NULL) { io_print("$(OUTDIR)/$(TARGET).config: %s\n", appConfigName); io_print("\t@echo Copying %s\n", appConfigName); io_print("\t-@$(CMD_MKOUTDIR)\n"); io_print("\t@cp \"$^\" \"$@\"\n\n"); } /* Write rules to copy content files */ print_list(prj_get_files(), "", "", "", listContentRules); /* Write rules to copy local assemblies */ print_list(prj_get_links(), "", "", "", listCopyLocalRules); /* The clean target */ io_print("clean:\n"); io_print("\t@echo Cleaning %s\n", prj_get_pkgname()); io_print("\t-@rm -f $(OUTDIR)/$(TARGET)\n"); io_print("\t-@rm -fR $(OBJDIR)\n"); print_list(prj_get_files(), "\t-@rm -f ", "\n", "", listContentTargets); io_print("\n"); /* Resource build targets */ print_list(prj_get_files(), "", "", "", listResourceBuildSteps); io_closefile(); return 1; } /************************************************************************ * Visual Studio .NET automatically adds some extra information * to resource names. Simulate that here. ***********************************************************************/ static const char* makeVsNetCompatName(const char* name) { char* ptr; if (matches(path_getextension(name), ".resx")) { /* The compiled .resources file goes into objdir */ strcpy(buffer, prj_get_objdir()); strcat(buffer, "/"); /* Prepend the default namespace (slashes will get translated below) */ strcat(buffer, path_getbasename(prj_get_target())); strcat(buffer, "."); /* ...followed by the path to the file */ if (!matches(path_getdir(name), "")) { strcat(buffer, path_getdir(name)); strcat(buffer, "."); } /* ...finish up with the file name */ strcat(buffer, path_getbasename(name)); strcat(buffer, ".resources"); /* Convert any slashes in the name to dots */ for (ptr = buffer + strlen(prj_get_objdir()) + 1; *ptr != '\0'; ++ptr) { if (*ptr == '/') *ptr = '.'; } return gnu_escapePath(buffer); } else { return name; } } /************************************************************************ * Assign default build actions to files without one ***********************************************************************/ static const char* assignCodeFiles(const char* name) { const char* ext = path_getextension(name); prj_select_file(name); if (prj_is_buildaction(NULL) && matches(ext, ".cs")) prj_set_buildaction("Code"); return NULL; } static const char* assignEmbeddedFiles(const char* name) { const char* ext = path_getextension(name); prj_select_file(name); if (prj_is_buildaction(NULL) && matches(ext, ".resx")) prj_set_buildaction("EmbeddedResource"); return NULL; } static const char* assignContentFiles(const char* name) { const char* ext = path_getextension(name); prj_select_file(name); if (prj_is_buildaction(NULL) && (matches(ext, ".asax") || matches(ext, ".aspx"))) prj_set_buildaction("Content"); return NULL; } /************************************************************************ * Checks to see if a given assembly exists on one of the listed link * paths. If so, returns the relative path to the assembly. ***********************************************************************/ static const char* findLocalAssembly(const char* name) { const char** paths; const char* result = NULL; /* Lib paths are relative to package directory. Have to make package * directory current for io_fileexists() to work */ strcpy(buffer, io_getcwd()); io_chdir(prj_get_pkgpath()); paths = prj_get_libpaths(); while (*paths != NULL) { const char* path = path_join(*paths, name, "dll"); if (io_fileexists(path)) { result = path; break; } ++paths; } io_chdir(buffer); return result; } /************************************************************************ * Returns lists of files for each build action ***********************************************************************/ static const char* listCodeFiles(const char* name) { prj_select_file(name); if (prj_is_buildaction("Code")) { /* Csc needs backslashes, which GNU make doesn't like */ const char* src = path_translate(name, NULL); char* dst = buffer; while (*src) { if (*src == '\\') { *(dst++) = '\\'; *(dst++) = '\\'; } else { *(dst++) = *src; } src++; } *dst ='\0'; return gnu_escapePath(buffer); } else { return NULL; } } static const char* listEmbeddedFiles(const char* name) { prj_select_file(name); if (prj_is_buildaction("EmbeddedResource")) return makeVsNetCompatName(name); else return NULL; } static const char* listLinkedFiles(const char* name) { prj_select_file(name); if (prj_is_buildaction("LinkedResource")) return makeVsNetCompatName(name); else return NULL; } static const char* listContentFiles(const char* name) { prj_select_file(name); if (prj_is_buildaction("Content")) return gnu_escapePath(name); else return NULL; } static const char* listCopyLocalFiles(const char* name) { const char* path = findLocalAssembly(name); if (path != NULL) { sprintf(buffer, "$(OUTDIR)/%s.dll", gnu_escapePath(name)); return buffer; } return NULL; } /************************************************************************ * Checks to see if a reference is to a sibling package. If so, * returns the binary target name of the package. ***********************************************************************/ static const char* listNonSiblingRefs(const char* name) { int i = prj_find_package(name); if (i < 0) { return path_join("", name, "dll"); } return NULL; } static const char* listSiblingRefs(const char* name) { int i = prj_find_package(name); if (i >= 0) { if (matches(prj_get_language_for(i), "c#")) { // return prj_get_target_for(i); return prj_get_relativetarget_for(i); } } return NULL; } /************************************************************************ * This is called by the code that builds the list of dependencies for * the link step. It looks for sibling projects, and then returns the * full path to that target's output. So if an executable package * depends on a library package, the library filename will be listed * as a dependency ***********************************************************************/ static const char* listReferenceDeps(const char* name) { int i = prj_find_package(name); if (i >= 0) { // return prj_get_target_for(i); return prj_get_relativetarget_for(i); } return NULL; } /************************************************************************ * Write out content files as make dependencies ***********************************************************************/ static const char* listContentTargets(const char* name) { prj_select_file(name); if (prj_is_buildaction("LinkedResource") || prj_is_buildaction("Content")) { sprintf(buffer, "$(BINDIR)/%s", gnu_escapePath(path_getname(name))); return buffer; } else { return NULL; } } /************************************************************************ * Write out rules to move files to output directory ***********************************************************************/ static const char* listContentRules(const char* name) { prj_select_file(name); name = gnu_escapePath(name); if (prj_is_buildaction("LinkedResource") || prj_is_buildaction("Content")) { sprintf(buffer, "$(BINDIR)/%s: %s\n\t-@cp -fR $^ \"$@\"\n\n", path_getname(name), name); return buffer; } return NULL; } static const char* listCopyLocalRules(const char* name) { const char* path = findLocalAssembly(name); name = gnu_escapePath(name); if (path != NULL) { sprintf(buffer, "$(OUTDIR)/%s.dll: %s\n\t@echo Copying %s.dll\n\t-@$(CMD_MKOUTDIR)\n\t-@cp \"$^\" \"$@\"\n\n", name, path, name); return buffer; } return NULL; } /************************************************************************ * Write out resource compilation rules ***********************************************************************/ static const char* listResourceBuildSteps(const char* name) { if (matches(path_getextension(name), ".resx")) { makeVsNetCompatName(name); strcat(buffer, ": "); strcat(buffer, name); strcat(buffer, "\n\t-@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi"); strcat(buffer, "\n\t@$(RESGEN) $^ \"$@\"\n\n"); return buffer; } else { return NULL; } } premake-3.7.orig/Src/vs.h0000644000000000000000000000252111003166564012166 0ustar /********************************************************************** * Premake - vs.h * Common code for Visual Studio 2002-2008 targets. * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ enum VsVer { VS2002, VS2003, VS2005, VS2008 }; typedef struct tagVsPkgData { char projGuid[38]; char toolGuid[38]; char projExt[8]; char projType[8]; int numDependencies; } VsPkgData; void vs_setversion(int version); int vs_getversion(); void vs_assign_guids(); int vs_write_cpp(); const char* vs_list_refpaths(const char* name); const char* vs_list_pkgdeps(const char* name); void vs_list_files(const char* path, int stage); const char* vs_filter_links(const char* name); premake-3.7.orig/Src/util.h0000644000000000000000000000266410644156034012524 0ustar /********************************************************************** * Premake - util.h * Support functions. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #define ALLOCT(T) (T*)malloc(sizeof(T)) enum { WST_OPENGROUP, WST_CLOSEGROUP, WST_SOURCEFILE }; extern char g_buffer[]; int endsWith(const char* haystack, const char* needle); void generateUUID(char* uuid); int is_cpp(const char* name); int matches(const char* str0, const char* str1); void print_list(const char** list, const char* prefix, const char* postfix, const char* infix, const char* (*func)(const char*)); void print_source_tree(const char* path, void (*cb)(const char*, int)); int startsWith(const char* haystack, const char* needle); const char* xmlEscape(const char* value); premake-3.7.orig/Src/io.c0000644000000000000000000000701611055526137012147 0ustar /********************************************************************** * Premake - io.c * File and directory I/O routines. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include #include "io.h" #include "path.h" #include "platform.h" static char buffer[8192]; static FILE* file; int io_chdir(const char* path) { if (strlen(path) == 0) path = "."; return platform_chdir(path); } int io_closefile() { fclose(file); return 1; } int io_copyfile(const char* src, const char* dest) { return platform_copyfile(src, dest); } int io_direxists(const char* path) { struct stat buf; if (stat(path, &buf) == 0) { if (buf.st_mode & S_IFDIR) return 1; else return 0; } else { return 0; } } int io_fileexists(const char* path) { struct stat buf; if (stat(path, &buf) == 0) { if (buf.st_mode & S_IFDIR) return 0; else return 1; } else { return 0; } } const char* io_findlib(const char* name) { if (platform_findlib(name, buffer, 8192)) return buffer; else return NULL; } const char* io_getcwd() { platform_getcwd(buffer, 8192); return buffer; } int io_mask_close(MaskHandle data) { return platform_mask_close(data); } const char* io_mask_getname(MaskHandle data) { return platform_mask_getname(data); } int io_mask_getnext(MaskHandle data) { return platform_mask_getnext(data); } int io_mask_isfile(MaskHandle data) { return platform_mask_isfile(data); } MaskHandle io_mask_open(const char* mask) { return platform_mask_open(mask); } int io_mkdir(const char* path) { /* Remember the current directory */ char cwd[8192]; platform_getcwd(cwd, 8192); /* Split the path and check each part in turn */ strcpy(buffer, path); path = buffer; while (path != NULL) { char* ptr = strchr(path, '/'); if (ptr != NULL) *ptr = '\0'; platform_mkdir(path); platform_chdir(path); path = (ptr != NULL) ? ptr + 1 : NULL; } /* Restore the original working directory */ platform_chdir(cwd); return 1; } int io_openfile(const char* path) { /* Make sure that all parts of the path exist */ io_mkdir(path_getdir(path)); /* Now I can open the file */ file = fopen(path, "w"); if (file == NULL) { printf("** Unable to open file '%s' for writing\n", path); return 0; } else { return 1; } } void io_print(const char* format, ...) { va_list args; va_start(args, format); vfprintf(file, format, args); va_end(args); } int io_remove(const char* path) { return platform_remove(path); } int io_rmdir(const char* path, const char* dir) { strcpy(buffer, path); if (strlen(buffer) > 0) strcat(buffer, "/"); strcat(buffer, dir); path_translateInPlace(buffer, NULL); return platform_rmdir(buffer); } premake-3.7.orig/Src/monodev.h0000644000000000000000000000156510500347152013207 0ustar /********************************************************************** * Premake - monodev.h * TheMonoDevelop target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int monodev_generate(); int monodev_cs(); extern int monodev_warncontent; premake-3.7.orig/Src/vs2002.h0000644000000000000000000000154610473400723012476 0ustar /********************************************************************** * Premake - vs2002.h * The Visual Studio 2002 and 2003 target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int vs2002_generate(int target); int vs2002_cs(); premake-3.7.orig/Src/util.c0000644000000000000000000001552410644156034012516 0ustar /********************************************************************** * Premake - util.c * Support functions. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "premake.h" #include "platform.h" static char* CPP_EXT[] = { ".cc", ".cpp", ".cxx", ".c", ".s", NULL }; /* Buffer for generators */ char g_buffer[8192]; /* Buffer for internal use */ static char buffer[8192]; /************************************************************************ * Checks a pattern against the start or end of a string ***********************************************************************/ int startsWith(const char* haystack, const char* needle) { return (strncmp(haystack, needle, strlen(needle)) == 0); } int endsWith(const char* haystack, const char* needle) { if (strlen(haystack) < strlen(needle)) return 0; haystack = haystack + strlen(haystack) - strlen(needle); return (strcmp(haystack, needle) == 0); } /************************************************************************ * Create a pseudo-UUID, good enough for Premake's purposes ***********************************************************************/ static void stringify(char* src, char* dst, int count) { char buffer[4]; int i; for (i = 0; i < count; ++i) { unsigned value = (unsigned char)src[i]; sprintf(buffer, "%X", value); if (value >= 0x10) { *(dst++) = buffer[0]; *(dst++) = buffer[1]; } else { *(dst++) = '0'; *(dst++) = buffer[0]; } } } void generateUUID(char* uuid) { platform_getuuid(buffer); stringify(buffer, uuid, 4); uuid[8] = '-'; stringify(buffer + 4, uuid + 9, 2); uuid[13] = '-'; stringify(buffer + 6, uuid + 14, 2); uuid[18] = '-'; stringify(buffer + 8, uuid + 19, 2); uuid[23] = '-'; stringify(buffer + 10, uuid + 24, 6); uuid[36] = '\0'; } /************************************************************************ * Checks a file name against a list of known C/C++ file extensions ***********************************************************************/ int is_cpp(const char* name) { int i; const char* ext = path_getextension(name); if (ext == NULL) return 0; for (i = 0; CPP_EXT[i] != NULL; ++i) { if (matches(ext, CPP_EXT[i])) return 1; } return 0; } /************************************************************************ * Checks to see if two strings match. Just a more readable version * of the standard strcmp() function ***********************************************************************/ int matches(const char* str0, const char* str1) { if (str0 == NULL || str1 == NULL) return (str0 == str1); return (strcmp(str0, str1) == 0); } /************************************************************************ * Iterate through an array of string, calling a function for each ***********************************************************************/ void print_list(const char** list, const char* prefix, const char* postfix, const char* infix, const char* (*func)(const char*)) { int i = 0; while (*list) { const char* value = (func != NULL) ? func(*list) : *list; if (value != NULL) { if (i++ > 0) io_print(infix); io_print("%s%s%s", prefix, value, postfix); } ++list; } } /************************************************************************ * Iterate through the list of files, build a tree structure ***********************************************************************/ void print_source_tree(const char* path, void (*cb)(const char*, int)) { const char** i; /* Open an enclosing group */ strcpy(buffer, path); if (buffer[strlen(buffer) - 1] == '/') /* Trim off trailing path separator */ buffer[strlen(buffer) - 1] = '\0'; cb(buffer, WST_OPENGROUP); for (i = prj_get_files(); *i != NULL; ++i) { const char* source = (*i); /* For each file in the target directory... */ if (strlen(source) > strlen(path) && strncmp(source, path, strlen(path)) == 0) { /* Look for a subdirectory... */ const char* ptr = strchr(source + strlen(path), '/'); if (ptr != NULL) { const char** j; /* Pull out the subdirectory name */ strncpy(buffer, source, ptr - source + 1); buffer[ptr - source + 1] = '\0'; /* Have I processed this subdirectory already? Check to see if * I encountered the same subdir name earlier in the list */ for (j = prj_get_files(); *j != NULL; ++j) { if (strncmp(buffer, *j, strlen(buffer)) == 0) break; } if (i == j) { /* Not processed earlier, process it now. Make a local copy * because 'buffer' will be reused in the next call */ char* newpath = (char*)malloc(strlen(buffer) + 1); strcpy(newpath, buffer); print_source_tree(newpath, cb); free(newpath); } } } } /* Now send all files that live in 'path' */ for (i = prj_get_files(); *i != NULL; ++i) { const char* source = (*i); const char* ptr = strrchr(source, '/'); /* Make sure file is in path and not a subdir under path */ if (strncmp(path, source, strlen(path)) == 0 && ptr <= source + strlen(path)) cb(source, WST_SOURCEFILE); } /* Close the enclosing group */ strcpy(buffer, path); if (buffer[strlen(buffer)-1] == '/') /* Trim off trailing path separator */ buffer[strlen(buffer)-1] = '\0'; cb(buffer, WST_CLOSEGROUP); } /************************************************************************ * Replace special XML characters. ***********************************************************************/ const char* xmlEscape(const char* value) { const char* ptr; int len; len = 0; buffer[0] = '\0'; for (ptr = value; *ptr != '\0'; ++ptr) { switch (*ptr) { case '\"': strcat(buffer, """); len += 6; break; case '&': strcat(buffer, "&"); len += 5; break; case '\'': strcat(buffer, "'"); len += 6; break; case '<': strcat(buffer, "<"); len += 4; break; case '>': strcat(buffer, ">"); len += 4; break; default: buffer[len++] = *ptr; buffer[len] = '\0'; } } return buffer; } premake-3.7.orig/Src/io.h0000644000000000000000000000314710633331244012147 0ustar /********************************************************************** * Premake - io.h * File and directory I/O routines. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ struct PlatformMaskData; typedef struct PlatformMaskData* MaskHandle; int io_chdir(const char* path); int io_closefile(); int io_copyfile(const char* src, const char* dst); int io_direxists(const char* path); int io_fileexists(const char* path); const char* io_findlib(const char* name); const char* io_getcwd(); int io_mask_close(MaskHandle data); const char* io_mask_getname(MaskHandle data); int io_mask_getnext(MaskHandle data); int io_mask_isfile(MaskHandle data); MaskHandle io_mask_open(const char* mask); int io_mkdir(const char* path); int io_openfile(const char* path); void io_print(const char* format, ...); int io_remove(const char* path); int io_rmdir(const char* path, const char* dir); premake-3.7.orig/Src/sharpdev_cs.c0000644000000000000000000002171210644156034014036 0ustar /********************************************************************** * Premake - sharpdev.c * The SharpDevelop and MonoDevelop C# target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "sharpdev.h" #include "os.h" static char buffer[8192]; static void listFiles(const char* path, int stage); static void printFile(const char* file); static const char* listReferences(const char* name); int sharpdev_cs() { const char* kind; const char* runtime; const char* csc; int i; /* Figure out what I'm building */ if (prj_is_kind("winexe")) kind = "WinExe"; else if (prj_is_kind("exe")) kind = "Exe"; else if (prj_is_kind("dll") || prj_is_kind("aspnet")) kind = "Library"; else { printf("** Error: unknown package kind '%s'\n", prj_get_kind()); return 0; } /* Figure out what .NET environment I'm using */ if (g_dotnet == NULL) g_dotnet = (os_is("windows") || sharpdev_target == MONODEV) ? "ms" : "mono"; if (strcmp(g_dotnet, "ms") == 0) { runtime = "MsNet"; csc = "Csc"; } else if (strcmp(g_dotnet, "mono") == 0) { runtime = "Mono"; csc = "Mcs"; } else if (strcmp(g_dotnet, "pnet") == 0) { printf("** Error: SharpDevelop does not yet support Portable.NET\n"); return 0; } else { printf("** Error: unknown .NET runtime '%s'\n", g_dotnet); return 0; } /* Write the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "prjx"))) return 0; prj_select_config(0); /* Project Header */ if (sharpdev_target == SHARPDEV) io_print("\n", prj_get_pkgname(), prj_get_pkgname()); else io_print("\n", prj_get_pkgname(), prj_get_pkgname()); /* File List */ io_print(" \n"); print_source_tree("", listFiles); io_print(" \n"); /* References - all configuration will use the same set */ io_print(" \n"); print_list(prj_get_links(), " \n", "", listReferences); io_print(" \n"); io_print(" \n"); /* Configurations */ io_print(" \n", xmlEscape(prj_get_cfgname())); for (i = 0; i < prj_get_numconfigs(); ++i) { int optimized; prj_select_config(i); optimized = prj_has_flag("optimize") || prj_has_flag("optimize-size") || prj_has_flag("optimize-speed"); io_print(" \n", prj_has_flag("fatal-warnings") ? "False" : "True", xmlEscape(prj_get_cfgname())); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); } io_print(" \n"); io_print("\n"); io_closefile(); return 1; } /************************************************************************ * Callback for print_source_tree() ***********************************************************************/ static void listFiles(const char* path, int stage) { switch (stage) { case WST_OPENGROUP: if (strlen(path) > 0) { io_print(" \n"); } break; case WST_CLOSEGROUP: break; case WST_SOURCEFILE: printFile(path); break; } } static void printFile(const char* file) { const char* ext; const char* prefix = ""; const char* subtype = ""; const char* action = "Nothing"; const char* depends = ""; if (file[0] != '.') prefix = "./"; ext = path_getextension(file); /* If a build action was specified, use it */ prj_select_file(file); if (prj_get_buildaction() != NULL) { action = prj_get_buildaction(); if (matches(action, "EmbeddedResource")) action = "EmbedAsResource"; if (matches(action, "None")) action = "Nothing"; if (matches(action, "Content")) { puts("** Warning: SharpDevelop does not support the 'Content' build action"); action = "Nothing"; } subtype = "Code"; } else if (matches(ext, ".cs")) { subtype = "Code"; action = "Compile"; } else if (matches(ext, ".resx")) { /* If a matching .cs file exists, link it */ strcpy(buffer, file); strcpy(buffer + strlen(file) - 5, ".cs"); if (prj_has_file(buffer)) { /* Path is relative to .resx file, I assume both are in same * directory and cut off path information */ depends = path_getname(buffer); } subtype = "Code"; action = "EmbedAsResource"; } else { prj_select_file(file); subtype = "Code"; action = prj_get_buildaction(); if (action == NULL || matches(action, "Content")) { sharpdev_warncontent = 1; action = "Nothing"; } } io_print(" \n", prefix, file, subtype, action, depends); } /************************************************************************ * Prints entry for each reference listed in the package ***********************************************************************/ static const char* listReferences(const char* name) { int i; int isSibling = 0; const char* fileName = path_getname(name); strcpy(buffer," type=\""); /* A bit of craziness here...#dev wants to know if an assembly is local * (type == "Assembly") or in the GAC (type == "GAC"). I would prefer * to not have to specify this in the premake script if I can get away * with it. So for each reference I check to see if it is a sibling * project, and if so I consider it local. If not, I check all of the * reference paths to see if I can find the DLL and if so I consider * it local. If not, I consider it in the GAC. Seems to work so far */ for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(prj_get_pkgname_for(i), name)) { isSibling = 1; break; } } if(isSibling) { strcat(buffer, "Project\""); strcat(buffer, " refto=\""); strcat(buffer, fileName); strcat(buffer, "\" localcopy=\"True\""); } else { const char* ext = strchr(name,',') ? "" : ".dll"; /* See if this assembly exists on one of the link paths */ if (io_fileexists(path_join(prj_get_bindir(), name, ext))) { strcat(buffer, "Assembly\" refto=\""); strcat(buffer, path_build(prj_get_pkgpath(), prj_get_bindir())); strcat(buffer, "/"); strcat(buffer, name); strcat(buffer, ".dll\" localcopy=\"False\""); } else { strcat(buffer, "Gac\" refto=\""); strcat(buffer, name); strcat(buffer, ext); strcat(buffer, "\" localcopy=\"False\""); } } return buffer; } premake-3.7.orig/Src/platform.h0000644000000000000000000000301610475362632013370 0ustar /********************************************************************** * Premake - platform.h * Platform-specific functions. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int platform_chdir(const char* path); int platform_copyfile(const char* src, const char* dest); int platform_findlib(const char* name, char* buffer, int len); int platform_getcwd(char* buffer, int len); void platform_getuuid(char* uuid); int platform_isAbsolutePath(const char* path); int platform_mask_close(MaskHandle data); const char* platform_mask_getname(MaskHandle data); int platform_mask_getnext(MaskHandle data); int platform_mask_isfile(MaskHandle data); MaskHandle platform_mask_open(const char* mask); int platform_mkdir(const char* path); int platform_remove(const char* path); int platform_rmdir(const char* path); premake-3.7.orig/Src/platform_posix.c0000644000000000000000000001201211003163674014572 0ustar /********************************************************************** * Premake - platform_posix.h * Windows-specific functions. * * Copyright (c) 2002-2005 Jason Perkins. * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include "os.h" #if defined(PLATFORM_POSIX) #include #include #include #include #include #include #include #include #include #include "io.h" #include "path.h" #include "util.h" static char buffer[8192]; struct PlatformMaskData { DIR* handle; struct dirent* entry; char* mask; }; int platform_chdir(const char* path) { return !chdir(path); } int platform_copyfile(const char* src, const char* dest) { sprintf(buffer, "cp %s %s", src, dest); return (system(buffer) == 0); } static int findLibHelper(const char* lib, const char* path) { struct stat sb; sprintf(buffer, "%s/lib%s.so", path, lib); if (stat(buffer, &sb) == 0 && !S_ISDIR(sb.st_mode)) return 1; sprintf(buffer, "%s/%s.so", path, lib); if (stat(buffer, &sb) == 0 && !S_ISDIR(sb.st_mode)) return 1; sprintf(buffer, "%s/%s", path, lib); if (stat(buffer, &sb) == 0 && !S_ISDIR(sb.st_mode)) return 1; return 0; } int platform_findlib(const char* name, char* buffer, int len) { FILE* file; char* libpaths; char* token; libpaths = getenv("LD_LIBRARY_PATH"); token = libpaths != NULL ? strtok(libpaths, ":") : NULL; while (token != NULL) { if (findLibHelper(name, buffer)) { strcpy(buffer, token); return 1; } token = strtok(NULL, ":"); } file = fopen("/etc/ld.so.conf", "rt"); if (file == NULL) return 0; while (!feof(file)) { /* Read a line and trim off any trailing whitespace */ char* ptr; fgets(buffer, 4096, file); ptr = &buffer[strlen(buffer) - 1]; while (isspace(*ptr)) *(ptr--) = '\0'; if (findLibHelper(name, buffer)) { fclose(file); return 1; } } fclose(file); if (findLibHelper(name, "/lib")) { strcpy(buffer, "/lib"); return 1; } if (findLibHelper(name, "/usr/lib")) { strcpy(buffer, "/usr/lib"); return 1; } return 0; } int platform_getcwd(char* buffer, int len) { return (getcwd(buffer, len) == 0); } void platform_getuuid(char* uuid) { FILE* rnd = fopen("/dev/random", "rb"); fread(uuid, 16, 1, rnd); fclose(rnd); } char platform_getseparator() { return '/'; } int platform_isAbsolutePath(const char* path) { return (path[0] == '/'); } int platform_mask_close(MaskHandle data) { if (data->handle != NULL) closedir(data->handle); free(data->mask); free(data); return 1; } const char* platform_mask_getname(MaskHandle data) { strcpy(buffer, path_getdir(data->mask)); if (strlen(buffer) > 0) strcat(buffer, "/"); strcat(buffer, data->entry->d_name); return buffer; } int platform_mask_getnext(MaskHandle data) { const char* mask = path_getname(data->mask); if (data->handle == NULL) return 0; data->entry = readdir(data->handle); while (data->entry != NULL) { if (fnmatch(mask, data->entry->d_name, 0) == 0) return 1; data->entry = readdir(data->handle); } return 0; } int platform_mask_isfile(MaskHandle data) { /* Converting to absolute removes any directories from * the path that haven't been created yet (see below) */ struct stat info; const char* name = platform_mask_getname(data); name = path_absolute(name); if (stat(name, &info) == 0) { return S_ISREG(info.st_mode); } return 0; } MaskHandle platform_mask_open(const char* mask) { const char* path = path_getdir(mask); if (strlen(path) == 0) path = "."; MaskHandle data = ALLOCT(struct PlatformMaskData); data->mask = (char*)malloc(strlen(mask) + 1); strcpy(data->mask, mask); /* Converting to absolute path removes any directories * from the path that haven't been created yet. Can * happen if package.path = (something) where (something) * doesn't exist at the time the script is running. */ path = path_absolute(path); data->handle = opendir(path); return data; } int platform_mkdir(const char* path) { return (mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == 0); } int platform_remove(const char* path) { unlink(path); return 1; } int platform_rmdir(const char* path) { strcpy(buffer, "rm -rf "); strcat(buffer, path); return (system(buffer) == 0); } #endif premake-3.7.orig/Src/vs6.h0000644000000000000000000000151110446776604012266 0ustar /********************************************************************** * Premake - vs6.h * The Visual C++ 6 target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int vs6_generate(); int vs6_cpp(); premake-3.7.orig/Src/vs2005.c0000644000000000000000000001615010455254260012474 0ustar /********************************************************************** * Premake - vs2005.c * The Visual Studio 2005 target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "premake.h" #include "vs.h" #include "vs2005.h" static int vs2005_write_solution(); static const char* list_aspnet_refs(const char* name); int vs2005_generate() { int p; vs_setversion(VS2005); printf("Generating Visual Studio 2005 solution and project files:\n"); /* Assign GUIDs to packages */ vs_assign_guids(); /* Generate the project files */ for (p = 0; p < prj_get_numpackages(); ++p) { prj_select_package(p); prj_select_config(0); printf("...%s\n", prj_get_pkgname()); if (prj_is_kind("aspnet")) { /* No project files?! */ } else if (prj_is_lang("c++") || prj_is_lang("c")) { if (!vs_write_cpp()) return 0; } else if (prj_is_lang("c#")) { if (!vs2005_cs()) return 0; } else { printf("** Warning: %s packages are not supported by this generator\n", prj_get_language()); } } return vs2005_write_solution(); } /************************************************************************ * Write out the solution file ***********************************************************************/ static int vs2005_write_solution() { VsPkgData* data; int hasDotNet, hasCpp; int i, j; int numAspNet, port; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "sln"))) return 0; /* Format identification string */ io_print("Microsoft Visual Studio Solution File, Format Version 9.00\n"); io_print("# Visual Studio 2005\n"); /* List packages */ numAspNet = 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); prj_select_config(0); data = (VsPkgData*)prj_get_data(); if (prj_is_kind("aspnet")) { const char* path = prj_get_pkgpath(); if (strlen(path) == 0) path = "."; io_print("Project(\"{%s}\") = \"%s\", \"%s\\\", \"{%s}\"\n", data->toolGuid, prj_get_pkgname(), path, data->projGuid); io_print("\tProjectSection(WebsiteProperties) = preProject\n"); if (prj_get_numlinks() > 0) print_list(prj_get_links(), "\t\tProjectReferences = \"", ";\"\n", ";", list_aspnet_refs); for (j = 0; j < prj_get_numconfigs(); ++j) { prj_select_config(j); io_print("\t\t%s.AspNetCompiler.VirtualPath = \"/%s\"\n", prj_get_cfgname(), prj_get_pkgname()); io_print("\t\t%s.AspNetCompiler.PhysicalPath = \"%s\\\"\n", prj_get_cfgname(), path); io_print("\t\t%s.AspNetCompiler.TargetPath = \"PrecompiledWeb\\%s\\\"\n", prj_get_cfgname(), prj_get_pkgname()); io_print("\t\t%s.AspNetCompiler.Updateable = \"true\"\n", prj_get_cfgname()); io_print("\t\t%s.AspNetCompiler.ForceOverwrite = \"true\"\n", prj_get_cfgname()); io_print("\t\t%s.AspNetCompiler.FixedNames = \"false\"\n", prj_get_cfgname()); io_print("\t\t%s.AspNetCompiler.Debug = \"%s\"\n", prj_get_cfgname(), prj_has_flag("no-symbols") ? "False" : "True"); } if (numAspNet == 0) port = 1106; else if (numAspNet == 1) port = 1231; else port = 1251 + 2 * (numAspNet - 2); io_print("\t\tVWDPort = \"%d\"\n", port); numAspNet++; if (prj_is_lang("c#")) io_print("\t\tDefaultWebSiteLanguage = \"Visual C#\"\n"); io_print("\tEndProjectSection\n"); } else { io_print("Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"\n", data->toolGuid, prj_get_pkgname(), prj_get_pkgfilename(data->projExt), data->projGuid); /* Write dependencies */ prj_select_config(0); io_print("\tProjectSection(ProjectDependencies) = postProject\n"); print_list(prj_get_links(), "\t\t", "\n", "", vs_list_pkgdeps); io_print("\tEndProjectSection\n"); } io_print("EndProject\n"); } /* List configurations */ io_print("Global\n"); io_print("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"); hasDotNet = 0; hasCpp = 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); if (prj_is_lang("c") || prj_is_lang("c++")) hasCpp = 1; else hasDotNet = 1; } prj_select_package(0); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); if (hasDotNet) io_print("\t\t%s|Any CPU = %s|Any CPU\n", prj_get_cfgname(), prj_get_cfgname()); if (hasDotNet && hasCpp) io_print("\t\t%s|Mixed Platforms = %s|Mixed Platforms\n", prj_get_cfgname(), prj_get_cfgname()); if (hasCpp) io_print("\t\t%s|Win32 = %s|Win32\n", prj_get_cfgname(), prj_get_cfgname()); } io_print("\tEndGlobalSection\n"); /* Write configuration for each package */ io_print("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); for (j = 0; j < prj_get_numconfigs(); ++j) { const char* arch; prj_select_config(j); data = (VsPkgData*)prj_get_data(); if (prj_is_lang("c") || prj_is_lang("c++")) arch = "Win32"; else arch = "Any CPU"; if (hasDotNet) { io_print("\t\t{%s}.%s|Any CPU.ActiveCfg = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); if (!prj_is_lang("c") && !prj_is_lang("c++")) io_print("\t\t{%s}.%s|Any CPU.Build.0 = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); } if (hasDotNet && hasCpp) { io_print("\t\t{%s}.%s|Mixed Platforms.ActiveCfg = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); io_print("\t\t{%s}.%s|Mixed Platforms.Build.0 = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); } if (hasCpp) { io_print("\t\t{%s}.%s|Win32.ActiveCfg = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); if (prj_is_lang("c") || prj_is_lang("c++")) io_print("\t\t{%s}.%s|Win32.Build.0 = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); } } } io_print("\tEndGlobalSection\n"); /* Finish */ io_print("\tGlobalSection(SolutionProperties) = preSolution\n"); io_print("\t\tHideSolutionNode = FALSE\n"); io_print("\tEndGlobalSection\n"); io_print("EndGlobal\n"); io_closefile(); return 1; } static const char* list_aspnet_refs(const char* name) { int i = prj_find_package(name); if (i >= 0) { VsPkgData* data = (VsPkgData*)prj_get_data_for(i); sprintf(g_buffer, "{%s}|%s.dll", data->projGuid, prj_get_pkgname_for(i)); return g_buffer; } return NULL; } premake-3.7.orig/Src/monodev.c0000644000000000000000000000704210633323702013200 0ustar /********************************************************************** * Premake - monodev.c * The MonoDevelop target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "monodev.h" int monodev_target; int monodev_warncontent; static int writeCombine(); int monodev_generate() { int i; monodev_warncontent = 0; puts("Generating MonoDevelop solution and project files:"); if (!writeCombine()) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c#")) { if (!monodev_cs()) return 0; } else if (prj_is_lang("c++") || prj_is_lang("c")) { printf("** Error: this generator does not support C/C++ development.\n"); return 0; } else { printf("** Error: unrecognized language '%s'\n", prj_get_language()); return 0; } } if (monodev_warncontent) { puts("\n** Warning: this project uses the 'Content' build action. This action is not"); puts(" supported by Monodevelop; some manual configuration may be needed."); } return 1; } static int writeCombine() { const char* path; int i, j; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "mds"))) return 0; io_print("\n", prj_get_name()); /* Write out the entries for each build configuration */ prj_select_package(0); prj_select_config(0); io_print(" \n", xmlEscape(prj_get_cfgname())); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print(" \n", xmlEscape(prj_get_cfgname())); /* List all packages under this configuration */ prj_select_config(0); for(j = 0; j < prj_get_numpackages(); j++) { prj_select_package(j); io_print(" \n", prj_get_pkgname(), xmlEscape(prj_get_cfgname())); } io_print(" \n"); } io_print(" \n"); /* TODO: select the first executable project */ prj_select_package(0); io_print(" \n", prj_get_pkgname()); /* Write out the startup entries */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); io_print(" \n", prj_get_pkgname()); } io_print(" \n"); io_print(" \n"); /* Write out the project entries */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); path = prj_get_pkgfilename("mdp"); io_print(" \n", path); } io_print(" \n"); /* Finish */ io_print(""); io_closefile(); return 1; } premake-3.7.orig/Src/cb.h0000644000000000000000000000150410456766071012134 0ustar /********************************************************************** * Premake - cb.h * The Code::Blocks target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int cb_generate(); int cb_cpp(); premake-3.7.orig/Src/path.h0000644000000000000000000000312110446776604012503 0ustar /********************************************************************** * Premake - path.h * Path handling routines. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ const char* path_absolute(const char* path); const char* path_build(const char* from, const char* to); const char* path_combine(const char* path0, const char* path1); int path_compare(const char* path0, const char* path1); const char* path_getbasename(const char* path); const char* path_getextension(const char* path); const char* path_getdir(const char* path); const char* path_getname(const char* path); char path_getseparator(const char* type); const char* path_join(const char* dir, const char* name, const char* ext); const char* path_normalize(const char* path); const char* path_swapextension(const char* path, const char* from, const char* to); const char* path_translate(const char* path, const char* type); void path_translateInPlace(char* buffer, const char* type); premake-3.7.orig/Src/vs6_cpp.c0000644000000000000000000002623310650007770013117 0ustar /********************************************************************** * Premake - vs6_cpp.c * The Visual C++ 6 C/C++ target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "vs6.h" static void writeCppFlags(); static void writeLinkFlags(); static const char* filterLinks(const char* name); static void listFiles(const char* path, int stage); int vs6_cpp() { const char* projTypeTag; const char* projTypeId; int i; /* Start the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "dsp"))) return 0; prj_select_config(0); if (prj_is_kind("winexe")) { projTypeTag = "Win32 (x86) Application"; projTypeId = "0x0101"; } else if (prj_is_kind("exe")) { projTypeTag = "Win32 (x86) Console Application"; projTypeId = "0x0103"; } else if (prj_is_kind("dll")) { projTypeTag = "Win32 (x86) Dynamic-Link Library"; projTypeId = "0x0102"; } else if (prj_is_kind("lib")) { projTypeTag = "Win32 (x86) Static Library"; projTypeId = "0x0104"; } else { puts("** Error: unrecognized package type"); return 0; } io_print("# Microsoft Developer Studio Project File - Name=\"%s\" - Package Owner=<4>\n", prj_get_pkgname()); io_print("# Microsoft Developer Studio Generated Build File, Format Version 6.00\n"); io_print("# ** DO NOT EDIT **\n"); io_print("\n"); io_print("# TARGTYPE \"%s\" %s\n", projTypeTag, projTypeId); io_print("\n"); prj_select_config(0); io_print("CFG=%s - Win32 %s\n", prj_get_pkgname(), prj_get_cfgname()); io_print("!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n"); io_print("!MESSAGE use the Export Makefile command and run\n"); io_print("!MESSAGE \n"); io_print("!MESSAGE NMAKE /f \"%s.mak\".\n", prj_get_pkgname()); io_print("!MESSAGE \n"); io_print("!MESSAGE You can specify a configuration when running NMAKE\n"); io_print("!MESSAGE by defining the macro CFG on the command line. For example:\n"); io_print("!MESSAGE \n"); io_print("!MESSAGE NMAKE /f \"%s.mak\" CFG=\"%s - Win32 %s\"\n", prj_get_pkgname(), prj_get_pkgname(), prj_get_cfgname()); io_print("!MESSAGE \n"); io_print("!MESSAGE Possible choices for configuration are:\n"); io_print("!MESSAGE \n"); for (i = prj_get_numconfigs() - 1; i >= 0; --i) { prj_select_config(i); io_print("!MESSAGE \"%s - Win32 %s\" (based on \"%s\")\n", prj_get_pkgname(), prj_get_cfgname(), projTypeTag); } io_print("!MESSAGE \n"); io_print("\n"); io_print("# Begin Project\n"); io_print("# PROP AllowPerConfigDependencies 0\n"); io_print("# PROP Scc_ProjName \"\"\n"); io_print("# PROP Scc_LocalPath \"\"\n"); io_print("CPP=cl.exe\n"); if (!prj_is_kind("lib")) io_print("MTL=midl.exe\n"); io_print("RSC=rc.exe\n\n"); for (i = prj_get_numconfigs() - 1; i >= 0; --i) { const char* debugSymbol; int optimizeSize = prj_has_flag("optimize-size"); int optimizeSpeed = prj_has_flag("optimize-speed") || prj_has_flag("optimize"); int useDebugLibs = (!optimizeSize && !optimizeSpeed); prj_select_config(i); io_print("!%s \"$(CFG)\" == \"%s - Win32 %s\"\n\n", (i == (prj_get_numconfigs() - 1) ? "IF" : "ELSEIF"), prj_get_pkgname(), prj_get_cfgname()); io_print("# PROP BASE Use_MFC 0\n"); io_print("# PROP BASE Use_Debug_Libraries %d\n", useDebugLibs ? 1 : 0); io_print("# PROP BASE Output_Dir \"%s\"\n", prj_get_outdir()); io_print("# PROP BASE Intermediate_Dir \"%s\"\n", prj_get_objdir()); io_print("# PROP BASE Target_Dir \"\"\n"); io_print("# PROP Use_MFC 0\n"); io_print("# PROP Use_Debug_Libraries %d\n", useDebugLibs ? 1 : 0); io_print("# PROP Output_Dir \"%s\"\n", prj_get_outdir()); io_print("# PROP Intermediate_Dir \"%s\"\n", prj_get_objdir()); if (prj_is_kind("dll") && prj_has_flag("no-import-lib")) io_print("# PROP Ignore_Export_Lib 1\n"); io_print("# PROP Target_Dir \"\"\n"); io_print("# ADD BASE CPP /nologo"); writeCppFlags(); io_print("# ADD CPP /nologo"); writeCppFlags(); debugSymbol = prj_has_flag("no-symbols") ? "NDEBUG" : "_DEBUG"; if (prj_is_kind("winexe") || prj_is_kind("dll")) { io_print("# ADD BASE MTL /nologo /D \"%s\" /mktyplib203 /win32\n", debugSymbol); io_print("# ADD MTL /nologo /D \"%s\" /mktyplib203 /win32\n", debugSymbol); } io_print("# ADD BASE RSC /l 0x409 /d \"%s\"", debugSymbol); print_list(prj_get_resdefines(), " /d \"", "\"", "", NULL); print_list(prj_get_respaths(), " /i \"", "\"", "", NULL); print_list(prj_get_resoptions(), " ", "", "", NULL); io_print("\n"); io_print("# ADD RSC /l 0x409 /d \"%s\"", debugSymbol); print_list(prj_get_resdefines(), " /d \"", "\"", "", NULL); print_list(prj_get_respaths(), " /i \"", "\"", "", NULL); print_list(prj_get_resoptions(), " ", "", "", NULL); io_print("\n"); io_print("BSC32=bscmake.exe\n"); io_print("# ADD BASE BSC32 /nologo\n"); io_print("# ADD BSC32 /nologo\n"); if (prj_is_kind("lib")) { io_print("LINK32=link.exe -lib\n"); io_print("# ADD BASE LIB32 /nologo\n"); io_print("# ADD LIB32 /nologo"); io_print(" /out:\"%s\"\n", prj_get_target()); } else { io_print("LINK32=link.exe\n"); io_print("# ADD BASE LINK32"); writeLinkFlags(); io_print("# ADD LINK32"); writeLinkFlags(); } if (prj_get_numprelinkcommands() > 0 || prj_get_numpostbuildcommands() > 0) { io_print("# Begin Special Build Tool\n"); if (prj_get_numprelinkcommands() > 0) { io_print("PreLink_Cmds="); print_list(prj_get_prelinkcommands(), "", "", "\t", NULL); io_print("\n"); } if (prj_get_numpostbuildcommands() > 0) { io_print("PostBuild_Cmds="); print_list(prj_get_postbuildcommands(), "", "", "\t", NULL); io_print("\n"); } io_print("# End Special Build Tool\n"); } io_print("\n"); } io_print("!ENDIF\n"); io_print("\n"); io_print("# Begin Target\n"); io_print("\n"); for (i = prj_get_numconfigs() - 1; i >= 0; --i) { prj_select_config(i); io_print("# Name \"%s - Win32 %s\"\n", prj_get_pkgname(), prj_get_cfgname()); } print_source_tree("", listFiles); io_print("# End Target\n"); io_print("# End Project\n"); io_closefile(); return 1; } /************************************************************************ * Writes compiler flags for current configuration ***********************************************************************/ static void writeCppFlags() { int optimizeSize = prj_has_flag("optimize-size"); int optimizeSpeed = prj_has_flag("optimize-speed") || prj_has_flag("optimize"); int useDebugLibs = (!optimizeSize && !optimizeSpeed); if (useDebugLibs) io_print(prj_has_flag("static-runtime") ? " /MTd" : " /MDd"); else io_print(prj_has_flag("static-runtime") ? " /MT" : " /MD"); io_print(" /W%d", prj_has_flag("extra-warnings") ? 4 : 3); if (prj_has_flag("fatal-warnings")) io_print(" /WX"); if (useDebugLibs) io_print(" /Gm"); /* minimal rebuild */ if (!prj_has_flag("no-rtti")) io_print(" /GR"); if (!prj_has_flag("no-exceptions")) io_print(" /GX"); if (!prj_has_flag("no-symbols")) io_print(" /ZI"); /* debug symbols for edit-and-continue */ if (optimizeSize) io_print(" /O1"); else if (optimizeSpeed) io_print(" /O2"); else io_print(" /Od"); if (prj_has_flag("no-frame-pointer")) io_print(" /Oy"); print_list(prj_get_incpaths(), " /I \"", "\"", "", NULL); print_list(prj_get_defines(), " /D \"", "\"", "", NULL); io_print(" /YX /FD"); if (!optimizeSize && !optimizeSpeed) io_print(" /GZ"); io_print(" /c"); print_list(prj_get_buildoptions(), " ", "", "", NULL); io_print("\n"); } /************************************************************************ * Writes linker flags for current configuration ***********************************************************************/ static void writeLinkFlags() { print_list(prj_get_links(), " ", ".lib", "", filterLinks); io_print(" /nologo"); if ((prj_is_kind("winexe") || prj_is_kind("exe")) && !prj_has_flag("no-main")) io_print(" /entry:\"mainCRTStartup\""); if (prj_is_kind("winexe")) io_print(" /subsystem:windows"); else if (prj_is_kind("exe")) io_print(" /subsystem:console"); else io_print(" /dll"); if (!prj_has_flag("no-symbols")) io_print(" /incremental:yes /debug"); io_print(" /machine:I386"); if (prj_is_kind("dll")) { io_print(" /implib:\""); if (prj_has_flag("no-import-lib")) { io_print(prj_get_objdir()); } else { const char* str; io_print(prj_get_libdir()); str = path_getdir(prj_get_target_raw()); if (strlen(str) > 0) io_print("/%s", str); } if (prj_has_importlibname()) io_print("/%s.lib\"", prj_get_importlibname()); else io_print("/%s.lib\"", path_getbasename(prj_get_target())); } io_print(" /out:\"%s\"", prj_get_target()); if (!prj_has_flag("no-symbols")) io_print(" /pdbtype:sept"); io_print(" /libpath:\"%s\"", prj_get_libdir()); print_list(prj_get_libpaths(), " /libpath:\"", "\"", "", NULL); print_list(prj_get_linkoptions(), " ", "", "", NULL); io_print("\n"); } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* filterLinks(const char* name) { int i = prj_find_package(name); if (i >= 0) { /* If this is a sibling package, don't return anything. VC6 * links to dependent projects implicitly */ return NULL; } else { return name; } } /************************************************************************ * Callback for print_source_tree() ***********************************************************************/ static void listFiles(const char* path, int stage) { const char* ptr = strrchr(path, '/'); ptr = (ptr == NULL) ? path : ptr + 1; switch (stage) { case WST_OPENGROUP: if (strlen(path) > 0 && strcmp(ptr, "..") != 0) { io_print("# Begin Group \"%s\"\n\n", ptr); io_print("# PROP Default_Filter \"\"\n"); } break; case WST_CLOSEGROUP: if (strlen(path) > 0 && strcmp(ptr, "..") != 0) io_print("# End Group\n"); break; case WST_SOURCEFILE: io_print("# Begin Source File\n\n"); io_print("SOURCE=%s\n", path); io_print("# End Source File\n"); break; } } premake-3.7.orig/Src/cb.c0000644000000000000000000000567510475362632012140 0ustar /********************************************************************** * Premake - cb.c * The Code::Blocks target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "cb.h" static int writeWorkspace(); int cb_generate() { int i; puts("Generating Code::Blocks workspace and project files:"); if (!writeWorkspace()) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c++") || prj_is_lang("c")) { if (!cb_cpp()) return 0; } else { printf("** Error: unsupported language '%s'\n", prj_get_language()); return 0; } } return 1; } /************************************************************************ * List callback: scans the list of links for a package. If a link is * found to a sibling package, prints a dependency string for the * workspace file. ***********************************************************************/ static const char* printProjectDependencies(const char* name) { int i; for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(prj_get_pkgname_for(i), name)) { const char* filename = prj_get_pkgfilename_for(i, "cbp"); if (startsWith(filename, "./")) filename += 2; io_print("\t\t\t\n", filename); } } return NULL; } static int writeWorkspace() { int i; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "workspace"))) return 0; io_print("\n"); io_print("\n"); io_print("\t\n", prj_get_name()); for (i = 0; i < prj_get_numpackages(); ++i) { const char* filename; prj_select_package(i); filename = prj_get_pkgfilename("cbp"); if (startsWith(filename, "./")) filename += 2; io_print("\t\t\n"); /* Write project dependencies */ prj_select_config(0); print_list(prj_get_links(), "", "", "", printProjectDependencies); io_print("\t\t\n"); } io_print("\t\n"); io_print("\n"); io_closefile(); return 1; } premake-3.7.orig/Src/vs2008_cs.c0000644000000000000000000002244311003166564013165 0ustar /********************************************************************** * Premake - vs2008_cs.c * The Visual Studio 2008 C# target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "vs.h" #include "vs2008.h" static const char* listFiles(const char* name); static const char* listReferences(const char* name); int vs2008_cs() { VsPkgData* data = (VsPkgData*)prj_get_data(); int c; if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj"))) return 0; io_print("\n"); io_print(" \n"); /* Write default configuration */ prj_select_config(0); io_print(" %s\n", xmlEscape(prj_get_cfgname())); io_print(" AnyCPU\n"); io_print(" 9.0.50727\n"); io_print(" 2.0\n"); io_print(" {%s}\n", data->projGuid); io_print(" "); if (prj_is_kind("winexe")) io_print("WinExe"); else if (prj_is_kind("exe")) io_print("Exe"); else if (prj_is_kind("dll") || prj_is_kind("aspnet")) io_print("Library"); else { printf("** Error: unknown package kind '%s'\n", prj_get_kind()); return 0; } io_print("\n"); io_print(" Properties\n"); io_print(" %s\n", path_getbasename(prj_get_target())); io_print(" %s\n", path_getbasename(prj_get_target())); io_print(" \n"); for (c = 0; c < prj_get_numconfigs(); ++c) { prj_select_config(c); io_print(" \n", xmlEscape(prj_get_cfgname())); if (!prj_has_flag("no-symbols")) { io_print(" true\n"); io_print(" full\n"); } else { io_print(" pdbonly\n"); } if (prj_has_flag("optimize") || prj_has_flag("optimize-size") || prj_has_flag("optimize-speed")) io_print(" true\n"); else io_print(" false\n"); io_print(" %s\\\n", prj_get_outdir()); io_print(" "); print_list(prj_get_defines(), "", "", ";", xmlEscape); io_print("\n"); io_print(" prompt\n"); io_print(" 4\n"); if (prj_has_flag("unsafe")) io_print(" true\n"); if (prj_has_flag("fatal-warnings")) io_print(" true\n"); io_print(" \n"); } /* Must use same references for all configurations */ prj_select_config(0); io_print(" \n"); print_list(prj_get_links(), "", "", "", listReferences); io_print(" \n"); io_print(" \n"); print_list(prj_get_files(), "", "", "", listFiles); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print("\n"); io_closefile(); /* Now write the .csproj.user file for non-web applications or * .csproj.webinfo for web applications */ if (!prj_is_kind("aspnet")) { if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj.user"))) return 0; io_print("\n"); io_print(" \n"); io_print(" "); strcpy(g_buffer, io_getcwd()); io_chdir(prj_get_pkgpath()); print_list(prj_get_libpaths(), "", ";", "", vs_list_refpaths); io_print(vs_list_refpaths(prj_get_bindir())); io_chdir(g_buffer); io_print("\n"); io_print(" \n"); io_print("\n"); } else { if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj.webinfo"))) return 0; } io_closefile(); return 1; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* listReferences(const char* name) { /* Is this a sibling package? */ int i = prj_find_package(name); if (i >= 0) { VsPkgData* data = (VsPkgData*)prj_get_data_for(i); strcpy(g_buffer, path_build(prj_get_pkgpath(), prj_get_pkgpath_for(i))); io_print(" \n", path_translate(g_buffer, "windows"), name); io_print(" {%s}\n", data->projGuid); io_print(" %s\n", name); io_print(" \n"); } else { io_print(" \n", name); } return NULL; } /************************************************************************ * Builds an entry for each file in the project ***********************************************************************/ static const char* listFiles(const char* name) { const char* related; /* If a build action was specified, use it */ prj_select_file(name); if (prj_get_buildaction() != NULL) { if (matches(prj_get_buildaction(), "Content")) { io_print(" \n", path_translate(name, "windows")); io_print(" PreserveNewest\n"); io_print(" \n"); } else { io_print(" <%s Include=\"%s\" />\n", prj_get_buildaction(), path_translate(name, "windows")); } return NULL; } if (endsWith(name, ".cs")) { int fullstop = 0; io_print(" \n %s\n", path_getname(g_buffer)); fullstop = 1; } else { /* ...look for a .resx dependency */ strcpy(g_buffer, path_swapextension(name, ".Designer.cs", ".resx")); if (prj_has_file(g_buffer)) { io_print(">\n True\n"); io_print(" %s\n", path_getname(g_buffer)); fullstop = 1; } } } else { /* If a matching ".Designer.cs" exists, mark this as a Form */ related = path_swapextension(name, ".cs", ".Designer.cs"); if (prj_has_file(related)) { io_print(">\n Form\n"); fullstop = 1; } } io_print(fullstop ? " \n" : " />\n"); } else if (endsWith(name, ".resx")) { int fullstop = 0; io_print(" \n"); /* Is this related to a form? */ related = path_swapextension(name, ".resx", ".Designer.cs"); if (prj_has_file(related)) io_print(" Designer\n"); io_print(" %s\n", path_getname(g_buffer)); } else { /* If no .cs but .Designer.cs then auto-generated */ strcpy(g_buffer, path_swapextension(name, ".resx", ".Designer.cs")); if (prj_has_file(g_buffer)) { fullstop = 1; io_print(">\n"); io_print(" Designer\n"); io_print(" ResXFileCodeGenerator\n"); io_print(" %s\n", path_getname(g_buffer)); } } io_print(fullstop ? " \n" : " />\n"); } else { io_print(" \n", path_translate(name, "windows")); } return NULL; } premake-3.7.orig/Src/premake.c0000644000000000000000000002140211065433457013162 0ustar /********************************************************************** * Premake - premake.c * The program entry point. * * Copyright (c) 2002-2008 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include "premake.h" #include "arg.h" #include "os.h" #include "script.h" #include "Lua/lua.h" #include "cb.h" #include "codelite.h" #include "gnu.h" #include "monodev.h" #include "sharpdev.h" #include "vs6.h" #include "vs2002.h" #include "vs2005.h" #include "vs2008.h" #include "open_watcom/ow.h" const char* DEFAULT = "premake.lua"; const char* VERSION = "3.7"; const char* COPYRIGHT = "Copyright (C) 2002-2008 Jason Perkins and the Premake Project"; const char* HELP_MSG = "Type 'premake --help' for help"; const char* g_filename; const char* g_cc; const char* g_dotnet; const char* g_target; int g_verbose; int g_hasScript; static int preprocess(); static int postprocess(); static void showUsage(); int clean(); /********************************************************************** * Program entry point **********************************************************************/ int main(int argc, char** argv) { /* If no args are specified... */ if (argc == 1) { puts(HELP_MSG); return 1; } /* Set defaults */ os_detect(); g_filename = DEFAULT; g_cc = NULL; g_dotnet = NULL; g_verbose = 0; /* Process any options that will effect script processing */ arg_set(argc, argv); if (!preprocess()) return 1; /* chdir() to the directory containing the project script, so that * relative paths may be used in the script */ io_chdir(path_getdir(g_filename)); /* Now run the script */ g_hasScript = script_run(path_getname(g_filename)); if (g_hasScript < 0) { puts("** Script failed to run, ending."); return 1; } /* Process any options that depend on the script output */ arg_reset(); if (!postprocess()) return 1; /* All done */ if (g_hasScript) script_close(); prj_close(); return 0; } /********************************************************************** * Command-line processing that is done before the script is run **********************************************************************/ static int preprocess() { const char* flag = arg_getflag(); while (flag != NULL) { if (matches(flag, "--file")) { g_filename = arg_getflagarg(); if (g_filename == NULL) { puts("** Usage: --file filename"); puts(HELP_MSG); return 0; } if (!io_fileexists(g_filename)) { printf("** Error: can't find file '%s'\n", g_filename); return 0; } } else if (matches(flag, "--os")) { const char* os = arg_getflagarg(); if (os == NULL || !os_set(os)) { puts("** Usage: --os osname"); puts(HELP_MSG); return 0; } } else if (matches(flag, "--version")) { printf("premake (Premake Build Script Generator) %s\n", VERSION); } flag = arg_getflag(); } return 1; } /********************************************************************** * Command-line processing that happens after the script has run **********************************************************************/ static int postprocess() { int noScriptWarning = 0; const char* flag = arg_getflag(); while (flag != NULL) { if (g_hasScript && !script_export()) return 0; if (matches(flag, "--help")) { showUsage(); } else if (matches(flag, "--version")) { /* ignore quietly */ } else if (matches(flag, "--file")) { arg_getflagarg(); } else { if (!g_hasScript) { if (!noScriptWarning) { puts("** No Premake script found!"); noScriptWarning = 1; } } else { script_docommand(flag); } } flag = arg_getflag(); } return 1; } /********************************************************************** * Default command handler **********************************************************************/ int onCommand(const char* cmd, const char* arg) { if (matches(cmd, "target")) { if (prj_get_numpackages() == 0) { printf("** No packages defined\n"); return 0; } if (matches(arg, "cb-gcc")) { g_target = "cb-gcc"; return cb_generate(); } if (matches(arg, "cl-gcc")) { g_target = "cl-gcc"; return codelite_generate(); } if (matches(arg, "gnu")) { g_target = "gnu"; return gnu_generate(); } else if (matches(arg, "monodev") || matches(arg, "md")) { g_target = "monodev"; return monodev_generate(); } else if (matches(arg, "sharpdev") || matches(arg, "sd")) { g_target = "sharpdev"; return sharpdev_generate("sharpdev"); } else if (matches(arg, "vs6")) { g_target = "vs6"; return vs6_generate(); } else if (matches(arg, "vs2002") || matches(arg, "vs7")) { g_target = "vs2002"; return vs2002_generate(2002); } else if (matches(arg, "vs2003")) { g_target = "vs2003"; return vs2002_generate(2003); } else if (matches(arg, "vs2005")) { g_target = "vs2005"; return vs2005_generate(); } else if (matches(arg, "vs2008")) { g_target = "vs2008"; return vs2008_generate(); } else if (matches(arg, "cb-ow")) { g_target = "cb-ow"; return ow_cb_generate(); } else { printf("** Unrecognized target '%s'\n", arg); return 0; } } else if (matches(cmd, "clean")) { return clean(); } else if (matches(cmd, "cc")) { g_cc = arg; } else if (matches(cmd, "dotnet")) { g_dotnet = arg; } else if (matches(cmd, "verbose")) { g_verbose = 1; } return 1; } /********************************************************************** * Help message text **********************************************************************/ void showUsage() { int i; printf("Premake %s, a build script generator\n", VERSION); puts(COPYRIGHT); printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT); puts(""); puts(" --file name Process the specified premake script file"); puts(""); puts(" --clean Remove all binaries and build scripts"); puts(" --verbose Generate verbose makefiles (where applicable)"); puts(""); puts(" --cc name Choose a C/C++ compiler, if supported by target; one of:"); puts(" gcc GNU gcc compiler"); puts(" dmc Digital Mars C/C+ compiler (experimental)"); puts(""); puts(" --dotnet name Choose a .NET compiler set, if supported by target; one of:"); puts(" ms Microsoft (csc)"); puts(" mono Mono (mcs)"); puts(" mono2 Mono .NET 2.0 (gmcs)"); puts(" pnet Portable.NET (cscc)"); puts(""); puts(" --os name Generate files for different operating system; one of:"); puts(" bsd OpenBSD, NetBSD, or FreeBSD"); puts(" linux Linux"); puts(" macosx MacOS X"); puts(" windows Microsoft Windows"); puts(""); puts(" --target name Generate input files for the specified toolset; one of:"); puts(" cb-gcc Code::Blocks Studio with GCC"); puts(" cb-ow Code::Blocks Studio with Open Watcom C/C++"); puts(" cl-gcc CodeLite with GCC"); puts(" gnu GNU Makefile for POSIX, MinGW, and Cygwin"); puts(" monodev MonoDevelop"); puts(" sharpdev ICSharpCode SharpDevelop"); puts(" vs6 Microsoft Visual Studio 6"); puts(" vs2002 Microsoft Visual Studio 2002"); puts(" vs2003 Microsoft Visual Studio 2003"); puts(" vs2005 Microsoft Visual Studio 2005 (includes Express editions)"); puts(" vs2008 Microsoft Visual Studio 2008 (experimental)"); puts(""); puts(" --help Display this information"); puts(" --version Display version information"); puts(""); if (project != NULL && prj_get_numoptions() > 0) { puts("This premake configuration also supports the following custom options:"); puts(""); for (i = 0; i < prj_get_numoptions(); ++i) { prj_select_option(i); printf(" --%-15s %s\n", prj_get_optname(), prj_get_optdesc()); } } puts(""); } premake-3.7.orig/Src/script.h0000644000000000000000000000165410473400723013046 0ustar /********************************************************************** * Premake - script.h * Interface to the Lua scripting engine. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int script_run(const char* filename); int script_export(); int script_docommand(const char* cmd); int script_close(); premake-3.7.orig/Src/project.c0000644000000000000000000005341311062460411013176 0ustar /********************************************************************** * Premake - project.c * An interface around the project data. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "os.h" Project* project = NULL; static Package* my_pkg = NULL; static PkgConfig* my_cfg = NULL; static FileConfig* my_fcfg = NULL; static Option* my_opt = NULL; static char buffer[8192]; /************************************************************************ * Project lifecycle routines ***********************************************************************/ void prj_open() { if (project != NULL) prj_close(); project = ALLOCT(Project); } void prj_close() { int i, j; if (project != NULL) { for (i = 0; i < prj_get_numpackages(); ++i) { Package* package = project->packages[i]; for (j = 0; j < prj_get_numconfigs(); ++j) { PkgConfig* config = package->configs[j]; free((void*)config->buildopts); free((void*)config->defines); free((void*)config->files); free((void*)config->flags); free((void*)config->incpaths); free((void*)config->libpaths); free((void*)config->linkopts); free((void*)config->links); prj_freelist((void**)config->fileconfigs); } prj_freelist((void**)package->configs); if (package->data != NULL) free(package->data); } prj_freelist((void**)project->options); prj_freelist((void**)project->configs); prj_freelist((void**)project->packages); free(project); project = NULL; } } /************************************************************************ * Locate a package by name ***********************************************************************/ int prj_find_package(const char* name) { int i; for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(name, project->packages[i]->name)) return i; } return -1; } /************************************************************************ * Retrieve the active configuration for the given package ***********************************************************************/ PkgConfig* prj_get_config_for(int i) { int j; for (j = 0; j < prj_get_numconfigs(); ++j) { if (my_pkg->configs[j] == my_cfg) return project->packages[i]->configs[j]; } return NULL; } /************************************************************************ * Get/set a file build action ***********************************************************************/ const char* prj_get_buildaction() { return my_fcfg->buildaction; } int prj_is_buildaction(const char* action) { return matches(my_fcfg->buildaction, action); } void prj_set_buildaction(const char* action) { my_fcfg->buildaction = action; } /************************************************************************ * Get/set generator-specific data ***********************************************************************/ void* prj_get_data() { return prj_get_data_for(my_pkg->index); } void* prj_get_data_for(int i) { return project->packages[i]->data; } void prj_set_data(void* data) { my_pkg->data = data; } /************************************************************************ * Return the list of defines for the current object ***********************************************************************/ int prj_get_numdefines() { return prj_getlistsize((void**)prj_get_defines()); } const char** prj_get_defines() { return my_cfg->defines; } /************************************************************************ * Query the object directories ***********************************************************************/ const char* prj_get_bindir() { if (my_cfg->bindir != NULL) { return my_cfg->bindir; } else { strcpy(buffer, path_build(my_pkg->path, my_cfg->prjConfig->bindir)); return buffer; } } /* * Get the relative directory FROM the current package TO the * binary output directory of the specified package. */ const char* prj_get_bindir_for(int i) { PkgConfig* cfg = prj_get_config_for(i); if (cfg->bindir != NULL) { const char* target; Package* pkg = prj_get_package_for(i); strcpy(buffer, path_build(my_pkg->path, pkg->path)); strcat(buffer, "/"); strcat(buffer, cfg->bindir); /* Now convert that to a relative path from here */ target = path_build("", buffer); if (target[0] == '/') ++target; return target; } else { // strcpy(buffer, path_build(my_pkg->path, prj_get_path())); // strcpy(buffer, "/"); // strcpy(buffer, cfg->prjConfig->bindir); strcpy(buffer, path_build(my_pkg->path, my_cfg->prjConfig->bindir)); return buffer; } } const char* prj_get_libdir() { if (my_cfg->libdir != NULL) { return my_cfg->libdir; } else { strcpy(buffer, path_build(my_pkg->path, my_cfg->prjConfig->libdir)); return buffer; } } const char* prj_get_libdir_for(int i) { PkgConfig* cfg = prj_get_config_for(i); if (cfg->libdir != NULL) { const char* target; Package* pkg = prj_get_package_for(i); strcpy(buffer, path_build(my_pkg->path, pkg->path)); strcat(buffer, "/"); strcat(buffer, cfg->libdir); /* Now convert that to a relative path from here */ target = path_build("", buffer); if (target[0] == '/') ++target; return target; } else { strcpy(buffer, path_build(my_pkg->path, my_cfg->prjConfig->libdir)); return buffer; } } const char* prj_get_objdir() { if (my_cfg->objdir != NULL) { return my_cfg->objdir; } else { return path_combine(my_pkg->objdir, my_cfg->prjConfig->name); } } const char* prj_get_pkgobjdir() { if (my_cfg->objdir == NULL) { return my_pkg->objdir; } else { return NULL; } } const char* prj_get_outdir() { return prj_get_outdir_for(my_pkg->index); } const char* prj_get_outdir_for(int i) { const char* targetdir; PkgConfig* cfg = prj_get_config_for(i); if (matches(cfg->kind, "lib")) strcpy(buffer, prj_get_libdir_for(i)); else strcpy(buffer, prj_get_bindir_for(i)); targetdir = path_getdir(cfg->target); if (strlen(targetdir) > 0) { strcat(buffer, "/"); strcat(buffer, targetdir); } return buffer; } /************************************************************************ * Custom target decorations ***********************************************************************/ const char* prj_get_prefix() { return my_cfg->prefix; } const char* prj_get_extension() { return my_cfg->extension; } /************************************************************************ * Return the files associated with the active object ***********************************************************************/ const char** prj_get_files() { return my_cfg->files; } int prj_has_file(const char* name) { const char** ptr = my_cfg->files; while (*ptr != NULL) { if (matches(*ptr, name)) return 1; ptr++; } return 0; } const char* prj_find_filetype(const char* extension) { const char** ptr = my_cfg->files; while (*ptr != NULL) { if (matches(path_getextension(*ptr), extension)) return *ptr; ptr++; } return NULL; } /************************************************************************ * Query the build flags ***********************************************************************/ int prj_has_flag(const char* flag) { return prj_has_flag_for(my_pkg->index, flag); } int prj_has_flag_for(int i, const char* flag) { PkgConfig* cfg = prj_get_config_for(i); const char** ptr = cfg->flags; while (*ptr != NULL) { if (matches(*ptr, flag)) return 1; ptr++; } return 0; } int prj_get_numbuildoptions() { return prj_getlistsize((void**)prj_get_buildoptions()); } const char** prj_get_buildoptions() { return my_cfg->buildopts; } int prj_get_numlinkoptions() { return prj_getlistsize((void**)prj_get_linkoptions()); } const char** prj_get_linkoptions() { return my_cfg->linkopts; } /************************************************************************ * Return the list of pre/post build commands for the current object ***********************************************************************/ int prj_get_numprebuildcommands() { return prj_getlistsize((void**)prj_get_prebuildcommands()); } const char** prj_get_prebuildcommands() { return my_cfg->prebuildcmds; } int prj_get_numprelinkcommands() { return prj_getlistsize((void**)prj_get_prelinkcommands()); } const char** prj_get_prelinkcommands() { return my_cfg->prelinkcmds; } int prj_get_numpostbuildcommands() { return prj_getlistsize((void**)prj_get_postbuildcommands()); } const char** prj_get_postbuildcommands() { return my_cfg->postbuildcmds; } /************************************************************************ * Query the target kind of the current object ***********************************************************************/ const char* prj_get_kind() { return my_cfg->kind; } int prj_is_kind(const char* kind) { return matches(my_cfg->kind, kind); } const char* prj_get_kind_for(int i) { PkgConfig* cfg = prj_get_config_for(i); return cfg->kind; } /************************************************************************ * Return the list of include paths for the current object ***********************************************************************/ int prj_get_numincpaths() { return prj_getlistsize((void**)prj_get_incpaths()); } const char** prj_get_incpaths() { return my_cfg->incpaths; } /************************************************************************ * Query the language of the current object ***********************************************************************/ const char* prj_get_language() { return my_pkg->lang; } const char* prj_get_language_for(int i) { return project->packages[i]->lang; } int prj_is_lang(const char* lang) { return matches(my_pkg->lang, lang); } /************************************************************************ * Return the list of linker paths for the current object ***********************************************************************/ const char** prj_get_libpaths() { return my_cfg->libpaths; } /************************************************************************ * Return the list of links for the current object ***********************************************************************/ int prj_get_numlinks() { return prj_getlistsize((void**)prj_get_links()); } const char** prj_get_links() { return my_cfg->links; } /************************************************************************ * Return the name of the active object ***********************************************************************/ const char* prj_get_name() { return project->name; } const char* prj_get_cfgname() { return my_cfg->prjConfig->name; } const char* prj_get_pkgname() { return my_pkg->name; } const char* prj_get_pkgname_for(int i) { return project->packages[i]->name; } /************************************************************************ * Return the total number of configurations in the project ***********************************************************************/ int prj_get_numconfigs() { return prj_getlistsize((void**)project->configs); } /************************************************************************ * Return the total number of options in the project ***********************************************************************/ int prj_get_numoptions() { return prj_getlistsize((void**)project->options); } /************************************************************************ * Return the total number of packages in the project ***********************************************************************/ int prj_get_numpackages() { return prj_getlistsize((void**)project->packages); } /************************************************************************ * Return the name and description of the currently selected option. ***********************************************************************/ const char* prj_get_optdesc() { return my_opt->desc; } const char* prj_get_optname() { return my_opt->flag; } /************************************************************************ * Return the active object ***********************************************************************/ Package* prj_get_package() { return my_pkg; } Package* prj_get_package_for(int i) { return project->packages[i]; } /************************************************************************ * Return the path to the generated object scripts. ***********************************************************************/ const char* prj_get_path() { return project->path; } const char* prj_get_pkgpath() { return my_pkg->path; } const char* prj_get_pkgpath_for(int i) { return project->packages[i]->path; } const char* prj_get_pkgfilename(const char* extension) { return prj_get_pkgfilename_for(my_pkg->index, extension); } const char* prj_get_pkgfilename_for(int i, const char* extension) { strcpy(buffer, path_build(project->path, prj_get_pkgpath_for(i))); if (strlen(buffer) > 0) strcat(buffer, "/"); strcat(buffer, project->packages[i]->name); if (extension != NULL) { strcat(buffer, "."); strcat(buffer, extension); } return buffer; } /************************************************************************ * Get the PCH information for the configuration. ***********************************************************************/ int prj_has_pch() { return (!prj_has_flag("no-pch") && my_cfg->pchHeader != NULL); } const char* prj_get_pch_header() { return my_cfg->pchHeader; } const char* prj_get_pch_source() { return my_cfg->pchSource; } /************************************************************************ * Query the list of resource defines for the current object ***********************************************************************/ int prj_get_numresdefines() { return prj_getlistsize((void**)prj_get_resdefines()); } const char** prj_get_resdefines() { return my_cfg->resdefines; } /************************************************************************ * Query the list of resource options for the current object ***********************************************************************/ int prj_get_numresoptions() { return prj_getlistsize((void**)prj_get_resoptions()); } const char** prj_get_resoptions() { return my_cfg->resopts; } /************************************************************************ * Query the list of resource paths for the current object ***********************************************************************/ int prj_get_numrespaths() { return prj_getlistsize((void**)prj_get_respaths()); } const char** prj_get_respaths() { return my_cfg->respaths; } /************************************************************************ * Return the script name for an object. ***********************************************************************/ const char* prj_get_script() { return project->script; } const char* prj_get_pkgscript() { return my_pkg->script; } /************************************************************************ * Return the target for the active object. There are a couple of * variants here; at some point I need to walk through all the usages * and see if I can merge these into one method. ***********************************************************************/ const char* prj_get_target() { return prj_get_target_for(my_pkg->index); } const char* prj_get_target_for(int i) { const char* extension = ""; /* Get the active configuration for this target */ Package* pkg = prj_get_package_for(i); PkgConfig* cfg = prj_get_config_for(i); const char* filename = path_getbasename(cfg->target); /* Prepopulate the buffer with the output directory */ prj_get_outdir_for(i); if (matches(buffer, ".")) strcpy(buffer, ""); if (strlen(buffer) > 0) strcat(buffer, "/"); if (cfg->prefix != NULL) strcat(buffer, cfg->prefix); if (matches(pkg->lang, "c#")) { strcat(buffer, filename); if (matches(cfg->kind, "dll")) extension = "dll"; else extension = "exe"; } else if (os_is("windows")) { /* CodeBlocks and GNU uses Unix naming for static libs */ if ((matches(g_target, "cb-gcc") || matches(g_target, "cl-gcc") || matches(g_target, "gnu")) && matches(cfg->kind, "lib")) { if (cfg->prefix == NULL) strcat(buffer, "lib"); strcat(buffer, filename); extension = "a"; } else { strcat(buffer, filename); if (matches(cfg->kind, "lib")) extension = "lib"; else if (matches(cfg->kind, "dll")) extension = "dll"; else extension = "exe"; } } else if (os_is("macosx") && matches(cfg->kind, "dll")) { if (cfg->prefix == NULL) strcat(buffer, "lib"); strcat(buffer, filename); if (prj_has_flag_for(i, "dylib")) extension = "dylib"; else extension = "so"; } else { if (matches(cfg->kind, "lib")) { if (cfg->prefix == NULL) strcat(buffer, "lib"); strcat(buffer, filename); extension = "a"; } else if (matches(cfg->kind, "dll")) { if (cfg->prefix == NULL) strcat(buffer, "lib"); strcat(buffer, filename); extension = "so"; } else { strcat(buffer, filename); } } /* Apply the file extension, which can be customized */ if (cfg->extension != NULL) extension = cfg->extension; if (strlen(extension) > 0) strcat(buffer, "."); strcat(buffer, extension); return buffer; } /* * Okay - I need to start documenting these functions better; I * can't remember what does what any more. This functions gets * the path FROM the current package directory TO the target of * the specified package. As you can see, I got off on the wrong * track here, and I'm trying to get it back. */ const char* prj_get_relativetarget_for(int i) { return prj_get_target_for(i); #if OBSOLETE char backpath[8192]; const char* target; /* Get the path back to the main project so I have a common * point of reference between myself and this dependency */ strcpy(backpath, path_build(prj_get_pkgpath(), prj_get_path())); /* Append the path to the dependent project library */ if (strlen(backpath) > 0) strcat(backpath, "/"); strcat(backpath, prj_get_pkgpath_for(i)); /* Append the path from the dependent project to its output dir */ if (strlen(backpath) > 0) strcat(backpath, "/"); strcat(backpath, prj_get_target_for(i)); /* Now convert that to a relative path from here */ target = path_build("", backpath); if (target[0] == '/') ++target; return target; #endif } const char* prj_get_target_raw() { return my_cfg->target; } const char* prj_get_targetname_for(int i) { PkgConfig* cfg = prj_get_config_for(i); strcpy(buffer, path_getname(cfg->target)); return buffer; } /************************************************************************ * Return package URL ***********************************************************************/ const char* prj_get_url() { return my_pkg->url; } /************************************************************************ * Activate a project object. ***********************************************************************/ void prj_select_config(int i) { if (my_pkg == NULL) prj_select_package(0); my_cfg = my_pkg->configs[i]; } void prj_select_file(const char* name) { int i; for (i = 0; i < prj_getlistsize((void**)my_cfg->files); ++i) { if (matches(my_cfg->files[i], name)) my_fcfg = my_cfg->fileconfigs[i]; } } void prj_select_option(int i) { my_opt = project->options[i]; } void prj_select_package(int i) { my_pkg = project->packages[i]; } /************************************************************************ * List management routines ***********************************************************************/ void** prj_newlist(int len) { void** list = (void**)malloc(sizeof(void*) * (len + 1)); list[len] = NULL; return list; } void prj_freelist(void** list) { int i = 0; while (list[i] != NULL) free(list[i++]); free(list); } int prj_getlistsize(void** list) { int count = 0; void** ptr = list; while (*ptr != NULL) { ptr++; count++; } return count; } int prj_has_guid() { return (my_pkg->guid != NULL); } const char* prj_get_guid() { return my_pkg->guid; } int prj_has_libpath(const char* path) { const char** libpath; if (path == NULL || strlen(path) == 0) return 1; libpath = prj_get_libpaths(); while (*libpath) { if (matches(*libpath, path)) return 1; libpath++; } if (matches(prj_get_libdir(), path)) return 1; if (matches(prj_get_bindir(), path)) return 1; return 0; } int prj_has_importlibname() { return (my_cfg->implibname != NULL); } const char* prj_get_importlibname() { return my_cfg->implibname; } premake-3.7.orig/Src/vs2005.h0000644000000000000000000000152710446776604012516 0ustar /********************************************************************** * Premake - vs2005.h * The Visual Studio 2005 target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int vs2005_generate(); int vs2005_cs(); premake-3.7.orig/Src/sharpdev.c0000644000000000000000000000773310633323702013354 0ustar /********************************************************************** * Premake - sharpdev.c * The SharpDevelop and MonoDevelop targets * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "sharpdev.h" int sharpdev_target; int sharpdev_warncontent; static int writeCombine(); int sharpdev_generate(const char* targetName) { int i; sharpdev_target = matches(targetName, "monodev") ? MONODEV : SHARPDEV; sharpdev_warncontent = 0; printf("Generating %sDevelop combine and project files:\n", (sharpdev_target == SHARPDEV) ? "Sharp" : "Mono"); if (!writeCombine()) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c#")) { if (!sharpdev_cs()) return 0; } else if (prj_is_lang("c++") || prj_is_lang("c")) { printf("** Error: this generator does not support C/C++ development.\n"); return 0; } else { printf("** Error: unrecognized language '%s'\n", prj_get_language()); return 0; } } if (sharpdev_warncontent) { puts("\n** Warning: this project uses the 'Content' build action. This action is not"); puts(" supported by #develop; some manual configuration may be needed."); } return 1; } static int writeCombine() { const char* path; int i, j; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "cmbx"))) return 0; io_print("\n", prj_get_name()); /* TODO: select the first executable project */ io_print(" \n"); /* Write out the startup entries */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); io_print(" \n", prj_get_pkgname()); } io_print(" \n"); io_print(" \n"); /* Write out the project entries */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); path = prj_get_pkgfilename("prjx"); io_print(" \n", path); } io_print(" \n"); io_print(" \n"); /* Write out the entries for each build configuration */ for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print(" \n", xmlEscape(prj_get_cfgname())); /* List all packages under this configuration */ prj_select_config(0); for(j = 0; j < prj_get_numpackages(); j++) { prj_select_package(j); io_print(" \n", prj_get_pkgname(), xmlEscape(prj_get_cfgname())); } io_print(" \n"); } /* Finish */ io_print(" \n"); io_print(""); io_closefile(); /* MonoDevelop adds another file */ if (sharpdev_target == MONODEV) { if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "mdsx"))) return 0; prj_select_config(0); io_print("\n"); io_print(" %s\n", prj_get_bindir()); io_print("\n"); io_closefile(); } return 1; } premake-3.7.orig/Src/vs2002.c0000644000000000000000000001127310633323702012466 0ustar /********************************************************************** * Premake - vs2002.c * The Visual Studio 2002 and 2003 target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "premake.h" #include "vs.h" #include "vs2002.h" static int vs2002_write_solution(); int vs2002_generate(int target) { int i; vs_setversion(target == 2002 ? VS2002 : VS2003); printf("Generating Visual Studio %d solution and project files:\n", target); /* Assign GUIDs to packages */ vs_assign_guids(); /* Generate the project files */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c++") || prj_is_lang("c")) { if (!vs_write_cpp()) return 0; } else if (prj_is_lang("c#")) { if (!vs2002_cs()) return 0; } else { printf("** Warning: %s packages are not supported by this generator\n", prj_get_language()); } } return vs2002_write_solution(); } /************************************************************************ * Write out the solution file ***********************************************************************/ static int vs2002_write_solution() { VsPkgData* data; int i, j; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "sln"))) return 0; /* Format identification string */ io_print("Microsoft Visual Studio Solution File, Format Version "); if (vs_getversion() == VS2002) io_print("7.00\n"); else io_print("8.00\n"); /* List packages */ for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); data = (VsPkgData*)prj_get_data(); io_print("Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"\n", data->toolGuid, prj_get_pkgname(), prj_get_pkgfilename(data->projExt), data->projGuid); /* Write package dependencies for post-2002 */ if (vs_getversion() > VS2002) { prj_select_config(0); io_print("\tProjectSection(ProjectDependencies) = postProject\n"); print_list(prj_get_links(), "\t\t", "\n", "", vs_list_pkgdeps); io_print("\tEndProjectSection\n"); } io_print("EndProject\n"); } /* List configurations */ io_print("Global\n"); io_print("\tGlobalSection(SolutionConfiguration) = preSolution\n"); prj_select_package(0); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); if (vs_getversion() == VS2002) io_print("\t\tConfigName.%d = %s\n", i, xmlEscape(prj_get_cfgname())); else io_print("\t\t%s = %s\n", xmlEscape(prj_get_cfgname()), xmlEscape(prj_get_cfgname())); } io_print("\tEndGlobalSection\n"); /* Write package dependencies for 2002 */ if (vs_getversion() == VS2002) { io_print("\tGlobalSection(ProjectDependencies) = postSolution\n"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); prj_select_config(0); print_list(prj_get_links(), "\t\t", "\n", "", vs_list_pkgdeps); } io_print("\tEndGlobalSection\n"); } /* Write configuration for each package */ io_print("\tGlobalSection(ProjectConfiguration) = postSolution\n"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); for (j = 0; j < prj_get_numconfigs(); ++j) { prj_select_config(j); data = (VsPkgData*)prj_get_data(); /* I may actually be writing the wrong thing for VS2002-2003, but has * seemed to work for this long so I am going to leave it alone */ io_print("\t\t{%s}.%s.ActiveCfg = %s|%s\n", data->projGuid, xmlEscape(prj_get_cfgname()), xmlEscape(prj_get_cfgname()), data->projType); io_print("\t\t{%s}.%s.Build.0 = %s|%s\n", data->projGuid, xmlEscape(prj_get_cfgname()), xmlEscape(prj_get_cfgname()), data->projType); } } io_print("\tEndGlobalSection\n"); /* Finish */ io_print("\tGlobalSection(ExtensibilityGlobals) = postSolution\n"); io_print("\tEndGlobalSection\n"); io_print("\tGlobalSection(ExtensibilityAddIns) = postSolution\n"); io_print("\tEndGlobalSection\n"); io_print("EndGlobal\n"); io_closefile(); return 1; } premake-3.7.orig/Src/clean.c0000644000000000000000000001277311052312064012615 0ustar /********************************************************************** * Premake - clean.c * The cleanup target. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" static char buffer[8192]; int clean() { int i, j; puts("Removing all project and intermediate files..."); /* VS.NET 200x */ io_remove(path_join(prj_get_path(), prj_get_name(), "sln")); io_remove(path_join(prj_get_path(), prj_get_name(), "suo")); /* VS6 */ io_remove(path_join(prj_get_path(), prj_get_name(), "ncb")); io_remove(path_join(prj_get_path(), prj_get_name(), "dsw")); io_remove(path_join(prj_get_path(), prj_get_name(), "opt")); /* GNU */ io_remove(path_join(prj_get_path(), "Makefile", "")); /* SharpDevelop */ io_remove(path_join(prj_get_path(), prj_get_name(), "cmbx")); /* MonoDevelop */ io_remove(path_join(prj_get_path(), prj_get_name(), "mdsx")); io_remove(path_join(prj_get_path(), prj_get_name(), "mds")); io_remove(path_join(prj_get_path(), prj_get_name(), "userprefs")); io_remove(path_join(prj_get_path(), "make", "sh")); /* Code::Blocks - CodeLite */ io_remove(path_join(prj_get_path(), prj_get_name(), "workspace")); for (i = 0; i < prj_get_numpackages(); ++i) { char cwd[8192]; MaskHandle mask; prj_select_package(i); strcpy(cwd, io_getcwd()); io_chdir(prj_get_pkgpath()); for (j = 0; j < prj_get_numconfigs(); ++j) { prj_select_config(j); /* POSIX shared lib */ strcpy(buffer, prj_get_prefix() != NULL ? prj_get_prefix() : "lib"); strcat(buffer, path_getbasename(prj_get_target())); strcat(buffer, "."); strcat(buffer, prj_get_extension() != NULL ? prj_get_extension() : "so"); io_remove(path_join(prj_get_outdir(), buffer, "")); /* POSIX executable */ strcpy(buffer, prj_get_prefix() != NULL ? prj_get_prefix() : ""); strcat(buffer, path_getbasename(prj_get_target())); io_remove(path_join(prj_get_outdir(), buffer, "")); /* Windows executable */ io_remove(path_join(prj_get_outdir(), buffer, "exe")); /* .NET assembly manifest */ io_remove(path_join(prj_get_outdir(), buffer, "exe.manifest")); /* DLL or assembly */ io_remove(path_join(prj_get_outdir(), buffer, "dll")); /* Windows static library */ io_remove(path_join(prj_get_outdir(), buffer, "lib")); /* Visual Studio symbol file */ io_remove(path_join(prj_get_outdir(), buffer, "pdb")); /* Visual Studio incremental link file */ io_remove(path_join(prj_get_outdir(), buffer, "ilk")); /* Visual Studio VSHOST */ io_remove(path_join(prj_get_outdir(), buffer, "vshost.exe")); /* Windows DLL exports library */ io_remove(path_join(prj_get_libdir(), buffer, "lib")); io_remove(path_join(prj_get_libdir(), buffer, "exp")); /* Mono debugger symbols */ io_remove(path_join(prj_get_outdir(), buffer, "exe.mdb")); io_remove(path_join(prj_get_outdir(), buffer, "dll.mdb")); /* All */ io_rmdir(".", prj_get_objdir()); } /* VS.NET 2005 */ strcpy(g_buffer, path_join(".", prj_get_pkgname(), "vcproj.*.user")); mask = io_mask_open(g_buffer); while (io_mask_getnext(mask)) io_remove(io_mask_getname(mask)); io_mask_close(mask); strcpy(g_buffer, path_join(".", prj_get_pkgname(), "csproj.*.user")); mask = io_mask_open(g_buffer); while (io_mask_getnext(mask)) io_remove(io_mask_getname(mask)); io_mask_close(mask); /* VS.NET 200x */ io_remove(path_join(".", prj_get_pkgname(), "csproj")); io_remove(path_join(".", prj_get_pkgname(), "csproj.user")); io_remove(path_join(".", prj_get_pkgname(), "csproj.webinfo")); io_remove(path_join(".", prj_get_pkgname(), "vcproj")); /* VS6 */ io_remove(path_join(".", prj_get_pkgname(), "dsp")); io_remove(path_join(".", prj_get_pkgname(), "plg")); /* GNU */ io_remove(path_join(".", "Makefile", "")); io_remove(path_join(".", prj_get_pkgname(), "make")); /* SharpDevelop */ io_remove(path_join(".", prj_get_pkgname(), "prjx")); /* MonoDevelop */ io_remove(path_join(".", prj_get_pkgname(), "cmbx")); io_remove(path_join(".", prj_get_pkgname(), "mdp")); io_remove(path_join(".", "Makefile", prj_get_pkgname())); io_remove(path_join(".", prj_get_pkgname(), "pidb")); /* Code::Blocks */ io_remove(path_join(".", prj_get_pkgname(), "cbp")); io_remove(path_join(".", prj_get_pkgname(), "depend")); io_remove(path_join(".", prj_get_pkgname(), "layout")); /* CodeLite */ io_remove(path_join(".", prj_get_pkgname(), "project")); io_remove(path_join(".", prj_get_pkgname(), "mk")); io_remove(path_join(".", prj_get_pkgname(), "list")); io_remove(path_join(".", prj_get_pkgname(), "out")); io_remove(path_join(".", prj_get_pkgname(), "tags")); /* All */ if (prj_get_pkgobjdir() != NULL) io_rmdir(".", prj_get_pkgobjdir()); io_chdir(cwd); } return 1; } premake-3.7.orig/Src/codelite.h0000644000000000000000000000150311052312064013315 0ustar /********************************************************************** * Premake - codelite.h * The Code::Blocks target * * Copyright (c) 2002-2008 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int codelite_generate(); int codelite_cpp(); premake-3.7.orig/Src/sharpdev.h0000644000000000000000000000174710446776604013377 0ustar /********************************************************************** * Premake - sharpdev.h * The SharpDevelop and MonoDevelop targets * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int sharpdev_generate(const char* target); int sharpdev_cs(); #define SHARPDEV 0 #define MONODEV 1 extern int sharpdev_target; extern int sharpdev_warncontent; premake-3.7.orig/Src/codelite_cpp.c0000644000000000000000000002571011052312064014160 0ustar /********************************************************************** * Premake - codelite_cpp.c * The Code::Blocks C/C++ target * * Copyright (c) 2002-2008 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "codelite.h" #include "os.h" static const char* filterLinks(const char* name); static const char* filterLinksForPaths(const char* name); static void list_files(const char* path, int stage); static void print_opt(const char* opt); static const char* printProjectDependencies(const char* name); int codelite_cpp() { const char* kind; int i; /* Write the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "project"))) return 0; io_print("\n"); io_print("\n", prj_get_pkgname()); prj_select_config(0); print_source_tree("", list_files); if (prj_is_kind("winexe") || prj_is_kind("exe")) kind = "Executable"; else if (prj_is_kind("lib")) kind = "Static Library"; else if (prj_is_kind("dll")) kind = "Dynamic Library"; else { printf("** Unsupported project kind %s\n", prj_get_kind()); return 0; } io_print(" \n", kind); for (i = 0; i < prj_get_numconfigs(); ++i) { const char* compiler; const char* outfile; prj_select_config(i); /* Write the general setup */ compiler = prj_is_lang("c") ? "gcc" : "g++"; io_print(" \n", prj_get_cfgname(), compiler, kind ); outfile = prj_get_target(); io_print(" \n"); else io_print("PauseExecWhenProcTerminates=\"yes\"/>\n"); /* Write compiler flags */ io_print(" \n"); print_list(prj_get_incpaths(), " \n", "", NULL); print_list(prj_get_defines(), " \n", "", NULL); io_print(" \n"); /* Write linker flags */ io_print(" \n"); // Make a copy into a different buffer, // so that the same buffer is not used for the two function calls. strcpy(g_buffer, prj_get_bindir()); io_print(" \n", g_buffer); if (!matches(g_buffer, prj_get_libdir())) io_print(" \n", prj_get_libdir()); print_list(prj_get_libpaths(), " \n", "", NULL); print_list(prj_get_links(), " \n", "", filterLinksForPaths); print_list(prj_get_links(), " \n", "", filterLinks); /* Close the linker element */ io_print(" \n"); if (prj_find_filetype(".rc")) { io_print(" \n"); print_list(prj_get_respaths(), " \n", "", NULL); io_print(" \n"); } else io_print(" \n"); /* Pre/Post build setings */ if (prj_get_numprebuildcommands() > 0 || prj_get_numpostbuildcommands() > 0) { if (prj_get_numprebuildcommands() > 0) { io_print(" \n"); print_list(prj_get_prebuildcommands(), " ", "\n", "", NULL); io_print(" \n"); } else io_print(" \n"); if (prj_get_numpostbuildcommands() > 0) { io_print(" \n"); print_list(prj_get_postbuildcommands(), " ", "\n", "", NULL); io_print(" \n"); } else io_print(" \n"); } /* Configuration stuff that isn't supported */ io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" None\n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); } /* End of the project settings */ io_print(" \n"); /* Write project dependencies */ for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print(" \n", prj_get_cfgname()); print_list(prj_get_links(), " \n", "", printProjectDependencies); io_print(" \n"); } /* End of the project file */ io_print("\n"); io_closefile(); return 1; } static void print_opt(const char* opt) { io_print("%s;", opt); } /************************************************************************ * List callback: scans the list of links for a package. If a link is * found to a sibling package, prints a dependency string for the * workspace file. ***********************************************************************/ static const char* printProjectDependencies(const char* name) { int i; for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(prj_get_pkgname_for(i), name)) { io_print(" \n", name); } } return NULL; } /************************************************************************ * Callback for print_source_tree() ***********************************************************************/ static void list_files(const char* path, int stage) { static int indent = 1; //const char* pchSource = prj_has_pch() ? prj_get_pch_source() : NULL; const char* ptr = path; while (strncmp(ptr, "../", 3) == 0) ptr += 3; ptr = strchr(ptr, '/'); while (ptr != NULL) ptr = strchr(ptr + 1, '/'); ptr = strrchr(path, '/'); ptr = (ptr == NULL) ? (char*)path : ptr + 1; switch (stage) { case WST_OPENGROUP: if (strlen(path) > 0 && !matches(ptr, "..")) { io_print("%*s\n", indent * 2, " ", ptr); indent++; } break; case WST_CLOSEGROUP: if (strlen(path) > 0 && !matches(ptr, "..")) { indent--; io_print("%*s\n", indent * 2, " " ); } break; case WST_SOURCEFILE: io_print("%*s\n",indent * 2, " ", path); break; } } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* filterLinks(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* lang = prj_get_language_for(i); if (matches(lang, "c++") || matches(lang, "c")) { const char* target = prj_get_targetname_for(i); return path_getname(target); } else { return NULL; } } else { return name; } } static const char* filterLinksForPaths(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* lang = prj_get_language_for(i); if (matches(lang, "c++") || matches(lang, "c")) { const char* target = prj_get_target_for(i); const char* dir = path_getdir(target); if (!prj_has_libpath(dir)) { return dir; } } } return NULL; } premake-3.7.orig/Src/open_watcom/0000755000000000000000000000000011065434621013700 5ustar premake-3.7.orig/Src/open_watcom/readme.txt0000644000000000000000000000165311043432517015701 0ustar Open Watcom support added July 2008 Tim Channon, tc@gpsl.net Targets Code:Blocks Open Watcom 1.7a Instructions on enabling debugging are on the Open Watcom wiki. Essentially changing the OW configuration of C::B slightly and calling the OW Windows or text windowed debugger. Switch the toolchain from mingwin32-gcc to OW or back is as trivial as premake --target cb-gcc premake --target cb-ow The OW C++ compiler is being upgraded, with 1.8 already up to 2008 standards in some areas, others are in progress. A toolchain difference which might be noticed is a build speed difference. OW can target other platforms. is used for embedded DOS work as well. There are interesting possibilities with Linux, OW can generate Linux executables, so it would be interesting to know what C::B under Linux and OW could do if anything. Whether premake will ever target OW wmake is undecided. Cross platform makes can be extremely complex.premake-3.7.orig/Src/open_watcom/ow.c0000644000000000000000000002660411062460411014472 0ustar /********************************************************************** * Premake - watcom.c * The Open Watcom Code::Blocks target, version 1.7a, 1.8a (Open Watcom) * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * OW version 2008 T N Channon strongly based upon existing Premake code * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "../premake.h" #include "ow.h" static const char* filterLinks(const char* name); static const char* filterLinksForPaths(const char* name); static const char* listFiles(const char* name); static void print_opt(const char* opt); static int ow_cpp(void) { int i; /* Write the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "cbp"))) return 0; io_print("\n"); io_print("\n"); io_print("\t\n"); io_print("\t\n"); io_print("\t\t\n"); io_print("\n"); io_closefile(); return 1; } static void print_opt(const char* opt) { io_print("\t\t\t\t\t\n", opt); } /************************************************************************ * Output a description block for each source file ***********************************************************************/ static const char* listFiles(const char* filename) { int i; io_print("\t\t\n", filename); if (matches(path_getextension(filename), ".rc")) { io_print("\t\t\t\n"); return NULL; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* filterLinks(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* kind = prj_get_kind_for(i); const char* lang = prj_get_language_for(i); if ((matches(lang, "c++") || matches(lang, "c")) && (matches(kind, "dll") || matches(kind, "lib"))) { const char* target = prj_get_targetname_for(i); return path_getname(target); } else { return NULL; } } else { return name; } } static const char* filterLinksForPaths(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* lang = prj_get_language_for(i); if (matches(lang, "c++") || matches(lang, "c")) { const char* target = prj_get_target_for(i); const char* dir = path_getdir(target); if (!prj_has_libpath(dir)) { return dir; } } } return NULL; } //============== /************************************************************************ * List callback: scans the list of links for a package. If a link is * found to a sibling package, prints a dependency string for the * workspace file. ***********************************************************************/ static const char* printProjectDependencies(const char* name) { int i; for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(prj_get_pkgname_for(i), name)) { const char* filename = prj_get_pkgfilename_for(i, "cbp"); if (startsWith(filename, "./")) filename += 2; io_print("\t\t\t\n", filename); } } return NULL; } /******************************/ static int writeWorkspace(void) { int i; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "workspace"))) return 0; io_print("\n"); io_print("\n"); io_print("\t\n", prj_get_name()); for (i = 0; i < prj_get_numpackages(); ++i) { const char* filename; prj_select_package(i); filename = prj_get_pkgfilename("cbp"); if (startsWith(filename, "./")) filename += 2; io_print("\t\t\n"); /* Write project dependencies */ prj_select_config(0); print_list(prj_get_links(), "", "", "", printProjectDependencies); io_print("\t\t\n"); } io_print("\t\n"); io_print("\n"); io_closefile(); return 1; } int ow_cb_generate(void) { int i; puts("Generating Code::Blocks workspace and project files:"); if (!writeWorkspace()) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c++") || prj_is_lang("c")) { if (!ow_cpp()) return 0; } else { printf("** Error: unsupported language '%s'\n", prj_get_language()); return 0; } } return 1; } premake-3.7.orig/Src/open_watcom/ow.h0000644000000000000000000000155111043432517014476 0ustar /********************************************************************** * Premake - ow.h * The Open Watcom Code::Blocks target (aka OW) * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * Portions Copyright (c) 2008 T N Channon * * 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 in the file LICENSE.txt for details. **********************************************************************/ int ow_cb_generate(void); premake-3.7.orig/Src/gnu_helpers.c0000644000000000000000000000264711043442605014052 0ustar /********************************************************************** * Premake - gnu_helpers.c * The GNU makefile target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include "premake.h" #include static char buffer[8192]; int gnu_pkgOwnsPath() { int i; if (path_compare(prj_get_pkgpath(), prj_get_path())) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { if (prj_get_package() != prj_get_package_for(i)) { if (path_compare(prj_get_pkgpath(), prj_get_pkgpath_for(i))) return 0; } } return 1; } const char* gnu_escapePath(const char* path) { const char* ch = path; int i = 0; while (*ch) { if (*ch == ' ') { buffer[i++] = '\\'; } buffer[i++] = *ch; ch++; } buffer[i] = '\0'; return buffer; } premake-3.7.orig/Src/codelite.c0000644000000000000000000000471011052312064013313 0ustar /********************************************************************** * Premake - codelite.c * The Code::Blocks target * * Copyright (c) 2002-2008 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "codelite.h" static int writeWorkspace(); int codelite_generate() { int i; puts("Generating CodeLite workspace and project files:"); if (!writeWorkspace()) return 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c++") || prj_is_lang("c")) { if (!codelite_cpp()) return 0; } else { printf("** Error: unsupported language '%s'\n", prj_get_language()); return 0; } } return 1; } static int writeWorkspace() { int i, j; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "workspace"))) return 0; io_print("\n"); io_print("\n", prj_get_name(), prj_get_name()); for (i = 0; i < prj_get_numpackages(); ++i) { const char* filename; prj_select_package(i); filename = prj_get_pkgfilename("project"); if (startsWith(filename, "./")) filename += 2; io_print(" \n", prj_get_pkgname(), filename, (0 == i) ? "Yes" : "No" ); } io_print(" \n"); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print(" \n", prj_get_cfgname()); for (j = 0; j < prj_get_numpackages(); ++j) { prj_select_package(j); io_print(" \n", prj_get_pkgname(), prj_get_cfgname() ); } io_print(" \n"); } io_print(" \n"); io_print("\n"); io_closefile(); return 1; } premake-3.7.orig/Src/Lua/0000755000000000000000000000000011065434621012106 5ustar premake-3.7.orig/Src/Lua/ltm.c0000644000000000000000000000316211043456337013054 0ustar /* ** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** Tag methods ** See Copyright Notice in lua.h */ #include #define ltm_c #define LUA_CORE #include "lua.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" const char *const luaT_typenames[] = { "nil", "boolean", "userdata", "number", "string", "table", "function", "userdata", "thread", "proto", "upval" }; void luaT_init (lua_State *L) { static const char *const luaT_eventname[] = { /* ORDER TM */ "__index", "__newindex", "__gc", "__mode", "__eq", "__add", "__sub", "__mul", "__div", "__mod", "__pow", "__unm", "__len", "__lt", "__le", "__concat", "__call" }; int i; for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); luaS_fix(G(L)->tmname[i]); /* never collect these names */ } } /* ** function to be used with macro "fasttm": optimized for absence of ** tag methods */ const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { const TValue *tm = luaH_getstr(events, ename); lua_assert(event <= TM_EQ); if (ttisnil(tm)) { /* no tag method? */ events->flags |= cast_byte(1u<metatable; break; case LUA_TUSERDATA: mt = uvalue(o)->metatable; break; default: mt = G(L)->mt[ttype(o)]; } return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); } premake-3.7.orig/Src/Lua/llex.c0000644000000000000000000003027211043456337013226 0ustar /* ** $Id: llex.c,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ #include #include #include #define llex_c #define LUA_CORE #include "lua.h" #include "ldo.h" #include "llex.h" #include "lobject.h" #include "lparser.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "lzio.h" #define next(ls) (ls->current = zgetc(ls->z)) #define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') /* ORDER RESERVED */ const char *const luaX_tokens [] = { "and", "break", "do", "else", "elseif", "end", "false", "for", "function", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while", "..", "...", "==", ">=", "<=", "~=", "", "", "", "", NULL }; #define save_and_next(ls) (save(ls, ls->current), next(ls)) static void save (LexState *ls, int c) { Mbuffer *b = ls->buff; if (b->n + 1 > b->buffsize) { size_t newsize; if (b->buffsize >= MAX_SIZET/2) luaX_lexerror(ls, "lexical element too long", 0); newsize = b->buffsize * 2; luaZ_resizebuffer(ls->L, b, newsize); } b->buffer[b->n++] = cast(char, c); } void luaX_init (lua_State *L) { int i; for (i=0; itsv.reserved = cast_byte(i+1); /* reserved word */ } } #define MAXSRC 80 const char *luaX_token2str (LexState *ls, int token) { if (token < FIRST_RESERVED) { lua_assert(token == cast(unsigned char, token)); return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) : luaO_pushfstring(ls->L, "%c", token); } else return luaX_tokens[token-FIRST_RESERVED]; } static const char *txtToken (LexState *ls, int token) { switch (token) { case TK_NAME: case TK_STRING: case TK_NUMBER: save(ls, '\0'); return luaZ_buffer(ls->buff); default: return luaX_token2str(ls, token); } } void luaX_lexerror (LexState *ls, const char *msg, int token) { char buff[MAXSRC]; luaO_chunkid(buff, getstr(ls->source), MAXSRC); msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); if (token) luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token)); luaD_throw(ls->L, LUA_ERRSYNTAX); } void luaX_syntaxerror (LexState *ls, const char *msg) { luaX_lexerror(ls, msg, ls->t.token); } TString *luaX_newstring (LexState *ls, const char *str, size_t l) { lua_State *L = ls->L; TString *ts = luaS_newlstr(L, str, l); TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ if (ttisnil(o)) setbvalue(o, 1); /* make sure `str' will not be collected */ return ts; } static void inclinenumber (LexState *ls) { int old = ls->current; lua_assert(currIsNewline(ls)); next(ls); /* skip `\n' or `\r' */ if (currIsNewline(ls) && ls->current != old) next(ls); /* skip `\n\r' or `\r\n' */ if (++ls->linenumber >= MAX_INT) luaX_syntaxerror(ls, "chunk has too many lines"); } void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { ls->decpoint = '.'; ls->L = L; ls->lookahead.token = TK_EOS; /* no look-ahead token */ ls->z = z; ls->fs = NULL; ls->linenumber = 1; ls->lastline = 1; ls->source = source; luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ next(ls); /* read first char */ } /* ** ======================================================= ** LEXICAL ANALYZER ** ======================================================= */ static int check_next (LexState *ls, const char *set) { if (!strchr(set, ls->current)) return 0; save_and_next(ls); return 1; } static void buffreplace (LexState *ls, char from, char to) { size_t n = luaZ_bufflen(ls->buff); char *p = luaZ_buffer(ls->buff); while (n--) if (p[n] == from) p[n] = to; } static void trydecpoint (LexState *ls, SemInfo *seminfo) { /* format error: try to update decimal point separator */ struct lconv *cv = localeconv(); char old = ls->decpoint; ls->decpoint = (cv ? cv->decimal_point[0] : '.'); buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { /* format error with correct decimal point: no more options */ buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ luaX_lexerror(ls, "malformed number", TK_NUMBER); } } /* LUA_NUMBER */ static void read_numeral (LexState *ls, SemInfo *seminfo) { lua_assert(isdigit(ls->current)); do { save_and_next(ls); } while (isdigit(ls->current) || ls->current == '.'); if (check_next(ls, "Ee")) /* `E'? */ check_next(ls, "+-"); /* optional exponent sign */ while (isalnum(ls->current) || ls->current == '_') save_and_next(ls); save(ls, '\0'); buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) /* format error? */ trydecpoint(ls, seminfo); /* try to update decimal point separator */ } static int skip_sep (LexState *ls) { int count = 0; int s = ls->current; lua_assert(s == '[' || s == ']'); save_and_next(ls); while (ls->current == '=') { save_and_next(ls); count++; } return (ls->current == s) ? count : (-count) - 1; } static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { int cont = 0; (void)(cont); /* avoid warnings when `cont' is not used */ save_and_next(ls); /* skip 2nd `[' */ if (currIsNewline(ls)) /* string starts with a newline? */ inclinenumber(ls); /* skip it */ for (;;) { switch (ls->current) { case EOZ: luaX_lexerror(ls, (seminfo) ? "unfinished long string" : "unfinished long comment", TK_EOS); break; /* to avoid warnings */ #if defined(LUA_COMPAT_LSTR) case '[': { if (skip_sep(ls) == sep) { save_and_next(ls); /* skip 2nd `[' */ cont++; #if LUA_COMPAT_LSTR == 1 if (sep == 0) luaX_lexerror(ls, "nesting of [[...]] is deprecated", '['); #endif } break; } #endif case ']': { if (skip_sep(ls) == sep) { save_and_next(ls); /* skip 2nd `]' */ #if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2 cont--; if (sep == 0 && cont >= 0) break; #endif goto endloop; } break; } case '\n': case '\r': { save(ls, '\n'); inclinenumber(ls); if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ break; } default: { if (seminfo) save_and_next(ls); else next(ls); } } } endloop: if (seminfo) seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), luaZ_bufflen(ls->buff) - 2*(2 + sep)); } static void read_string (LexState *ls, int del, SemInfo *seminfo) { save_and_next(ls); while (ls->current != del) { switch (ls->current) { case EOZ: luaX_lexerror(ls, "unfinished string", TK_EOS); continue; /* to avoid warnings */ case '\n': case '\r': luaX_lexerror(ls, "unfinished string", TK_STRING); continue; /* to avoid warnings */ case '\\': { int c; next(ls); /* do not save the `\' */ switch (ls->current) { case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case '\n': /* go through */ case '\r': save(ls, '\n'); inclinenumber(ls); continue; case EOZ: continue; /* will raise an error next loop */ default: { if (!isdigit(ls->current)) save_and_next(ls); /* handles \\, \", \', and \? */ else { /* \xxx */ int i = 0; c = 0; do { c = 10*c + (ls->current-'0'); next(ls); } while (++i<3 && isdigit(ls->current)); if (c > UCHAR_MAX) luaX_lexerror(ls, "escape sequence too large", TK_STRING); save(ls, c); } continue; } } save(ls, c); next(ls); continue; } default: save_and_next(ls); } } save_and_next(ls); /* skip delimiter */ seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, luaZ_bufflen(ls->buff) - 2); } static int llex (LexState *ls, SemInfo *seminfo) { luaZ_resetbuffer(ls->buff); for (;;) { switch (ls->current) { case '\n': case '\r': { inclinenumber(ls); continue; } case '-': { next(ls); if (ls->current != '-') return '-'; /* else is a comment */ next(ls); if (ls->current == '[') { int sep = skip_sep(ls); luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */ if (sep >= 0) { read_long_string(ls, NULL, sep); /* long comment */ luaZ_resetbuffer(ls->buff); continue; } } /* else short comment */ while (!currIsNewline(ls) && ls->current != EOZ) next(ls); continue; } case '[': { int sep = skip_sep(ls); if (sep >= 0) { read_long_string(ls, seminfo, sep); return TK_STRING; } else if (sep == -1) return '['; else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); } case '=': { next(ls); if (ls->current != '=') return '='; else { next(ls); return TK_EQ; } } case '<': { next(ls); if (ls->current != '=') return '<'; else { next(ls); return TK_LE; } } case '>': { next(ls); if (ls->current != '=') return '>'; else { next(ls); return TK_GE; } } case '~': { next(ls); if (ls->current != '=') return '~'; else { next(ls); return TK_NE; } } case '"': case '\'': { read_string(ls, ls->current, seminfo); return TK_STRING; } case '.': { save_and_next(ls); if (check_next(ls, ".")) { if (check_next(ls, ".")) return TK_DOTS; /* ... */ else return TK_CONCAT; /* .. */ } else if (!isdigit(ls->current)) return '.'; else { read_numeral(ls, seminfo); return TK_NUMBER; } } case EOZ: { return TK_EOS; } default: { if (isspace(ls->current)) { lua_assert(!currIsNewline(ls)); next(ls); continue; } else if (isdigit(ls->current)) { read_numeral(ls, seminfo); return TK_NUMBER; } else if (isalpha(ls->current) || ls->current == '_') { /* identifier or reserved word */ TString *ts; do { save_and_next(ls); } while (isalnum(ls->current) || ls->current == '_'); ts = luaX_newstring(ls, luaZ_buffer(ls->buff), luaZ_bufflen(ls->buff)); if (ts->tsv.reserved > 0) /* reserved word? */ return ts->tsv.reserved - 1 + FIRST_RESERVED; else { seminfo->ts = ts; return TK_NAME; } } else { int c = ls->current; next(ls); return c; /* single-char tokens (+ - / ...) */ } } } } } void luaX_next (LexState *ls) { ls->lastline = ls->linenumber; if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ ls->t = ls->lookahead; /* use this one */ ls->lookahead.token = TK_EOS; /* and discharge it */ } else ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ } void luaX_lookahead (LexState *ls) { lua_assert(ls->lookahead.token == TK_EOS); ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); } premake-3.7.orig/Src/Lua/ldump.c0000644000000000000000000000605211043456337013402 0ustar /* ** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** save precompiled Lua chunks ** See Copyright Notice in lua.h */ #include #define ldump_c #define LUA_CORE #include "lua.h" #include "lobject.h" #include "lstate.h" #include "lundump.h" typedef struct { lua_State* L; lua_Writer writer; void* data; int strip; int status; } DumpState; #define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) #define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) static void DumpBlock(const void* b, size_t size, DumpState* D) { if (D->status==0) { lua_unlock(D->L); D->status=(*D->writer)(D->L,b,size,D->data); lua_lock(D->L); } } static void DumpChar(int y, DumpState* D) { char x=(char)y; DumpVar(x,D); } static void DumpInt(int x, DumpState* D) { DumpVar(x,D); } static void DumpNumber(lua_Number x, DumpState* D) { DumpVar(x,D); } static void DumpVector(const void* b, int n, size_t size, DumpState* D) { DumpInt(n,D); DumpMem(b,n,size,D); } static void DumpString(const TString* s, DumpState* D) { if (s==NULL || getstr(s)==NULL) { size_t size=0; DumpVar(size,D); } else { size_t size=s->tsv.len+1; /* include trailing '\0' */ DumpVar(size,D); DumpBlock(getstr(s),size,D); } } #define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) static void DumpFunction(const Proto* f, const TString* p, DumpState* D); static void DumpConstants(const Proto* f, DumpState* D) { int i,n=f->sizek; DumpInt(n,D); for (i=0; ik[i]; DumpChar(ttype(o),D); switch (ttype(o)) { case LUA_TNIL: break; case LUA_TBOOLEAN: DumpChar(bvalue(o),D); break; case LUA_TNUMBER: DumpNumber(nvalue(o),D); break; case LUA_TSTRING: DumpString(rawtsvalue(o),D); break; default: lua_assert(0); /* cannot happen */ break; } } n=f->sizep; DumpInt(n,D); for (i=0; ip[i],f->source,D); } static void DumpDebug(const Proto* f, DumpState* D) { int i,n; n= (D->strip) ? 0 : f->sizelineinfo; DumpVector(f->lineinfo,n,sizeof(int),D); n= (D->strip) ? 0 : f->sizelocvars; DumpInt(n,D); for (i=0; ilocvars[i].varname,D); DumpInt(f->locvars[i].startpc,D); DumpInt(f->locvars[i].endpc,D); } n= (D->strip) ? 0 : f->sizeupvalues; DumpInt(n,D); for (i=0; iupvalues[i],D); } static void DumpFunction(const Proto* f, const TString* p, DumpState* D) { DumpString((f->source==p || D->strip) ? NULL : f->source,D); DumpInt(f->linedefined,D); DumpInt(f->lastlinedefined,D); DumpChar(f->nups,D); DumpChar(f->numparams,D); DumpChar(f->is_vararg,D); DumpChar(f->maxstacksize,D); DumpCode(f,D); DumpConstants(f,D); DumpDebug(f,D); } static void DumpHeader(DumpState* D) { char h[LUAC_HEADERSIZE]; luaU_header(h); DumpBlock(h,LUAC_HEADERSIZE,D); } /* ** dump Lua function as precompiled chunk */ int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) { DumpState D; D.L=L; D.writer=w; D.data=data; D.strip=strip; D.status=0; DumpHeader(&D); DumpFunction(f,NULL,&D); return D.status; } premake-3.7.orig/Src/Lua/lauxlib.h0000644000000000000000000001322111043456337013722 0ustar /* ** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ #ifndef lauxlib_h #define lauxlib_h #include #include #include "lua.h" #if defined(LUA_COMPAT_GETN) LUALIB_API int (luaL_getn) (lua_State *L, int t); LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); #else #define luaL_getn(L,i) ((int)lua_objlen(L, i)) #define luaL_setn(L,i,j) ((void)0) /* no op! */ #endif #if defined(LUA_COMPAT_OPENLIB) #define luaI_openlib luaL_openlib #endif /* extra error code for `luaL_load' */ #define LUA_ERRFILE (LUA_ERRERR+1) typedef struct luaL_Reg { const char *name; lua_CFunction func; } luaL_Reg; LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, const luaL_Reg *l, int nup); LUALIB_API void (luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l); LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, size_t *l); LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, const char *def, size_t *l); LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, lua_Integer def); LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); LUALIB_API void (luaL_checkany) (lua_State *L, int narg); LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); LUALIB_API void (luaL_where) (lua_State *L, int lvl); LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, const char *const lst[]); LUALIB_API int (luaL_ref) (lua_State *L, int t); LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, const char *name); LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); LUALIB_API lua_State *(luaL_newstate) (void); LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, const char *r); LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, const char *fname, int szhint); /* ** =============================================================== ** some useful macros ** =============================================================== */ #define luaL_argcheck(L, cond,numarg,extramsg) \ ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) #define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) #define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) #define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) #define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) #define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) #define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) #define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) #define luaL_dofile(L, fn) \ (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) #define luaL_dostring(L, s) \ (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) #define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) #define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) /* ** {====================================================== ** Generic Buffer manipulation ** ======================================================= */ typedef struct luaL_Buffer { char *p; /* current position in buffer */ int lvl; /* number of strings in the stack (level) */ lua_State *L; char buffer[LUAL_BUFFERSIZE]; } luaL_Buffer; #define luaL_addchar(B,c) \ ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ (*(B)->p++ = (char)(c))) /* compatibility only */ #define luaL_putchar(B,c) luaL_addchar(B,c) #define luaL_addsize(B,n) ((B)->p += (n)) LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); /* }====================================================== */ /* compatibility with ref system */ /* pre-defined references */ #define LUA_NOREF (-2) #define LUA_REFNIL (-1) #define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) #define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) #define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) #define luaL_reg luaL_Reg #endif premake-3.7.orig/Src/Lua/ltable.c0000644000000000000000000003760711043456337013536 0ustar /* ** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ /* ** Implementation of tables (aka arrays, objects, or hash tables). ** Tables keep its elements in two parts: an array part and a hash part. ** Non-negative integer keys are all candidates to be kept in the array ** part. The actual size of the array is the largest `n' such that at ** least half the slots between 0 and n are in use. ** Hash uses a mix of chained scatter table with Brent's variation. ** A main invariant of these tables is that, if an element is not ** in its main position (i.e. the `original' position that its hash gives ** to it), then the colliding element is in its own main position. ** Hence even when the load factor reaches 100%, performance remains good. */ #include #include #define ltable_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "ltable.h" /* ** max size of array part is 2^MAXBITS */ #if LUAI_BITSINT > 26 #define MAXBITS 26 #else #define MAXBITS (LUAI_BITSINT-2) #endif #define MAXASIZE (1 << MAXBITS) #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) #define hashstr(t,str) hashpow2(t, (str)->tsv.hash) #define hashboolean(t,p) hashpow2(t, p) /* ** for some types, it is better to avoid modulus by power of 2, as ** they tend to have many 2 factors. */ #define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) #define hashpointer(t,p) hashmod(t, IntPoint(p)) /* ** number of ints inside a lua_Number */ #define numints cast_int(sizeof(lua_Number)/sizeof(int)) #define dummynode (&dummynode_) static const Node dummynode_ = { {{NULL}, LUA_TNIL}, /* value */ {{{NULL}, LUA_TNIL, NULL}} /* key */ }; /* ** hash for lua_Numbers */ static Node *hashnum (const Table *t, lua_Number n) { unsigned int a[numints]; int i; if (luai_numeq(n, 0)) /* avoid problems with -0 */ return gnode(t, 0); memcpy(a, &n, sizeof(a)); for (i = 1; i < numints; i++) a[0] += a[i]; return hashmod(t, a[0]); } /* ** returns the `main' position of an element in a table (that is, the index ** of its hash value) */ static Node *mainposition (const Table *t, const TValue *key) { switch (ttype(key)) { case LUA_TNUMBER: return hashnum(t, nvalue(key)); case LUA_TSTRING: return hashstr(t, rawtsvalue(key)); case LUA_TBOOLEAN: return hashboolean(t, bvalue(key)); case LUA_TLIGHTUSERDATA: return hashpointer(t, pvalue(key)); default: return hashpointer(t, gcvalue(key)); } } /* ** returns the index for `key' if `key' is an appropriate key to live in ** the array part of the table, -1 otherwise. */ static int arrayindex (const TValue *key) { if (ttisnumber(key)) { lua_Number n = nvalue(key); int k; lua_number2int(k, n); if (luai_numeq(cast_num(k), n)) return k; } return -1; /* `key' did not match some condition */ } /* ** returns the index of a `key' for table traversals. First goes all ** elements in the array part, then elements in the hash part. The ** beginning of a traversal is signalled by -1. */ static int findindex (lua_State *L, Table *t, StkId key) { int i; if (ttisnil(key)) return -1; /* first iteration */ i = arrayindex(key); if (0 < i && i <= t->sizearray) /* is `key' inside array part? */ return i-1; /* yes; that's the index (corrected to C) */ else { Node *n = mainposition(t, key); do { /* check whether `key' is somewhere in the chain */ /* key may be dead already, but it is ok to use it in `next' */ if (luaO_rawequalObj(key2tval(n), key) || (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) && gcvalue(gkey(n)) == gcvalue(key))) { i = cast_int(n - gnode(t, 0)); /* key index in hash table */ /* hash elements are numbered after array ones */ return i + t->sizearray; } else n = gnext(n); } while (n); luaG_runerror(L, "invalid key to " LUA_QL("next")); /* key not found */ return 0; /* to avoid warnings */ } } int luaH_next (lua_State *L, Table *t, StkId key) { int i = findindex(L, t, key); /* find original element */ for (i++; i < t->sizearray; i++) { /* try first array part */ if (!ttisnil(&t->array[i])) { /* a non-nil value? */ setnvalue(key, cast_num(i+1)); setobj2s(L, key+1, &t->array[i]); return 1; } } for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ setobj2s(L, key, key2tval(gnode(t, i))); setobj2s(L, key+1, gval(gnode(t, i))); return 1; } } return 0; /* no more elements */ } /* ** {============================================================= ** Rehash ** ============================================================== */ static int computesizes (int nums[], int *narray) { int i; int twotoi; /* 2^i */ int a = 0; /* number of elements smaller than 2^i */ int na = 0; /* number of elements to go to array part */ int n = 0; /* optimal size for array part */ for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) { if (nums[i] > 0) { a += nums[i]; if (a > twotoi/2) { /* more than half elements present? */ n = twotoi; /* optimal size (till now) */ na = a; /* all elements smaller than n will go to array part */ } } if (a == *narray) break; /* all elements already counted */ } *narray = n; lua_assert(*narray/2 <= na && na <= *narray); return na; } static int countint (const TValue *key, int *nums) { int k = arrayindex(key); if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */ nums[ceillog2(k)]++; /* count as such */ return 1; } else return 0; } static int numusearray (const Table *t, int *nums) { int lg; int ttlg; /* 2^lg */ int ause = 0; /* summation of `nums' */ int i = 1; /* count to traverse all array keys */ for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) { /* for each slice */ int lc = 0; /* counter */ int lim = ttlg; if (lim > t->sizearray) { lim = t->sizearray; /* adjust upper limit */ if (i > lim) break; /* no more elements to count */ } /* count elements in range (2^(lg-1), 2^lg] */ for (; i <= lim; i++) { if (!ttisnil(&t->array[i-1])) lc++; } nums[lg] += lc; ause += lc; } return ause; } static int numusehash (const Table *t, int *nums, int *pnasize) { int totaluse = 0; /* total number of elements */ int ause = 0; /* summation of `nums' */ int i = sizenode(t); while (i--) { Node *n = &t->node[i]; if (!ttisnil(gval(n))) { ause += countint(key2tval(n), nums); totaluse++; } } *pnasize += ause; return totaluse; } static void setarrayvector (lua_State *L, Table *t, int size) { int i; luaM_reallocvector(L, t->array, t->sizearray, size, TValue); for (i=t->sizearray; iarray[i]); t->sizearray = size; } static void setnodevector (lua_State *L, Table *t, int size) { int lsize; if (size == 0) { /* no elements to hash part? */ t->node = cast(Node *, dummynode); /* use common `dummynode' */ lsize = 0; } else { int i; lsize = ceillog2(size); if (lsize > MAXBITS) luaG_runerror(L, "table overflow"); size = twoto(lsize); t->node = luaM_newvector(L, size, Node); for (i=0; ilsizenode = cast_byte(lsize); t->lastfree = gnode(t, size); /* all positions are free */ } static void resize (lua_State *L, Table *t, int nasize, int nhsize) { int i; int oldasize = t->sizearray; int oldhsize = t->lsizenode; Node *nold = t->node; /* save old hash ... */ if (nasize > oldasize) /* array part must grow? */ setarrayvector(L, t, nasize); /* create new hash part with appropriate size */ setnodevector(L, t, nhsize); if (nasize < oldasize) { /* array part must shrink? */ t->sizearray = nasize; /* re-insert elements from vanishing slice */ for (i=nasize; iarray[i])) setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]); } /* shrink array */ luaM_reallocvector(L, t->array, oldasize, nasize, TValue); } /* re-insert elements from hash part */ for (i = twoto(oldhsize) - 1; i >= 0; i--) { Node *old = nold+i; if (!ttisnil(gval(old))) setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old)); } if (nold != dummynode) luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ } void luaH_resizearray (lua_State *L, Table *t, int nasize) { int nsize = (t->node == dummynode) ? 0 : sizenode(t); resize(L, t, nasize, nsize); } static void rehash (lua_State *L, Table *t, const TValue *ek) { int nasize, na; int nums[MAXBITS+1]; /* nums[i] = number of keys between 2^(i-1) and 2^i */ int i; int totaluse; for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */ nasize = numusearray(t, nums); /* count keys in array part */ totaluse = nasize; /* all those keys are integer keys */ totaluse += numusehash(t, nums, &nasize); /* count keys in hash part */ /* count extra key */ nasize += countint(ek, nums); totaluse++; /* compute new size for array part */ na = computesizes(nums, &nasize); /* resize the table to new computed sizes */ resize(L, t, nasize, totaluse - na); } /* ** }============================================================= */ Table *luaH_new (lua_State *L, int narray, int nhash) { Table *t = luaM_new(L, Table); luaC_link(L, obj2gco(t), LUA_TTABLE); t->metatable = NULL; t->flags = cast_byte(~0); /* temporary values (kept only if some malloc fails) */ t->array = NULL; t->sizearray = 0; t->lsizenode = 0; t->node = cast(Node *, dummynode); setarrayvector(L, t, narray); setnodevector(L, t, nhash); return t; } void luaH_free (lua_State *L, Table *t) { if (t->node != dummynode) luaM_freearray(L, t->node, sizenode(t), Node); luaM_freearray(L, t->array, t->sizearray, TValue); luaM_free(L, t); } static Node *getfreepos (Table *t) { while (t->lastfree-- > t->node) { if (ttisnil(gkey(t->lastfree))) return t->lastfree; } return NULL; /* could not find a free place */ } /* ** inserts a new key into a hash table; first, check whether key's main ** position is free. If not, check whether colliding node is in its main ** position or not: if it is not, move colliding node to an empty place and ** put new key in its main position; otherwise (colliding node is in its main ** position), new key goes to an empty position. */ static TValue *newkey (lua_State *L, Table *t, const TValue *key) { Node *mp = mainposition(t, key); if (!ttisnil(gval(mp)) || mp == dummynode) { Node *othern; Node *n = getfreepos(t); /* get a free place */ if (n == NULL) { /* cannot find a free place? */ rehash(L, t, key); /* grow table */ return luaH_set(L, t, key); /* re-insert key into grown table */ } lua_assert(n != dummynode); othern = mainposition(t, key2tval(mp)); if (othern != mp) { /* is colliding node out of its main position? */ /* yes; move colliding node into free position */ while (gnext(othern) != mp) othern = gnext(othern); /* find previous */ gnext(othern) = n; /* redo the chain with `n' in place of `mp' */ *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ gnext(mp) = NULL; /* now `mp' is free */ setnilvalue(gval(mp)); } else { /* colliding node is in its own main position */ /* new node will go into free position */ gnext(n) = gnext(mp); /* chain new position */ gnext(mp) = n; mp = n; } } gkey(mp)->value = key->value; gkey(mp)->tt = key->tt; luaC_barriert(L, t, key); lua_assert(ttisnil(gval(mp))); return gval(mp); } /* ** search function for integers */ const TValue *luaH_getnum (Table *t, int key) { /* (1 <= key && key <= t->sizearray) */ if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray)) return &t->array[key-1]; else { lua_Number nk = cast_num(key); Node *n = hashnum(t, nk); do { /* check whether `key' is somewhere in the chain */ if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk)) return gval(n); /* that's it */ else n = gnext(n); } while (n); return luaO_nilobject; } } /* ** search function for strings */ const TValue *luaH_getstr (Table *t, TString *key) { Node *n = hashstr(t, key); do { /* check whether `key' is somewhere in the chain */ if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key) return gval(n); /* that's it */ else n = gnext(n); } while (n); return luaO_nilobject; } /* ** main search function */ const TValue *luaH_get (Table *t, const TValue *key) { switch (ttype(key)) { case LUA_TNIL: return luaO_nilobject; case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key)); case LUA_TNUMBER: { int k; lua_Number n = nvalue(key); lua_number2int(k, n); if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */ return luaH_getnum(t, k); /* use specialized version */ /* else go through */ } default: { Node *n = mainposition(t, key); do { /* check whether `key' is somewhere in the chain */ if (luaO_rawequalObj(key2tval(n), key)) return gval(n); /* that's it */ else n = gnext(n); } while (n); return luaO_nilobject; } } } TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { const TValue *p = luaH_get(t, key); t->flags = 0; if (p != luaO_nilobject) return cast(TValue *, p); else { if (ttisnil(key)) luaG_runerror(L, "table index is nil"); else if (ttisnumber(key) && luai_numisnan(nvalue(key))) luaG_runerror(L, "table index is NaN"); return newkey(L, t, key); } } TValue *luaH_setnum (lua_State *L, Table *t, int key) { const TValue *p = luaH_getnum(t, key); if (p != luaO_nilobject) return cast(TValue *, p); else { TValue k; setnvalue(&k, cast_num(key)); return newkey(L, t, &k); } } TValue *luaH_setstr (lua_State *L, Table *t, TString *key) { const TValue *p = luaH_getstr(t, key); if (p != luaO_nilobject) return cast(TValue *, p); else { TValue k; setsvalue(L, &k, key); return newkey(L, t, &k); } } static int unbound_search (Table *t, unsigned int j) { unsigned int i = j; /* i is zero or a present index */ j++; /* find `i' and `j' such that i is present and j is not */ while (!ttisnil(luaH_getnum(t, j))) { i = j; j *= 2; if (j > cast(unsigned int, MAX_INT)) { /* overflow? */ /* table was built with bad purposes: resort to linear search */ i = 1; while (!ttisnil(luaH_getnum(t, i))) i++; return i - 1; } } /* now do a binary search between them */ while (j - i > 1) { unsigned int m = (i+j)/2; if (ttisnil(luaH_getnum(t, m))) j = m; else i = m; } return i; } /* ** Try to find a boundary in table `t'. A `boundary' is an integer index ** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). */ int luaH_getn (Table *t) { unsigned int j = t->sizearray; if (j > 0 && ttisnil(&t->array[j - 1])) { /* there is a boundary in the array part: (binary) search for it */ unsigned int i = 0; while (j - i > 1) { unsigned int m = (i+j)/2; if (ttisnil(&t->array[m - 1])) j = m; else i = m; } return i; } /* else must find a boundary in hash part */ else if (t->node == dummynode) /* hash part is empty? */ return j; /* that is easy... */ else return unbound_search(t, j); } #if defined(LUA_DEBUG) Node *luaH_mainposition (const Table *t, const TValue *key) { return mainposition(t, key); } int luaH_isdummy (Node *n) { return n == dummynode; } #endif premake-3.7.orig/Src/Lua/ldo.c0000644000000000000000000003500311043456337013035 0ustar /* ** $Id: ldo.c,v 2.38.1.3 2008/01/18 22:31:22 roberto Exp $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ #include #include #include #define ldo_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lundump.h" #include "lvm.h" #include "lzio.h" /* ** {====================================================== ** Error-recovery functions ** ======================================================= */ /* chain list of long jump buffers */ struct lua_longjmp { struct lua_longjmp *previous; luai_jmpbuf b; volatile int status; /* error code */ }; void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { switch (errcode) { case LUA_ERRMEM: { setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG)); break; } case LUA_ERRERR: { setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); break; } case LUA_ERRSYNTAX: case LUA_ERRRUN: { setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ break; } } L->top = oldtop + 1; } static void restore_stack_limit (lua_State *L) { lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */ int inuse = cast_int(L->ci - L->base_ci); if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */ luaD_reallocCI(L, LUAI_MAXCALLS); } } static void resetstack (lua_State *L, int status) { L->ci = L->base_ci; L->base = L->ci->base; luaF_close(L, L->base); /* close eventual pending closures */ luaD_seterrorobj(L, status, L->base); L->nCcalls = L->baseCcalls; L->allowhook = 1; restore_stack_limit(L); L->errfunc = 0; L->errorJmp = NULL; } void luaD_throw (lua_State *L, int errcode) { if (L->errorJmp) { L->errorJmp->status = errcode; LUAI_THROW(L, L->errorJmp); } else { L->status = cast_byte(errcode); if (G(L)->panic) { resetstack(L, errcode); lua_unlock(L); G(L)->panic(L); } exit(EXIT_FAILURE); } } int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { struct lua_longjmp lj; lj.status = 0; lj.previous = L->errorJmp; /* chain new error handler */ L->errorJmp = &lj; LUAI_TRY(L, &lj, (*f)(L, ud); ); L->errorJmp = lj.previous; /* restore old error handler */ return lj.status; } /* }====================================================== */ static void correctstack (lua_State *L, TValue *oldstack) { CallInfo *ci; GCObject *up; L->top = (L->top - oldstack) + L->stack; for (up = L->openupval; up != NULL; up = up->gch.next) gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack; for (ci = L->base_ci; ci <= L->ci; ci++) { ci->top = (ci->top - oldstack) + L->stack; ci->base = (ci->base - oldstack) + L->stack; ci->func = (ci->func - oldstack) + L->stack; } L->base = (L->base - oldstack) + L->stack; } void luaD_reallocstack (lua_State *L, int newsize) { TValue *oldstack = L->stack; int realsize = newsize + 1 + EXTRA_STACK; lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue); L->stacksize = realsize; L->stack_last = L->stack+newsize; correctstack(L, oldstack); } void luaD_reallocCI (lua_State *L, int newsize) { CallInfo *oldci = L->base_ci; luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo); L->size_ci = newsize; L->ci = (L->ci - oldci) + L->base_ci; L->end_ci = L->base_ci + L->size_ci - 1; } void luaD_growstack (lua_State *L, int n) { if (n <= L->stacksize) /* double size is enough? */ luaD_reallocstack(L, 2*L->stacksize); else luaD_reallocstack(L, L->stacksize + n); } static CallInfo *growCI (lua_State *L) { if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */ luaD_throw(L, LUA_ERRERR); else { luaD_reallocCI(L, 2*L->size_ci); if (L->size_ci > LUAI_MAXCALLS) luaG_runerror(L, "stack overflow"); } return ++L->ci; } void luaD_callhook (lua_State *L, int event, int line) { lua_Hook hook = L->hook; if (hook && L->allowhook) { ptrdiff_t top = savestack(L, L->top); ptrdiff_t ci_top = savestack(L, L->ci->top); lua_Debug ar; ar.event = event; ar.currentline = line; if (event == LUA_HOOKTAILRET) ar.i_ci = 0; /* tail call; no debug information about it */ else ar.i_ci = cast_int(L->ci - L->base_ci); luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ L->ci->top = L->top + LUA_MINSTACK; lua_assert(L->ci->top <= L->stack_last); L->allowhook = 0; /* cannot call hooks inside a hook */ lua_unlock(L); (*hook)(L, &ar); lua_lock(L); lua_assert(!L->allowhook); L->allowhook = 1; L->ci->top = restorestack(L, ci_top); L->top = restorestack(L, top); } } static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { int i; int nfixargs = p->numparams; Table *htab = NULL; StkId base, fixed; for (; actual < nfixargs; ++actual) setnilvalue(L->top++); #if defined(LUA_COMPAT_VARARG) if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */ int nvar = actual - nfixargs; /* number of extra arguments */ lua_assert(p->is_vararg & VARARG_HASARG); luaC_checkGC(L); htab = luaH_new(L, nvar, 1); /* create `arg' table */ for (i=0; itop - nvar + i); /* store counter in field `n' */ setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); } #endif /* move fixed parameters to final position */ fixed = L->top - actual; /* first fixed argument */ base = L->top; /* final position of first argument */ for (i=0; itop++, fixed+i); setnilvalue(fixed+i); } /* add `arg' parameter */ if (htab) { sethvalue(L, L->top++, htab); lua_assert(iswhite(obj2gco(htab))); } return base; } static StkId tryfuncTM (lua_State *L, StkId func) { const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL); StkId p; ptrdiff_t funcr = savestack(L, func); if (!ttisfunction(tm)) luaG_typeerror(L, func, "call"); /* Open a hole inside the stack at `func' */ for (p = L->top; p > func; p--) setobjs2s(L, p, p-1); incr_top(L); func = restorestack(L, funcr); /* previous call may change stack */ setobj2s(L, func, tm); /* tag method is the new function to be called */ return func; } #define inc_ci(L) \ ((L->ci == L->end_ci) ? growCI(L) : \ (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci)) int luaD_precall (lua_State *L, StkId func, int nresults) { LClosure *cl; ptrdiff_t funcr; if (!ttisfunction(func)) /* `func' is not a function? */ func = tryfuncTM(L, func); /* check the `function' tag method */ funcr = savestack(L, func); cl = &clvalue(func)->l; L->ci->savedpc = L->savedpc; if (!cl->isC) { /* Lua function? prepare its call */ CallInfo *ci; StkId st, base; Proto *p = cl->p; luaD_checkstack(L, p->maxstacksize); func = restorestack(L, funcr); if (!p->is_vararg) { /* no varargs? */ base = func + 1; if (L->top > base + p->numparams) L->top = base + p->numparams; } else { /* vararg function */ int nargs = cast_int(L->top - func) - 1; base = adjust_varargs(L, p, nargs); func = restorestack(L, funcr); /* previous call may change the stack */ } ci = inc_ci(L); /* now `enter' new function */ ci->func = func; L->base = ci->base = base; ci->top = L->base + p->maxstacksize; lua_assert(ci->top <= L->stack_last); L->savedpc = p->code; /* starting point */ ci->tailcalls = 0; ci->nresults = nresults; for (st = L->top; st < ci->top; st++) setnilvalue(st); L->top = ci->top; if (L->hookmask & LUA_MASKCALL) { L->savedpc++; /* hooks assume 'pc' is already incremented */ luaD_callhook(L, LUA_HOOKCALL, -1); L->savedpc--; /* correct 'pc' */ } return PCRLUA; } else { /* if is a C function, call it */ CallInfo *ci; int n; luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ ci = inc_ci(L); /* now `enter' new function */ ci->func = restorestack(L, funcr); L->base = ci->base = ci->func + 1; ci->top = L->top + LUA_MINSTACK; lua_assert(ci->top <= L->stack_last); ci->nresults = nresults; if (L->hookmask & LUA_MASKCALL) luaD_callhook(L, LUA_HOOKCALL, -1); lua_unlock(L); n = (*curr_func(L)->c.f)(L); /* do the actual call */ lua_lock(L); if (n < 0) /* yielding? */ return PCRYIELD; else { luaD_poscall(L, L->top - n); return PCRC; } } } static StkId callrethooks (lua_State *L, StkId firstResult) { ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ luaD_callhook(L, LUA_HOOKRET, -1); if (f_isLua(L->ci)) { /* Lua function? */ while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */ luaD_callhook(L, LUA_HOOKTAILRET, -1); } return restorestack(L, fr); } int luaD_poscall (lua_State *L, StkId firstResult) { StkId res; int wanted, i; CallInfo *ci; if (L->hookmask & LUA_MASKRET) firstResult = callrethooks(L, firstResult); ci = L->ci--; res = ci->func; /* res == final position of 1st result */ wanted = ci->nresults; L->base = (ci - 1)->base; /* restore base */ L->savedpc = (ci - 1)->savedpc; /* restore savedpc */ /* move results to correct place */ for (i = wanted; i != 0 && firstResult < L->top; i--) setobjs2s(L, res++, firstResult++); while (i-- > 0) setnilvalue(res++); L->top = res; return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */ } /* ** Call a function (C or Lua). The function to be called is at *func. ** The arguments are on the stack, right after the function. ** When returns, all the results are on the stack, starting at the original ** function position. */ void luaD_call (lua_State *L, StkId func, int nResults) { if (++L->nCcalls >= LUAI_MAXCCALLS) { if (L->nCcalls == LUAI_MAXCCALLS) luaG_runerror(L, "C stack overflow"); else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ } if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */ luaV_execute(L, 1); /* call it */ L->nCcalls--; luaC_checkGC(L); } static void resume (lua_State *L, void *ud) { StkId firstArg = cast(StkId, ud); CallInfo *ci = L->ci; if (L->status == 0) { /* start coroutine? */ lua_assert(ci == L->base_ci && firstArg > L->base); if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA) return; } else { /* resuming from previous yield */ lua_assert(L->status == LUA_YIELD); L->status = 0; if (!f_isLua(ci)) { /* `common' yield? */ /* finish interrupted execution of `OP_CALL' */ lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL || GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL); if (luaD_poscall(L, firstArg)) /* complete it... */ L->top = L->ci->top; /* and correct top if not multiple results */ } else /* yielded inside a hook: just continue its execution */ L->base = L->ci->base; } luaV_execute(L, cast_int(L->ci - L->base_ci)); } static int resume_error (lua_State *L, const char *msg) { L->top = L->ci->base; setsvalue2s(L, L->top, luaS_new(L, msg)); incr_top(L); lua_unlock(L); return LUA_ERRRUN; } LUA_API int lua_resume (lua_State *L, int nargs) { int status; lua_lock(L); if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci)) return resume_error(L, "cannot resume non-suspended coroutine"); if (L->nCcalls >= LUAI_MAXCCALLS) return resume_error(L, "C stack overflow"); luai_userstateresume(L, nargs); lua_assert(L->errfunc == 0); L->baseCcalls = ++L->nCcalls; status = luaD_rawrunprotected(L, resume, L->top - nargs); if (status != 0) { /* error? */ L->status = cast_byte(status); /* mark thread as `dead' */ luaD_seterrorobj(L, status, L->top); L->ci->top = L->top; } else { lua_assert(L->nCcalls == L->baseCcalls); status = L->status; } --L->nCcalls; lua_unlock(L); return status; } LUA_API int lua_yield (lua_State *L, int nresults) { luai_userstateyield(L, nresults); lua_lock(L); if (L->nCcalls > L->baseCcalls) luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); L->base = L->top - nresults; /* protect stack slots below */ L->status = LUA_YIELD; lua_unlock(L); return -1; } int luaD_pcall (lua_State *L, Pfunc func, void *u, ptrdiff_t old_top, ptrdiff_t ef) { int status; unsigned short oldnCcalls = L->nCcalls; ptrdiff_t old_ci = saveci(L, L->ci); lu_byte old_allowhooks = L->allowhook; ptrdiff_t old_errfunc = L->errfunc; L->errfunc = ef; status = luaD_rawrunprotected(L, func, u); if (status != 0) { /* an error occurred? */ StkId oldtop = restorestack(L, old_top); luaF_close(L, oldtop); /* close eventual pending closures */ luaD_seterrorobj(L, status, oldtop); L->nCcalls = oldnCcalls; L->ci = restoreci(L, old_ci); L->base = L->ci->base; L->savedpc = L->ci->savedpc; L->allowhook = old_allowhooks; restore_stack_limit(L); } L->errfunc = old_errfunc; return status; } /* ** Execute a protected parser. */ struct SParser { /* data to `f_parser' */ ZIO *z; Mbuffer buff; /* buffer to be used by the scanner */ const char *name; }; static void f_parser (lua_State *L, void *ud) { int i; Proto *tf; Closure *cl; struct SParser *p = cast(struct SParser *, ud); int c = luaZ_lookahead(p->z); luaC_checkGC(L); tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, &p->buff, p->name); cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); cl->l.p = tf; for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */ cl->l.upvals[i] = luaF_newupval(L); setclvalue(L, L->top, cl); incr_top(L); } int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) { struct SParser p; int status; p.z = z; p.name = name; luaZ_initbuffer(L, &p.buff); status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); luaZ_freebuffer(L, &p.buff); return status; } premake-3.7.orig/Src/Lua/lmathlib.c0000644000000000000000000001330711043456337014056 0ustar /* ** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $ ** Standard mathematical library ** See Copyright Notice in lua.h */ #include #include #define lmathlib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" #undef PI #define PI (3.14159265358979323846) #define RADIANS_PER_DEGREE (PI/180.0) static int math_abs (lua_State *L) { lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); return 1; } static int math_sin (lua_State *L) { lua_pushnumber(L, sin(luaL_checknumber(L, 1))); return 1; } static int math_sinh (lua_State *L) { lua_pushnumber(L, sinh(luaL_checknumber(L, 1))); return 1; } static int math_cos (lua_State *L) { lua_pushnumber(L, cos(luaL_checknumber(L, 1))); return 1; } static int math_cosh (lua_State *L) { lua_pushnumber(L, cosh(luaL_checknumber(L, 1))); return 1; } static int math_tan (lua_State *L) { lua_pushnumber(L, tan(luaL_checknumber(L, 1))); return 1; } static int math_tanh (lua_State *L) { lua_pushnumber(L, tanh(luaL_checknumber(L, 1))); return 1; } static int math_asin (lua_State *L) { lua_pushnumber(L, asin(luaL_checknumber(L, 1))); return 1; } static int math_acos (lua_State *L) { lua_pushnumber(L, acos(luaL_checknumber(L, 1))); return 1; } static int math_atan (lua_State *L) { lua_pushnumber(L, atan(luaL_checknumber(L, 1))); return 1; } static int math_atan2 (lua_State *L) { lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); return 1; } static int math_ceil (lua_State *L) { lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); return 1; } static int math_floor (lua_State *L) { lua_pushnumber(L, floor(luaL_checknumber(L, 1))); return 1; } static int math_fmod (lua_State *L) { lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); return 1; } static int math_modf (lua_State *L) { double ip; double fp = modf(luaL_checknumber(L, 1), &ip); lua_pushnumber(L, ip); lua_pushnumber(L, fp); return 2; } static int math_sqrt (lua_State *L) { lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); return 1; } static int math_pow (lua_State *L) { lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); return 1; } static int math_log (lua_State *L) { lua_pushnumber(L, log(luaL_checknumber(L, 1))); return 1; } static int math_log10 (lua_State *L) { lua_pushnumber(L, log10(luaL_checknumber(L, 1))); return 1; } static int math_exp (lua_State *L) { lua_pushnumber(L, exp(luaL_checknumber(L, 1))); return 1; } static int math_deg (lua_State *L) { lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE); return 1; } static int math_rad (lua_State *L) { lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE); return 1; } static int math_frexp (lua_State *L) { int e; lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); lua_pushinteger(L, e); return 2; } static int math_ldexp (lua_State *L) { lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); return 1; } static int math_min (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ lua_Number dmin = luaL_checknumber(L, 1); int i; for (i=2; i<=n; i++) { lua_Number d = luaL_checknumber(L, i); if (d < dmin) dmin = d; } lua_pushnumber(L, dmin); return 1; } static int math_max (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ lua_Number dmax = luaL_checknumber(L, 1); int i; for (i=2; i<=n; i++) { lua_Number d = luaL_checknumber(L, i); if (d > dmax) dmax = d; } lua_pushnumber(L, dmax); return 1; } static int math_random (lua_State *L) { /* the `%' avoids the (rare) case of r==1, and is needed also because on some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */ lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX; switch (lua_gettop(L)) { /* check number of arguments */ case 0: { /* no arguments */ lua_pushnumber(L, r); /* Number between 0 and 1 */ break; } case 1: { /* only upper limit */ int u = luaL_checkint(L, 1); luaL_argcheck(L, 1<=u, 1, "interval is empty"); lua_pushnumber(L, floor(r*u)+1); /* int between 1 and `u' */ break; } case 2: { /* lower and upper limits */ int l = luaL_checkint(L, 1); int u = luaL_checkint(L, 2); luaL_argcheck(L, l<=u, 2, "interval is empty"); lua_pushnumber(L, floor(r*(u-l+1))+l); /* int between `l' and `u' */ break; } default: return luaL_error(L, "wrong number of arguments"); } return 1; } static int math_randomseed (lua_State *L) { srand(luaL_checkint(L, 1)); return 0; } static const luaL_Reg mathlib[] = { {"abs", math_abs}, {"acos", math_acos}, {"asin", math_asin}, {"atan2", math_atan2}, {"atan", math_atan}, {"ceil", math_ceil}, {"cosh", math_cosh}, {"cos", math_cos}, {"deg", math_deg}, {"exp", math_exp}, {"floor", math_floor}, {"fmod", math_fmod}, {"frexp", math_frexp}, {"ldexp", math_ldexp}, {"log10", math_log10}, {"log", math_log}, {"max", math_max}, {"min", math_min}, {"modf", math_modf}, {"pow", math_pow}, {"rad", math_rad}, {"random", math_random}, {"randomseed", math_randomseed}, {"sinh", math_sinh}, {"sin", math_sin}, {"sqrt", math_sqrt}, {"tanh", math_tanh}, {"tan", math_tan}, {NULL, NULL} }; /* ** Open math library */ LUALIB_API int luaopen_math (lua_State *L) { luaL_register(L, LUA_MATHLIBNAME, mathlib); lua_pushnumber(L, PI); lua_setfield(L, -2, "pi"); lua_pushnumber(L, HUGE_VAL); lua_setfield(L, -2, "huge"); #if defined(LUA_COMPAT_MOD) lua_getfield(L, -1, "fmod"); lua_setfield(L, -2, "mod"); #endif return 1; } premake-3.7.orig/Src/Lua/ldebug.h0000644000000000000000000000204511043456337013526 0ustar /* ** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions from Debug Interface module ** See Copyright Notice in lua.h */ #ifndef ldebug_h #define ldebug_h #include "lstate.h" #define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1) #define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0) #define resethookcount(L) (L->hookcount = L->basehookcount) LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o, const char *opname); LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2); LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2); LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2); LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...); LUAI_FUNC void luaG_errormsg (lua_State *L); LUAI_FUNC int luaG_checkcode (const Proto *pt); LUAI_FUNC int luaG_checkopenop (Instruction i); #endif premake-3.7.orig/Src/Lua/lparser.h0000644000000000000000000000432511043456337013737 0ustar /* ** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua Parser ** See Copyright Notice in lua.h */ #ifndef lparser_h #define lparser_h #include "llimits.h" #include "lobject.h" #include "lzio.h" /* ** Expression descriptor */ typedef enum { VVOID, /* no value */ VNIL, VTRUE, VFALSE, VK, /* info = index of constant in `k' */ VKNUM, /* nval = numerical value */ VLOCAL, /* info = local register */ VUPVAL, /* info = index of upvalue in `upvalues' */ VGLOBAL, /* info = index of table; aux = index of global name in `k' */ VINDEXED, /* info = table register; aux = index register (or `k') */ VJMP, /* info = instruction pc */ VRELOCABLE, /* info = instruction pc */ VNONRELOC, /* info = result register */ VCALL, /* info = instruction pc */ VVARARG /* info = instruction pc */ } expkind; typedef struct expdesc { expkind k; union { struct { int info, aux; } s; lua_Number nval; } u; int t; /* patch list of `exit when true' */ int f; /* patch list of `exit when false' */ } expdesc; typedef struct upvaldesc { lu_byte k; lu_byte info; } upvaldesc; struct BlockCnt; /* defined in lparser.c */ /* state needed to generate code for a given function */ typedef struct FuncState { Proto *f; /* current function header */ Table *h; /* table to find (and reuse) elements in `k' */ struct FuncState *prev; /* enclosing function */ struct LexState *ls; /* lexical state */ struct lua_State *L; /* copy of the Lua state */ struct BlockCnt *bl; /* chain of current blocks */ int pc; /* next position to code (equivalent to `ncode') */ int lasttarget; /* `pc' of last `jump target' */ int jpc; /* list of pending jumps to `pc' */ int freereg; /* first free register */ int nk; /* number of elements in `k' */ int np; /* number of elements in `p' */ short nlocvars; /* number of elements in `locvars' */ lu_byte nactvar; /* number of active local variables */ upvaldesc upvalues[LUAI_MAXUPVALUES]; /* upvalues */ unsigned short actvar[LUAI_MAXVARS]; /* declared-variable stack */ } FuncState; LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name); #endif premake-3.7.orig/Src/Lua/llimits.h0000644000000000000000000000445511043456337013750 0ustar /* ** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $ ** Limits, basic types, and some other `installation-dependent' definitions ** See Copyright Notice in lua.h */ #ifndef llimits_h #define llimits_h #include #include #include "lua.h" typedef LUAI_UINT32 lu_int32; typedef LUAI_UMEM lu_mem; typedef LUAI_MEM l_mem; /* chars used as small naturals (so that `char' is reserved for characters) */ typedef unsigned char lu_byte; #define MAX_SIZET ((size_t)(~(size_t)0)-2) #define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2) #define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ /* ** conversion of pointer to integer ** this is for hashing only; there is no problem if the integer ** cannot hold the whole pointer value */ #define IntPoint(p) ((unsigned int)(lu_mem)(p)) /* type to ensure maximum alignment */ typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; /* result of a `usual argument conversion' over lua_Number */ typedef LUAI_UACNUMBER l_uacNumber; /* internal assertions for in-house debugging */ #ifdef lua_assert #define check_exp(c,e) (lua_assert(c), (e)) #define api_check(l,e) lua_assert(e) #else #define lua_assert(c) ((void)0) #define check_exp(c,e) (e) #define api_check luai_apicheck #endif #ifndef UNUSED #define UNUSED(x) ((void)(x)) /* to avoid warnings */ #endif #ifndef cast #define cast(t, exp) ((t)(exp)) #endif #define cast_byte(i) cast(lu_byte, (i)) #define cast_num(i) cast(lua_Number, (i)) #define cast_int(i) cast(int, (i)) /* ** type for virtual-machine instructions ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) */ typedef lu_int32 Instruction; /* maximum stack for a Lua function */ #define MAXSTACK 250 /* minimum size for the string table (must be power of 2) */ #ifndef MINSTRTABSIZE #define MINSTRTABSIZE 32 #endif /* minimum size for string buffer */ #ifndef LUA_MINBUFFER #define LUA_MINBUFFER 32 #endif #ifndef lua_lock #define lua_lock(L) ((void) 0) #define lua_unlock(L) ((void) 0) #endif #ifndef luai_threadyield #define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} #endif /* ** macro to control inclusion of some hard tests on stack reallocation */ #ifndef HARDSTACKTESTS #define condhardstacktests(x) ((void)0) #else #define condhardstacktests(x) x #endif #endif premake-3.7.orig/Src/Lua/lopcodes.c0000644000000000000000000000550411043456337014072 0ustar /* ** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ ** See Copyright Notice in lua.h */ #define lopcodes_c #define LUA_CORE #include "lopcodes.h" /* ORDER OP */ const char *const luaP_opnames[NUM_OPCODES+1] = { "MOVE", "LOADK", "LOADBOOL", "LOADNIL", "GETUPVAL", "GETGLOBAL", "GETTABLE", "SETGLOBAL", "SETUPVAL", "SETTABLE", "NEWTABLE", "SELF", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "UNM", "NOT", "LEN", "CONCAT", "JMP", "EQ", "LT", "LE", "TEST", "TESTSET", "CALL", "TAILCALL", "RETURN", "FORLOOP", "FORPREP", "TFORLOOP", "SETLIST", "CLOSE", "CLOSURE", "VARARG", NULL }; #define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m)) const lu_byte luaP_opmodes[NUM_OPCODES] = { /* T A B C mode opcode */ opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LOADNIL */ ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_GETGLOBAL */ ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */ ,opmode(0, 0, OpArgK, OpArgN, iABx) /* OP_SETGLOBAL */ ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABLE */ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */ ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */ ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_JMP */ ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_EQ */ ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LT */ ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LE */ ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TEST */ ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */ ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */ ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */ ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORLOOP */ ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */ ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TFORLOOP */ ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */ ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */ }; premake-3.7.orig/Src/Lua/lzio.c0000644000000000000000000000313411043456337013234 0ustar /* ** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ ** a generic input stream interface ** See Copyright Notice in lua.h */ #include #define lzio_c #define LUA_CORE #include "lua.h" #include "llimits.h" #include "lmem.h" #include "lstate.h" #include "lzio.h" int luaZ_fill (ZIO *z) { size_t size; lua_State *L = z->L; const char *buff; lua_unlock(L); buff = z->reader(L, z->data, &size); lua_lock(L); if (buff == NULL || size == 0) return EOZ; z->n = size - 1; z->p = buff; return char2int(*(z->p++)); } int luaZ_lookahead (ZIO *z) { if (z->n == 0) { if (luaZ_fill(z) == EOZ) return EOZ; else { z->n++; /* luaZ_fill removed first byte; put back it */ z->p--; } } return char2int(*z->p); } void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { z->L = L; z->reader = reader; z->data = data; z->n = 0; z->p = NULL; } /* --------------------------------------------------------------- read --- */ size_t luaZ_read (ZIO *z, void *b, size_t n) { while (n) { size_t m; if (luaZ_lookahead(z) == EOZ) return n; /* return number of missing bytes */ m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ memcpy(b, z->p, m); z->n -= m; z->p += m; b = (char *)b + m; n -= m; } return 0; } /* ------------------------------------------------------------------------ */ char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { if (n > buff->buffsize) { if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; luaZ_resizebuffer(L, buff, n); } return buff->buffer; } premake-3.7.orig/Src/Lua/linit.c0000644000000000000000000000137511044065373013400 0ustar /* ** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $ ** Initialization of libraries for lua.c ** See Copyright Notice in lua.h */ #define linit_c #define LUA_LIB #include "lua.h" #include "lualib.h" #include "lauxlib.h" static const luaL_Reg lualibs[] = { {"", luaopen_base}, {LUA_LOADLIBNAME, luaopen_package}, {LUA_TABLIBNAME, luaopen_table}, {LUA_IOLIBNAME, luaopen_io}, {LUA_OSLIBNAME, luaopen_os}, {LUA_STRLIBNAME, luaopen_string}, {LUA_MATHLIBNAME, luaopen_math}, {LUA_DBLIBNAME, luaopen_debug}, {NULL, NULL} }; LUALIB_API void luaL_openlibs (lua_State *L) { const luaL_Reg *lib = lualibs; for (; lib->func; lib++) { lua_pushcfunction(L, lib->func); lua_pushstring(L, lib->name); lua_call(L, 1, 0); } } premake-3.7.orig/Src/Lua/lmem.c0000644000000000000000000000417411043456337013216 0ustar /* ** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */ #include #define lmem_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" /* ** About the realloc function: ** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); ** (`osize' is the old size, `nsize' is the new size) ** ** Lua ensures that (ptr == NULL) iff (osize == 0). ** ** * frealloc(ud, NULL, 0, x) creates a new block of size `x' ** ** * frealloc(ud, p, x, 0) frees the block `p' ** (in this specific case, frealloc must return NULL). ** particularly, frealloc(ud, NULL, 0, 0) does nothing ** (which is equivalent to free(NULL) in ANSI C) ** ** frealloc returns NULL if it cannot create or reallocate the area ** (any reallocation to an equal or smaller size cannot fail!) */ #define MINSIZEARRAY 4 void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, int limit, const char *errormsg) { void *newblock; int newsize; if (*size >= limit/2) { /* cannot double it? */ if (*size >= limit) /* cannot grow even a little? */ luaG_runerror(L, errormsg); newsize = limit; /* still have at least one free place */ } else { newsize = (*size)*2; if (newsize < MINSIZEARRAY) newsize = MINSIZEARRAY; /* minimum size */ } newblock = luaM_reallocv(L, block, *size, newsize, size_elems); *size = newsize; /* update only when everything else is OK */ return newblock; } void *luaM_toobig (lua_State *L) { luaG_runerror(L, "memory allocation error: block too big"); return NULL; /* to avoid warnings */ } /* ** generic allocation routine. */ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { global_State *g = G(L); lua_assert((osize == 0) == (block == NULL)); block = (*g->frealloc)(g->ud, block, osize, nsize); if (block == NULL && nsize > 0) luaD_throw(L, LUA_ERRMEM); lua_assert((nsize == 0) == (block == NULL)); g->totalbytes = (g->totalbytes - osize) + nsize; return block; } premake-3.7.orig/Src/Lua/luaconf.h0000644000000000000000000005353411043456337013724 0ustar /* ** $Id: luaconf.h,v 1.82.1.6 2008/01/18 17:07:48 roberto Exp $ ** Configuration file for Lua ** See Copyright Notice in lua.h */ #ifndef lconfig_h #define lconfig_h #include #include /* ** ================================================================== ** Search for "@@" to find all configurable definitions. ** =================================================================== */ /* @@ LUA_ANSI controls the use of non-ansi features. ** CHANGE it (define it) if you want Lua to avoid the use of any ** non-ansi feature or library. */ #if defined(__STRICT_ANSI__) #define LUA_ANSI #endif #if !defined(LUA_ANSI) && defined(_WIN32) #define LUA_WIN #endif #if defined(LUA_USE_LINUX) #define LUA_USE_POSIX #define LUA_USE_DLOPEN /* needs an extra library: -ldl */ #define LUA_USE_READLINE /* needs some extra libraries */ #endif #if defined(LUA_USE_MACOSX) #define LUA_USE_POSIX #define LUA_DL_DYLD /* does not need extra library */ #endif /* @@ LUA_USE_POSIX includes all functionallity listed as X/Open System @* Interfaces Extension (XSI). ** CHANGE it (define it) if your system is XSI compatible. */ #if defined(LUA_USE_POSIX) #define LUA_USE_MKSTEMP #define LUA_USE_ISATTY #define LUA_USE_POPEN #define LUA_USE_ULONGJMP #endif /* @@ LUA_PATH and LUA_CPATH are the names of the environment variables that @* Lua check to set its paths. @@ LUA_INIT is the name of the environment variable that Lua @* checks for initialization code. ** CHANGE them if you want different names. */ #define LUA_PATH "LUA_PATH" #define LUA_CPATH "LUA_CPATH" #define LUA_INIT "LUA_INIT" /* @@ LUA_PATH_DEFAULT is the default path that Lua uses to look for @* Lua libraries. @@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for @* C libraries. ** CHANGE them if your machine has a non-conventional directory ** hierarchy or if you want to install your libraries in ** non-conventional directories. */ #if defined(_WIN32) /* ** In Windows, any exclamation mark ('!') in the path is replaced by the ** path of the directory of the executable file of the current process. */ #define LUA_LDIR "!\\lua\\" #define LUA_CDIR "!\\" #define LUA_PATH_DEFAULT \ ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" #define LUA_CPATH_DEFAULT \ ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" #else #define LUA_ROOT "/usr/local/" #define LUA_LDIR LUA_ROOT "share/lua/5.1/" #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" #define LUA_PATH_DEFAULT \ "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" #define LUA_CPATH_DEFAULT \ "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" #endif /* @@ LUA_DIRSEP is the directory separator (for submodules). ** CHANGE it if your machine does not use "/" as the directory separator ** and is not Windows. (On Windows Lua automatically uses "\".) */ #if defined(_WIN32) #define LUA_DIRSEP "\\" #else #define LUA_DIRSEP "/" #endif /* @@ LUA_PATHSEP is the character that separates templates in a path. @@ LUA_PATH_MARK is the string that marks the substitution points in a @* template. @@ LUA_EXECDIR in a Windows path is replaced by the executable's @* directory. @@ LUA_IGMARK is a mark to ignore all before it when bulding the @* luaopen_ function name. ** CHANGE them if for some reason your system cannot use those ** characters. (E.g., if one of those characters is a common character ** in file/directory names.) Probably you do not need to change them. */ #define LUA_PATHSEP ";" #define LUA_PATH_MARK "?" #define LUA_EXECDIR "!" #define LUA_IGMARK "-" /* @@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. ** CHANGE that if ptrdiff_t is not adequate on your machine. (On most ** machines, ptrdiff_t gives a good choice between int or long.) */ #define LUA_INTEGER ptrdiff_t /* @@ LUA_API is a mark for all core API functions. @@ LUALIB_API is a mark for all standard library functions. ** CHANGE them if you need to define those functions in some special way. ** For instance, if you want to create one Windows DLL with the core and ** the libraries, you may want to use the following definition (define ** LUA_BUILD_AS_DLL to get it). */ #if defined(LUA_BUILD_AS_DLL) #if defined(LUA_CORE) || defined(LUA_LIB) #define LUA_API __declspec(dllexport) #else #define LUA_API __declspec(dllimport) #endif #else #define LUA_API extern #endif /* more often than not the libs go together with the core */ #define LUALIB_API LUA_API /* @@ LUAI_FUNC is a mark for all extern functions that are not to be @* exported to outside modules. @@ LUAI_DATA is a mark for all extern (const) variables that are not to @* be exported to outside modules. ** CHANGE them if you need to mark them in some special way. Elf/gcc ** (versions 3.2 and later) mark them as "hidden" to optimize access ** when Lua is compiled as a shared library. */ #if defined(luaall_c) #define LUAI_FUNC static #define LUAI_DATA /* empty */ #elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ defined(__ELF__) #define LUAI_FUNC __attribute__((visibility("hidden"))) extern #define LUAI_DATA LUAI_FUNC #else #define LUAI_FUNC extern #define LUAI_DATA extern #endif /* @@ LUA_QL describes how error messages quote program elements. ** CHANGE it if you want a different appearance. */ #define LUA_QL(x) "'" x "'" #define LUA_QS LUA_QL("%s") /* @@ LUA_IDSIZE gives the maximum size for the description of the source @* of a function in debug information. ** CHANGE it if you want a different size. */ #define LUA_IDSIZE 60 /* ** {================================================================== ** Stand-alone configuration ** =================================================================== */ #if defined(lua_c) || defined(luaall_c) /* @@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that @* is, whether we're running lua interactively). ** CHANGE it if you have a better definition for non-POSIX/non-Windows ** systems. */ #if defined(LUA_USE_ISATTY) #include #define lua_stdin_is_tty() isatty(0) #elif defined(LUA_WIN) #include #include #define lua_stdin_is_tty() _isatty(_fileno(stdin)) #else #define lua_stdin_is_tty() 1 /* assume stdin is a tty */ #endif /* @@ LUA_PROMPT is the default prompt used by stand-alone Lua. @@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua. ** CHANGE them if you want different prompts. (You can also change the ** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.) */ #define LUA_PROMPT "> " #define LUA_PROMPT2 ">> " /* @@ LUA_PROGNAME is the default name for the stand-alone Lua program. ** CHANGE it if your stand-alone interpreter has a different name and ** your system is not able to detect that name automatically. */ #define LUA_PROGNAME "lua" /* @@ LUA_MAXINPUT is the maximum length for an input line in the @* stand-alone interpreter. ** CHANGE it if you need longer lines. */ #define LUA_MAXINPUT 512 /* @@ lua_readline defines how to show a prompt and then read a line from @* the standard input. @@ lua_saveline defines how to "save" a read line in a "history". @@ lua_freeline defines how to free a line read by lua_readline. ** CHANGE them if you want to improve this functionality (e.g., by using ** GNU readline and history facilities). */ #if defined(LUA_USE_READLINE) #include #include #include #define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) #define lua_saveline(L,idx) \ if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ add_history(lua_tostring(L, idx)); /* add it to history */ #define lua_freeline(L,b) ((void)L, free(b)) #else #define lua_readline(L,b,p) \ ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ #define lua_saveline(L,idx) { (void)L; (void)idx; } #define lua_freeline(L,b) { (void)L; (void)b; } #endif #endif /* }================================================================== */ /* @@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles @* as a percentage. ** CHANGE it if you want the GC to run faster or slower (higher values ** mean larger pauses which mean slower collection.) You can also change ** this value dynamically. */ #define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ /* @@ LUAI_GCMUL defines the default speed of garbage collection relative to @* memory allocation as a percentage. ** CHANGE it if you want to change the granularity of the garbage ** collection. (Higher values mean coarser collections. 0 represents ** infinity, where each step performs a full collection.) You can also ** change this value dynamically. */ #define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ /* @@ LUA_COMPAT_GETN controls compatibility with old getn behavior. ** CHANGE it (define it) if you want exact compatibility with the ** behavior of setn/getn in Lua 5.0. */ #undef LUA_COMPAT_GETN /* @@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib. ** CHANGE it to undefined as soon as you do not need a global 'loadlib' ** function (the function is still available as 'package.loadlib'). */ #undef LUA_COMPAT_LOADLIB /* @@ LUA_COMPAT_VARARG controls compatibility with old vararg feature. ** CHANGE it to undefined as soon as your programs use only '...' to ** access vararg parameters (instead of the old 'arg' table). */ #define LUA_COMPAT_VARARG /* @@ LUA_COMPAT_MOD controls compatibility with old math.mod function. ** CHANGE it to undefined as soon as your programs use 'math.fmod' or ** the new '%' operator instead of 'math.mod'. */ #define LUA_COMPAT_MOD /* @@ LUA_COMPAT_LSTR controls compatibility with old long string nesting @* facility. ** CHANGE it to 2 if you want the old behaviour, or undefine it to turn ** off the advisory error when nesting [[...]]. */ #define LUA_COMPAT_LSTR 1 /* @@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. ** CHANGE it to undefined as soon as you rename 'string.gfind' to ** 'string.gmatch'. */ #define LUA_COMPAT_GFIND /* @@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib' @* behavior. ** CHANGE it to undefined as soon as you replace to 'luaL_register' ** your uses of 'luaL_openlib' */ #define LUA_COMPAT_OPENLIB /* @@ luai_apicheck is the assert macro used by the Lua-C API. ** CHANGE luai_apicheck if you want Lua to perform some checks in the ** parameters it gets from API calls. This may slow down the interpreter ** a bit, but may be quite useful when debugging C code that interfaces ** with Lua. A useful redefinition is to use assert.h. */ #if defined(LUA_USE_APICHECK) #include #define luai_apicheck(L,o) { (void)L; assert(o); } #else #define luai_apicheck(L,o) { (void)L; } #endif /* @@ LUAI_BITSINT defines the number of bits in an int. ** CHANGE here if Lua cannot automatically detect the number of bits of ** your machine. Probably you do not need to change this. */ /* avoid overflows in comparison */ #if INT_MAX-20 < 32760 #define LUAI_BITSINT 16 #elif INT_MAX > 2147483640L /* int has at least 32 bits */ #define LUAI_BITSINT 32 #else #error "you must define LUA_BITSINT with number of bits in an integer" #endif /* @@ LUAI_UINT32 is an unsigned integer with at least 32 bits. @@ LUAI_INT32 is an signed integer with at least 32 bits. @@ LUAI_UMEM is an unsigned integer big enough to count the total @* memory used by Lua. @@ LUAI_MEM is a signed integer big enough to count the total memory @* used by Lua. ** CHANGE here if for some weird reason the default definitions are not ** good enough for your machine. (The definitions in the 'else' ** part always works, but may waste space on machines with 64-bit ** longs.) Probably you do not need to change this. */ #if LUAI_BITSINT >= 32 #define LUAI_UINT32 unsigned int #define LUAI_INT32 int #define LUAI_MAXINT32 INT_MAX #define LUAI_UMEM size_t #define LUAI_MEM ptrdiff_t #else /* 16-bit ints */ #define LUAI_UINT32 unsigned long #define LUAI_INT32 long #define LUAI_MAXINT32 LONG_MAX #define LUAI_UMEM unsigned long #define LUAI_MEM long #endif /* @@ LUAI_MAXCALLS limits the number of nested calls. ** CHANGE it if you need really deep recursive calls. This limit is ** arbitrary; its only purpose is to stop infinite recursion before ** exhausting memory. */ #define LUAI_MAXCALLS 20000 /* @@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function @* can use. ** CHANGE it if you need lots of (Lua) stack space for your C ** functions. This limit is arbitrary; its only purpose is to stop C ** functions to consume unlimited stack space. */ #define LUAI_MCS_AUX ((int)(INT_MAX / (4*sizeof(LUA_NUMBER)))) #define LUAI_MAXCSTACK (LUAI_MCS_AUX > SHRT_MAX ? SHRT_MAX : LUAI_MCS_AUX) /* ** {================================================================== ** CHANGE (to smaller values) the following definitions if your system ** has a small C stack. (Or you may want to change them to larger ** values if your system has a large C stack and these limits are ** too rigid for you.) Some of these constants control the size of ** stack-allocated arrays used by the compiler or the interpreter, while ** others limit the maximum number of recursive calls that the compiler ** or the interpreter can perform. Values too large may cause a C stack ** overflow for some forms of deep constructs. ** =================================================================== */ /* @@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and @* syntactical nested non-terminals in a program. */ #define LUAI_MAXCCALLS 200 /* @@ LUAI_MAXVARS is the maximum number of local variables per function @* (must be smaller than 250). */ #define LUAI_MAXVARS 200 /* @@ LUAI_MAXUPVALUES is the maximum number of upvalues per function @* (must be smaller than 250). */ #define LUAI_MAXUPVALUES 60 /* @@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. */ #define LUAL_BUFFERSIZE BUFSIZ /* }================================================================== */ /* ** {================================================================== @@ LUA_NUMBER is the type of numbers in Lua. ** CHANGE the following definitions only if you want to build Lua ** with a number type different from double. You may also need to ** change lua_number2int & lua_number2integer. ** =================================================================== */ #define LUA_NUMBER_DOUBLE #define LUA_NUMBER double /* @@ LUAI_UACNUMBER is the result of an 'usual argument conversion' @* over a number. */ #define LUAI_UACNUMBER double /* @@ LUA_NUMBER_SCAN is the format for reading numbers. @@ LUA_NUMBER_FMT is the format for writing numbers. @@ lua_number2str converts a number to a string. @@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. @@ lua_str2number converts a string to a number. */ #define LUA_NUMBER_SCAN "%lf" #define LUA_NUMBER_FMT "%.14g" #define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) #define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ #define lua_str2number(s,p) strtod((s), (p)) /* @@ The luai_num* macros define the primitive operations over numbers. */ #if defined(LUA_CORE) #include #define luai_numadd(a,b) ((a)+(b)) #define luai_numsub(a,b) ((a)-(b)) #define luai_nummul(a,b) ((a)*(b)) #define luai_numdiv(a,b) ((a)/(b)) #define luai_nummod(a,b) ((a) - floor((a)/(b))*(b)) #define luai_numpow(a,b) (pow(a,b)) #define luai_numunm(a) (-(a)) #define luai_numeq(a,b) ((a)==(b)) #define luai_numlt(a,b) ((a)<(b)) #define luai_numle(a,b) ((a)<=(b)) #define luai_numisnan(a) (!luai_numeq((a), (a))) #endif /* @@ lua_number2int is a macro to convert lua_Number to int. @@ lua_number2integer is a macro to convert lua_Number to lua_Integer. ** CHANGE them if you know a faster way to convert a lua_Number to ** int (with any rounding method and without throwing errors) in your ** system. In Pentium machines, a naive typecast from double to int ** in C is extremely slow, so any alternative is worth trying. */ /* On a Pentium, resort to a trick */ #if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ (defined(__i386) || defined (_M_IX86) || defined(__i386__)) /* On a Microsoft compiler, use assembler */ #if defined(_MSC_VER) #define lua_number2int(i,d) __asm fld d __asm fistp i #define lua_number2integer(i,n) lua_number2int(i, n) /* the next trick should work on any Pentium, but sometimes clashes with a DirectX idiosyncrasy */ #else union luai_Cast { double l_d; long l_l; }; #define lua_number2int(i,d) \ { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } #define lua_number2integer(i,n) lua_number2int(i, n) #endif /* this option always works, but may be slow */ #else #define lua_number2int(i,d) ((i)=(int)(d)) #define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) #endif /* }================================================================== */ /* @@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment. ** CHANGE it if your system requires alignments larger than double. (For ** instance, if your system supports long doubles and they must be ** aligned in 16-byte boundaries, then you should add long double in the ** union.) Probably you do not need to change this. */ #define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; } /* @@ LUAI_THROW/LUAI_TRY define how Lua does exception handling. ** CHANGE them if you prefer to use longjmp/setjmp even with C++ ** or if want/don't to use _longjmp/_setjmp instead of regular ** longjmp/setjmp. By default, Lua handles errors with exceptions when ** compiling as C++ code, with _longjmp/_setjmp when asked to use them, ** and with longjmp/setjmp otherwise. */ #if defined(__cplusplus) /* C++ exceptions */ #define LUAI_THROW(L,c) throw(c) #define LUAI_TRY(L,c,a) try { a } catch(...) \ { if ((c)->status == 0) (c)->status = -1; } #define luai_jmpbuf int /* dummy variable */ #elif defined(LUA_USE_ULONGJMP) /* in Unix, try _longjmp/_setjmp (more efficient) */ #define LUAI_THROW(L,c) _longjmp((c)->b, 1) #define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf #else /* default handling with long jumps */ #define LUAI_THROW(L,c) longjmp((c)->b, 1) #define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf #endif /* @@ LUA_MAXCAPTURES is the maximum number of captures that a pattern @* can do during pattern-matching. ** CHANGE it if you need more captures. This limit is arbitrary. */ #define LUA_MAXCAPTURES 32 /* @@ lua_tmpnam is the function that the OS library uses to create a @* temporary name. @@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam. ** CHANGE them if you have an alternative to tmpnam (which is considered ** insecure) or if you want the original tmpnam anyway. By default, Lua ** uses tmpnam except when POSIX is available, where it uses mkstemp. */ #if defined(loslib_c) || defined(luaall_c) #if defined(LUA_USE_MKSTEMP) #include #define LUA_TMPNAMBUFSIZE 32 #define lua_tmpnam(b,e) { \ strcpy(b, "/tmp/lua_XXXXXX"); \ e = mkstemp(b); \ if (e != -1) close(e); \ e = (e == -1); } #else #define LUA_TMPNAMBUFSIZE L_tmpnam #define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } #endif #endif /* @@ lua_popen spawns a new process connected to the current one through @* the file streams. ** CHANGE it if you have a way to implement it in your system. */ #if defined(LUA_USE_POPEN) #define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) #define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) #elif defined(LUA_WIN) #define lua_popen(L,c,m) ((void)L, _popen(c,m)) #define lua_pclose(L,file) ((void)L, (_pclose(file) != -1)) #else #define lua_popen(L,c,m) ((void)((void)c, m), \ luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0) #define lua_pclose(L,file) ((void)((void)L, file), 0) #endif /* @@ LUA_DL_* define which dynamic-library system Lua should use. ** CHANGE here if Lua has problems choosing the appropriate ** dynamic-library system for your platform (either Windows' DLL, Mac's ** dyld, or Unix's dlopen). If your system is some kind of Unix, there ** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for ** it. To use dlopen you also need to adapt the src/Makefile (probably ** adding -ldl to the linker options), so Lua does not select it ** automatically. (When you change the makefile to add -ldl, you must ** also add -DLUA_USE_DLOPEN.) ** If you do not want any kind of dynamic library, undefine all these ** options. ** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD. */ #if defined(LUA_USE_DLOPEN) #define LUA_DL_DLOPEN #endif #if defined(LUA_WIN) #define LUA_DL_DLL #endif /* @@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State @* (the data goes just *before* the lua_State pointer). ** CHANGE (define) this if you really need that. This value must be ** a multiple of the maximum alignment required for your machine. */ #define LUAI_EXTRASPACE 0 /* @@ luai_userstate* allow user-specific actions on threads. ** CHANGE them if you defined LUAI_EXTRASPACE and need to do something ** extra when a thread is created/deleted/resumed/yielded. */ #define luai_userstateopen(L) ((void)L) #define luai_userstateclose(L) ((void)L) #define luai_userstatethread(L,L1) ((void)L) #define luai_userstatefree(L) ((void)L) #define luai_userstateresume(L,n) ((void)L) #define luai_userstateyield(L,n) ((void)L) /* @@ LUA_INTFRMLEN is the length modifier for integer conversions @* in 'string.format'. @@ LUA_INTFRM_T is the integer type correspoding to the previous length @* modifier. ** CHANGE them if your system supports long long or does not support long. */ #if defined(LUA_USELONGLONG) #define LUA_INTFRMLEN "ll" #define LUA_INTFRM_T long long #else #define LUA_INTFRMLEN "l" #define LUA_INTFRM_T long #endif /* =================================================================== */ /* ** Local configuration. You can use this space to add your redefinitions ** without modifying the main part of the file. */ #endif premake-3.7.orig/Src/Lua/lcode.c0000644000000000000000000005152711043456337013356 0ustar /* ** $Id: lcode.c,v 2.25.1.3 2007/12/28 15:32:23 roberto Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */ #include #define lcode_c #define LUA_CORE #include "lua.h" #include "lcode.h" #include "ldebug.h" #include "ldo.h" #include "lgc.h" #include "llex.h" #include "lmem.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" #include "ltable.h" #define hasjumps(e) ((e)->t != (e)->f) static int isnumeral(expdesc *e) { return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP); } void luaK_nil (FuncState *fs, int from, int n) { Instruction *previous; if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ if (fs->pc == 0) { /* function start? */ if (from >= fs->nactvar) return; /* positions are already clean */ } else { previous = &fs->f->code[fs->pc-1]; if (GET_OPCODE(*previous) == OP_LOADNIL) { int pfrom = GETARG_A(*previous); int pto = GETARG_B(*previous); if (pfrom <= from && from <= pto+1) { /* can connect both? */ if (from+n-1 > pto) SETARG_B(*previous, from+n-1); return; } } } } luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /* else no optimization */ } int luaK_jump (FuncState *fs) { int jpc = fs->jpc; /* save list of jumps to here */ int j; fs->jpc = NO_JUMP; j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); luaK_concat(fs, &j, jpc); /* keep them on hold */ return j; } void luaK_ret (FuncState *fs, int first, int nret) { luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); } static int condjump (FuncState *fs, OpCode op, int A, int B, int C) { luaK_codeABC(fs, op, A, B, C); return luaK_jump(fs); } static void fixjump (FuncState *fs, int pc, int dest) { Instruction *jmp = &fs->f->code[pc]; int offset = dest-(pc+1); lua_assert(dest != NO_JUMP); if (abs(offset) > MAXARG_sBx) luaX_syntaxerror(fs->ls, "control structure too long"); SETARG_sBx(*jmp, offset); } /* ** returns current `pc' and marks it as a jump target (to avoid wrong ** optimizations with consecutive instructions not in the same basic block). */ int luaK_getlabel (FuncState *fs) { fs->lasttarget = fs->pc; return fs->pc; } static int getjump (FuncState *fs, int pc) { int offset = GETARG_sBx(fs->f->code[pc]); if (offset == NO_JUMP) /* point to itself represents end of list */ return NO_JUMP; /* end of list */ else return (pc+1)+offset; /* turn offset into absolute position */ } static Instruction *getjumpcontrol (FuncState *fs, int pc) { Instruction *pi = &fs->f->code[pc]; if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) return pi-1; else return pi; } /* ** check whether list has any jump that do not produce a value ** (or produce an inverted value) */ static int need_value (FuncState *fs, int list) { for (; list != NO_JUMP; list = getjump(fs, list)) { Instruction i = *getjumpcontrol(fs, list); if (GET_OPCODE(i) != OP_TESTSET) return 1; } return 0; /* not found */ } static int patchtestreg (FuncState *fs, int node, int reg) { Instruction *i = getjumpcontrol(fs, node); if (GET_OPCODE(*i) != OP_TESTSET) return 0; /* cannot patch other instructions */ if (reg != NO_REG && reg != GETARG_B(*i)) SETARG_A(*i, reg); else /* no register to put value or register already has the value */ *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i)); return 1; } static void removevalues (FuncState *fs, int list) { for (; list != NO_JUMP; list = getjump(fs, list)) patchtestreg(fs, list, NO_REG); } static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, int dtarget) { while (list != NO_JUMP) { int next = getjump(fs, list); if (patchtestreg(fs, list, reg)) fixjump(fs, list, vtarget); else fixjump(fs, list, dtarget); /* jump to default target */ list = next; } } static void dischargejpc (FuncState *fs) { patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); fs->jpc = NO_JUMP; } void luaK_patchlist (FuncState *fs, int list, int target) { if (target == fs->pc) luaK_patchtohere(fs, list); else { lua_assert(target < fs->pc); patchlistaux(fs, list, target, NO_REG, target); } } void luaK_patchtohere (FuncState *fs, int list) { luaK_getlabel(fs); luaK_concat(fs, &fs->jpc, list); } void luaK_concat (FuncState *fs, int *l1, int l2) { if (l2 == NO_JUMP) return; else if (*l1 == NO_JUMP) *l1 = l2; else { int list = *l1; int next; while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ list = next; fixjump(fs, list, l2); } } void luaK_checkstack (FuncState *fs, int n) { int newstack = fs->freereg + n; if (newstack > fs->f->maxstacksize) { if (newstack >= MAXSTACK) luaX_syntaxerror(fs->ls, "function or expression too complex"); fs->f->maxstacksize = cast_byte(newstack); } } void luaK_reserveregs (FuncState *fs, int n) { luaK_checkstack(fs, n); fs->freereg += n; } static void freereg (FuncState *fs, int reg) { if (!ISK(reg) && reg >= fs->nactvar) { fs->freereg--; lua_assert(reg == fs->freereg); } } static void freeexp (FuncState *fs, expdesc *e) { if (e->k == VNONRELOC) freereg(fs, e->u.s.info); } static int addk (FuncState *fs, TValue *k, TValue *v) { lua_State *L = fs->L; TValue *idx = luaH_set(L, fs->h, k); Proto *f = fs->f; int oldsize = f->sizek; if (ttisnumber(idx)) { lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v)); return cast_int(nvalue(idx)); } else { /* constant not found; create a new entry */ setnvalue(idx, cast_num(fs->nk)); luaM_growvector(L, f->k, fs->nk, f->sizek, TValue, MAXARG_Bx, "constant table overflow"); while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); setobj(L, &f->k[fs->nk], v); luaC_barrier(L, f, v); return fs->nk++; } } int luaK_stringK (FuncState *fs, TString *s) { TValue o; setsvalue(fs->L, &o, s); return addk(fs, &o, &o); } int luaK_numberK (FuncState *fs, lua_Number r) { TValue o; setnvalue(&o, r); return addk(fs, &o, &o); } static int boolK (FuncState *fs, int b) { TValue o; setbvalue(&o, b); return addk(fs, &o, &o); } static int nilK (FuncState *fs) { TValue k, v; setnilvalue(&v); /* cannot use nil as key; instead use table itself to represent nil */ sethvalue(fs->L, &k, fs->h); return addk(fs, &k, &v); } void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { if (e->k == VCALL) { /* expression is an open function call? */ SETARG_C(getcode(fs, e), nresults+1); } else if (e->k == VVARARG) { SETARG_B(getcode(fs, e), nresults+1); SETARG_A(getcode(fs, e), fs->freereg); luaK_reserveregs(fs, 1); } } void luaK_setoneret (FuncState *fs, expdesc *e) { if (e->k == VCALL) { /* expression is an open function call? */ e->k = VNONRELOC; e->u.s.info = GETARG_A(getcode(fs, e)); } else if (e->k == VVARARG) { SETARG_B(getcode(fs, e), 2); e->k = VRELOCABLE; /* can relocate its simple result */ } } void luaK_dischargevars (FuncState *fs, expdesc *e) { switch (e->k) { case VLOCAL: { e->k = VNONRELOC; break; } case VUPVAL: { e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0); e->k = VRELOCABLE; break; } case VGLOBAL: { e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info); e->k = VRELOCABLE; break; } case VINDEXED: { freereg(fs, e->u.s.aux); freereg(fs, e->u.s.info); e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux); e->k = VRELOCABLE; break; } case VVARARG: case VCALL: { luaK_setoneret(fs, e); break; } default: break; /* there is one value available (somewhere) */ } } static int code_label (FuncState *fs, int A, int b, int jump) { luaK_getlabel(fs); /* those instructions may be jump targets */ return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); } static void discharge2reg (FuncState *fs, expdesc *e, int reg) { luaK_dischargevars(fs, e); switch (e->k) { case VNIL: { luaK_nil(fs, reg, 1); break; } case VFALSE: case VTRUE: { luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); break; } case VK: { luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info); break; } case VKNUM: { luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval)); break; } case VRELOCABLE: { Instruction *pc = &getcode(fs, e); SETARG_A(*pc, reg); break; } case VNONRELOC: { if (reg != e->u.s.info) luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0); break; } default: { lua_assert(e->k == VVOID || e->k == VJMP); return; /* nothing to do... */ } } e->u.s.info = reg; e->k = VNONRELOC; } static void discharge2anyreg (FuncState *fs, expdesc *e) { if (e->k != VNONRELOC) { luaK_reserveregs(fs, 1); discharge2reg(fs, e, fs->freereg-1); } } static void exp2reg (FuncState *fs, expdesc *e, int reg) { discharge2reg(fs, e, reg); if (e->k == VJMP) luaK_concat(fs, &e->t, e->u.s.info); /* put this jump in `t' list */ if (hasjumps(e)) { int final; /* position after whole expression */ int p_f = NO_JUMP; /* position of an eventual LOAD false */ int p_t = NO_JUMP; /* position of an eventual LOAD true */ if (need_value(fs, e->t) || need_value(fs, e->f)) { int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); p_f = code_label(fs, reg, 0, 1); p_t = code_label(fs, reg, 1, 0); luaK_patchtohere(fs, fj); } final = luaK_getlabel(fs); patchlistaux(fs, e->f, final, reg, p_f); patchlistaux(fs, e->t, final, reg, p_t); } e->f = e->t = NO_JUMP; e->u.s.info = reg; e->k = VNONRELOC; } void luaK_exp2nextreg (FuncState *fs, expdesc *e) { luaK_dischargevars(fs, e); freeexp(fs, e); luaK_reserveregs(fs, 1); exp2reg(fs, e, fs->freereg - 1); } int luaK_exp2anyreg (FuncState *fs, expdesc *e) { luaK_dischargevars(fs, e); if (e->k == VNONRELOC) { if (!hasjumps(e)) return e->u.s.info; /* exp is already in a register */ if (e->u.s.info >= fs->nactvar) { /* reg. is not a local? */ exp2reg(fs, e, e->u.s.info); /* put value on it */ return e->u.s.info; } } luaK_exp2nextreg(fs, e); /* default */ return e->u.s.info; } void luaK_exp2val (FuncState *fs, expdesc *e) { if (hasjumps(e)) luaK_exp2anyreg(fs, e); else luaK_dischargevars(fs, e); } int luaK_exp2RK (FuncState *fs, expdesc *e) { luaK_exp2val(fs, e); switch (e->k) { case VKNUM: case VTRUE: case VFALSE: case VNIL: { if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */ e->u.s.info = (e->k == VNIL) ? nilK(fs) : (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) : boolK(fs, (e->k == VTRUE)); e->k = VK; return RKASK(e->u.s.info); } else break; } case VK: { if (e->u.s.info <= MAXINDEXRK) /* constant fit in argC? */ return RKASK(e->u.s.info); else break; } default: break; } /* not a constant in the right range: put it in a register */ return luaK_exp2anyreg(fs, e); } void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { switch (var->k) { case VLOCAL: { freeexp(fs, ex); exp2reg(fs, ex, var->u.s.info); return; } case VUPVAL: { int e = luaK_exp2anyreg(fs, ex); luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0); break; } case VGLOBAL: { int e = luaK_exp2anyreg(fs, ex); luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info); break; } case VINDEXED: { int e = luaK_exp2RK(fs, ex); luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e); break; } default: { lua_assert(0); /* invalid var kind to store */ break; } } freeexp(fs, ex); } void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { int func; luaK_exp2anyreg(fs, e); freeexp(fs, e); func = fs->freereg; luaK_reserveregs(fs, 2); luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key)); freeexp(fs, key); e->u.s.info = func; e->k = VNONRELOC; } static void invertjump (FuncState *fs, expdesc *e) { Instruction *pc = getjumpcontrol(fs, e->u.s.info); lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && GET_OPCODE(*pc) != OP_TEST); SETARG_A(*pc, !(GETARG_A(*pc))); } static int jumponcond (FuncState *fs, expdesc *e, int cond) { if (e->k == VRELOCABLE) { Instruction ie = getcode(fs, e); if (GET_OPCODE(ie) == OP_NOT) { fs->pc--; /* remove previous OP_NOT */ return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); } /* else go through */ } discharge2anyreg(fs, e); freeexp(fs, e); return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond); } void luaK_goiftrue (FuncState *fs, expdesc *e) { int pc; /* pc of last jump */ luaK_dischargevars(fs, e); switch (e->k) { case VK: case VKNUM: case VTRUE: { pc = NO_JUMP; /* always true; do nothing */ break; } case VFALSE: { pc = luaK_jump(fs); /* always jump */ break; } case VJMP: { invertjump(fs, e); pc = e->u.s.info; break; } default: { pc = jumponcond(fs, e, 0); break; } } luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ luaK_patchtohere(fs, e->t); e->t = NO_JUMP; } static void luaK_goiffalse (FuncState *fs, expdesc *e) { int pc; /* pc of last jump */ luaK_dischargevars(fs, e); switch (e->k) { case VNIL: case VFALSE: { pc = NO_JUMP; /* always false; do nothing */ break; } case VTRUE: { pc = luaK_jump(fs); /* always jump */ break; } case VJMP: { pc = e->u.s.info; break; } default: { pc = jumponcond(fs, e, 1); break; } } luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ luaK_patchtohere(fs, e->f); e->f = NO_JUMP; } static void codenot (FuncState *fs, expdesc *e) { luaK_dischargevars(fs, e); switch (e->k) { case VNIL: case VFALSE: { e->k = VTRUE; break; } case VK: case VKNUM: case VTRUE: { e->k = VFALSE; break; } case VJMP: { invertjump(fs, e); break; } case VRELOCABLE: case VNONRELOC: { discharge2anyreg(fs, e); freeexp(fs, e); e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0); e->k = VRELOCABLE; break; } default: { lua_assert(0); /* cannot happen */ break; } } /* interchange true and false lists */ { int temp = e->f; e->f = e->t; e->t = temp; } removevalues(fs, e->f); removevalues(fs, e->t); } void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { t->u.s.aux = luaK_exp2RK(fs, k); t->k = VINDEXED; } static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { lua_Number v1, v2, r; if (!isnumeral(e1) || !isnumeral(e2)) return 0; v1 = e1->u.nval; v2 = e2->u.nval; switch (op) { case OP_ADD: r = luai_numadd(v1, v2); break; case OP_SUB: r = luai_numsub(v1, v2); break; case OP_MUL: r = luai_nummul(v1, v2); break; case OP_DIV: if (v2 == 0) return 0; /* do not attempt to divide by 0 */ r = luai_numdiv(v1, v2); break; case OP_MOD: if (v2 == 0) return 0; /* do not attempt to divide by 0 */ r = luai_nummod(v1, v2); break; case OP_POW: r = luai_numpow(v1, v2); break; case OP_UNM: r = luai_numunm(v1); break; case OP_LEN: return 0; /* no constant folding for 'len' */ default: lua_assert(0); r = 0; break; } if (luai_numisnan(r)) return 0; /* do not attempt to produce NaN */ e1->u.nval = r; return 1; } static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { if (constfolding(op, e1, e2)) return; else { int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; int o1 = luaK_exp2RK(fs, e1); if (o1 > o2) { freeexp(fs, e1); freeexp(fs, e2); } else { freeexp(fs, e2); freeexp(fs, e1); } e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); e1->k = VRELOCABLE; } } static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, expdesc *e2) { int o1 = luaK_exp2RK(fs, e1); int o2 = luaK_exp2RK(fs, e2); freeexp(fs, e2); freeexp(fs, e1); if (cond == 0 && op != OP_EQ) { int temp; /* exchange args to replace by `<' or `<=' */ temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */ cond = 1; } e1->u.s.info = condjump(fs, op, cond, o1, o2); e1->k = VJMP; } void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { expdesc e2; e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; switch (op) { case OPR_MINUS: { if (!isnumeral(e)) luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ codearith(fs, OP_UNM, e, &e2); break; } case OPR_NOT: codenot(fs, e); break; case OPR_LEN: { luaK_exp2anyreg(fs, e); /* cannot operate on constants */ codearith(fs, OP_LEN, e, &e2); break; } default: lua_assert(0); } } void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { switch (op) { case OPR_AND: { luaK_goiftrue(fs, v); break; } case OPR_OR: { luaK_goiffalse(fs, v); break; } case OPR_CONCAT: { luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ break; } case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: case OPR_MOD: case OPR_POW: { if (!isnumeral(v)) luaK_exp2RK(fs, v); break; } default: { luaK_exp2RK(fs, v); break; } } } void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { switch (op) { case OPR_AND: { lua_assert(e1->t == NO_JUMP); /* list must be closed */ luaK_dischargevars(fs, e2); luaK_concat(fs, &e2->f, e1->f); *e1 = *e2; break; } case OPR_OR: { lua_assert(e1->f == NO_JUMP); /* list must be closed */ luaK_dischargevars(fs, e2); luaK_concat(fs, &e2->t, e1->t); *e1 = *e2; break; } case OPR_CONCAT: { luaK_exp2val(fs, e2); if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) { lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1); freeexp(fs, e1); SETARG_B(getcode(fs, e2), e1->u.s.info); e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info; } else { luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ codearith(fs, OP_CONCAT, e1, e2); } break; } case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break; case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break; case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break; case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break; case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break; case OPR_POW: codearith(fs, OP_POW, e1, e2); break; case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break; case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break; case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break; case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break; case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break; case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break; default: lua_assert(0); } } void luaK_fixline (FuncState *fs, int line) { fs->f->lineinfo[fs->pc - 1] = line; } static int luaK_code (FuncState *fs, Instruction i, int line) { Proto *f = fs->f; dischargejpc(fs); /* `pc' will change */ /* put new instruction in code array */ luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, MAX_INT, "code size overflow"); f->code[fs->pc] = i; /* save corresponding line information */ luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int, MAX_INT, "code size overflow"); f->lineinfo[fs->pc] = line; return fs->pc++; } int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { lua_assert(getOpMode(o) == iABC); lua_assert(getBMode(o) != OpArgN || b == 0); lua_assert(getCMode(o) != OpArgN || c == 0); return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline); } int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); lua_assert(getCMode(o) == OpArgN); return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline); } void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1; int b = (tostore == LUA_MULTRET) ? 0 : tostore; lua_assert(tostore != 0); if (c <= MAXARG_C) luaK_codeABC(fs, OP_SETLIST, base, b, c); else { luaK_codeABC(fs, OP_SETLIST, base, b, 0); luaK_code(fs, cast(Instruction, c), fs->ls->lastline); } fs->freereg = base + 1; /* free registers with list values */ } premake-3.7.orig/Src/Lua/loslib.c0000644000000000000000000001355011043456337013546 0ustar /* ** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $ ** Standard Operating System library ** See Copyright Notice in lua.h */ #include #include #include #include #include #define loslib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" static int os_pushresult (lua_State *L, int i, const char *filename) { int en = errno; /* calls to Lua API may change this value */ if (i) { lua_pushboolean(L, 1); return 1; } else { lua_pushnil(L); lua_pushfstring(L, "%s: %s", filename, strerror(en)); lua_pushinteger(L, en); return 3; } } static int os_execute (lua_State *L) { lua_pushinteger(L, system(luaL_optstring(L, 1, NULL))); return 1; } static int os_remove (lua_State *L) { const char *filename = luaL_checkstring(L, 1); return os_pushresult(L, remove(filename) == 0, filename); } static int os_rename (lua_State *L) { const char *fromname = luaL_checkstring(L, 1); const char *toname = luaL_checkstring(L, 2); return os_pushresult(L, rename(fromname, toname) == 0, fromname); } static int os_tmpname (lua_State *L) { char buff[LUA_TMPNAMBUFSIZE]; int err; lua_tmpnam(buff, err); if (err) return luaL_error(L, "unable to generate a unique filename"); lua_pushstring(L, buff); return 1; } static int os_getenv (lua_State *L) { lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ return 1; } static int os_clock (lua_State *L) { lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); return 1; } /* ** {====================================================== ** Time/Date operations ** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, ** wday=%w+1, yday=%j, isdst=? } ** ======================================================= */ static void setfield (lua_State *L, const char *key, int value) { lua_pushinteger(L, value); lua_setfield(L, -2, key); } static void setboolfield (lua_State *L, const char *key, int value) { if (value < 0) /* undefined? */ return; /* does not set field */ lua_pushboolean(L, value); lua_setfield(L, -2, key); } static int getboolfield (lua_State *L, const char *key) { int res; lua_getfield(L, -1, key); res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); lua_pop(L, 1); return res; } static int getfield (lua_State *L, const char *key, int d) { int res; lua_getfield(L, -1, key); if (lua_isnumber(L, -1)) res = (int)lua_tointeger(L, -1); else { if (d < 0) return luaL_error(L, "field " LUA_QS " missing in date table", key); res = d; } lua_pop(L, 1); return res; } static int os_date (lua_State *L) { const char *s = luaL_optstring(L, 1, "%c"); time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); struct tm *stm; if (*s == '!') { /* UTC? */ stm = gmtime(&t); s++; /* skip `!' */ } else stm = localtime(&t); if (stm == NULL) /* invalid date? */ lua_pushnil(L); else if (strcmp(s, "*t") == 0) { lua_createtable(L, 0, 9); /* 9 = number of fields */ setfield(L, "sec", stm->tm_sec); setfield(L, "min", stm->tm_min); setfield(L, "hour", stm->tm_hour); setfield(L, "day", stm->tm_mday); setfield(L, "month", stm->tm_mon+1); setfield(L, "year", stm->tm_year+1900); setfield(L, "wday", stm->tm_wday+1); setfield(L, "yday", stm->tm_yday+1); setboolfield(L, "isdst", stm->tm_isdst); } else { char cc[3]; luaL_Buffer b; cc[0] = '%'; cc[2] = '\0'; luaL_buffinit(L, &b); for (; *s; s++) { if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */ luaL_addchar(&b, *s); else { size_t reslen; char buff[200]; /* should be big enough for any conversion result */ cc[1] = *(++s); reslen = strftime(buff, sizeof(buff), cc, stm); luaL_addlstring(&b, buff, reslen); } } luaL_pushresult(&b); } return 1; } static int os_time (lua_State *L) { time_t t; if (lua_isnoneornil(L, 1)) /* called without args? */ t = time(NULL); /* get current time */ else { struct tm ts; luaL_checktype(L, 1, LUA_TTABLE); lua_settop(L, 1); /* make sure table is at the top */ ts.tm_sec = getfield(L, "sec", 0); ts.tm_min = getfield(L, "min", 0); ts.tm_hour = getfield(L, "hour", 12); ts.tm_mday = getfield(L, "day", -1); ts.tm_mon = getfield(L, "month", -1) - 1; ts.tm_year = getfield(L, "year", -1) - 1900; ts.tm_isdst = getboolfield(L, "isdst"); t = mktime(&ts); } if (t == (time_t)(-1)) lua_pushnil(L); else lua_pushnumber(L, (lua_Number)t); return 1; } static int os_difftime (lua_State *L) { lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), (time_t)(luaL_optnumber(L, 2, 0)))); return 1; } /* }====================================================== */ static int os_setlocale (lua_State *L) { static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME}; static const char *const catnames[] = {"all", "collate", "ctype", "monetary", "numeric", "time", NULL}; const char *l = luaL_optstring(L, 1, NULL); int op = luaL_checkoption(L, 2, "all", catnames); lua_pushstring(L, setlocale(cat[op], l)); return 1; } static int os_exit (lua_State *L) { exit(luaL_optint(L, 1, EXIT_SUCCESS)); } static const luaL_Reg syslib[] = { {"clock", os_clock}, {"date", os_date}, {"difftime", os_difftime}, {"execute", os_execute}, {"exit", os_exit}, {"getenv", os_getenv}, {"remove", os_remove}, {"rename", os_rename}, {"setlocale", os_setlocale}, {"time", os_time}, {"tmpname", os_tmpname}, {NULL, NULL} }; /* }====================================================== */ LUALIB_API int luaopen_os (lua_State *L) { luaL_register(L, LUA_OSLIBNAME, syslib); return 1; } premake-3.7.orig/Src/Lua/ltablib.c0000644000000000000000000001570511043456337013677 0ustar /* ** $Id: ltablib.c,v 1.38.1.2 2007/12/28 15:32:23 roberto Exp $ ** Library for Table Manipulation ** See Copyright Notice in lua.h */ #include #define ltablib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" #define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n)) static int foreachi (lua_State *L) { int i; int n = aux_getn(L, 1); luaL_checktype(L, 2, LUA_TFUNCTION); for (i=1; i <= n; i++) { lua_pushvalue(L, 2); /* function */ lua_pushinteger(L, i); /* 1st argument */ lua_rawgeti(L, 1, i); /* 2nd argument */ lua_call(L, 2, 1); if (!lua_isnil(L, -1)) return 1; lua_pop(L, 1); /* remove nil result */ } return 0; } static int foreach (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 2, LUA_TFUNCTION); lua_pushnil(L); /* first key */ while (lua_next(L, 1)) { lua_pushvalue(L, 2); /* function */ lua_pushvalue(L, -3); /* key */ lua_pushvalue(L, -3); /* value */ lua_call(L, 2, 1); if (!lua_isnil(L, -1)) return 1; lua_pop(L, 2); /* remove value and result */ } return 0; } static int maxn (lua_State *L) { lua_Number max = 0; luaL_checktype(L, 1, LUA_TTABLE); lua_pushnil(L); /* first key */ while (lua_next(L, 1)) { lua_pop(L, 1); /* remove value */ if (lua_type(L, -1) == LUA_TNUMBER) { lua_Number v = lua_tonumber(L, -1); if (v > max) max = v; } } lua_pushnumber(L, max); return 1; } static int getn (lua_State *L) { lua_pushinteger(L, aux_getn(L, 1)); return 1; } static int setn (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); #ifndef luaL_setn luaL_setn(L, 1, luaL_checkint(L, 2)); #else luaL_error(L, LUA_QL("setn") " is obsolete"); #endif lua_pushvalue(L, 1); return 1; } static int tinsert (lua_State *L) { int e = aux_getn(L, 1) + 1; /* first empty element */ int pos; /* where to insert new element */ switch (lua_gettop(L)) { case 2: { /* called with only 2 arguments */ pos = e; /* insert new element at the end */ break; } case 3: { int i; pos = luaL_checkint(L, 2); /* 2nd argument is the position */ if (pos > e) e = pos; /* `grow' array if necessary */ for (i = e; i > pos; i--) { /* move up elements */ lua_rawgeti(L, 1, i-1); lua_rawseti(L, 1, i); /* t[i] = t[i-1] */ } break; } default: { return luaL_error(L, "wrong number of arguments to " LUA_QL("insert")); } } luaL_setn(L, 1, e); /* new size */ lua_rawseti(L, 1, pos); /* t[pos] = v */ return 0; } static int tremove (lua_State *L) { int e = aux_getn(L, 1); int pos = luaL_optint(L, 2, e); if (!(1 <= pos && pos <= e)) /* position is outside bounds? */ return 0; /* nothing to remove */ luaL_setn(L, 1, e - 1); /* t.n = n-1 */ lua_rawgeti(L, 1, pos); /* result = t[pos] */ for ( ;pos= P */ while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { if (i>u) luaL_error(L, "invalid order function for sorting"); lua_pop(L, 1); /* remove a[i] */ } /* repeat --j until a[j] <= P */ while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { if (j #define lparser_c #define LUA_CORE #include "lua.h" #include "lcode.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "llex.h" #include "lmem.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #define hasmultret(k) ((k) == VCALL || (k) == VVARARG) #define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]]) #define luaY_checklimit(fs,v,l,m) if ((v)>(l)) errorlimit(fs,l,m) /* ** nodes for block list (list of active blocks) */ typedef struct BlockCnt { struct BlockCnt *previous; /* chain */ int breaklist; /* list of jumps out of this loop */ lu_byte nactvar; /* # active locals outside the breakable structure */ lu_byte upval; /* true if some variable in the block is an upvalue */ lu_byte isbreakable; /* true if `block' is a loop */ } BlockCnt; /* ** prototypes for recursive non-terminal functions */ static void chunk (LexState *ls); static void expr (LexState *ls, expdesc *v); static void anchor_token (LexState *ls) { if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { TString *ts = ls->t.seminfo.ts; luaX_newstring(ls, getstr(ts), ts->tsv.len); } } static void error_expected (LexState *ls, int token) { luaX_syntaxerror(ls, luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token))); } static void errorlimit (FuncState *fs, int limit, const char *what) { const char *msg = (fs->f->linedefined == 0) ? luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) : luaO_pushfstring(fs->L, "function at line %d has more than %d %s", fs->f->linedefined, limit, what); luaX_lexerror(fs->ls, msg, 0); } static int testnext (LexState *ls, int c) { if (ls->t.token == c) { luaX_next(ls); return 1; } else return 0; } static void check (LexState *ls, int c) { if (ls->t.token != c) error_expected(ls, c); } static void checknext (LexState *ls, int c) { check(ls, c); luaX_next(ls); } #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } static void check_match (LexState *ls, int what, int who, int where) { if (!testnext(ls, what)) { if (where == ls->linenumber) error_expected(ls, what); else { luaX_syntaxerror(ls, luaO_pushfstring(ls->L, LUA_QS " expected (to close " LUA_QS " at line %d)", luaX_token2str(ls, what), luaX_token2str(ls, who), where)); } } } static TString *str_checkname (LexState *ls) { TString *ts; check(ls, TK_NAME); ts = ls->t.seminfo.ts; luaX_next(ls); return ts; } static void init_exp (expdesc *e, expkind k, int i) { e->f = e->t = NO_JUMP; e->k = k; e->u.s.info = i; } static void codestring (LexState *ls, expdesc *e, TString *s) { init_exp(e, VK, luaK_stringK(ls->fs, s)); } static void checkname(LexState *ls, expdesc *e) { codestring(ls, e, str_checkname(ls)); } static int registerlocalvar (LexState *ls, TString *varname) { FuncState *fs = ls->fs; Proto *f = fs->f; int oldsize = f->sizelocvars; luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, LocVar, SHRT_MAX, "too many local variables"); while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; f->locvars[fs->nlocvars].varname = varname; luaC_objbarrier(ls->L, f, varname); return fs->nlocvars++; } #define new_localvarliteral(ls,v,n) \ new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n) static void new_localvar (LexState *ls, TString *name, int n) { FuncState *fs = ls->fs; luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables"); fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); } static void adjustlocalvars (LexState *ls, int nvars) { FuncState *fs = ls->fs; fs->nactvar = cast_byte(fs->nactvar + nvars); for (; nvars; nvars--) { getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc; } } static void removevars (LexState *ls, int tolevel) { FuncState *fs = ls->fs; while (fs->nactvar > tolevel) getlocvar(fs, --fs->nactvar).endpc = fs->pc; } static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { int i; Proto *f = fs->f; int oldsize = f->sizeupvalues; for (i=0; inups; i++) { if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { lua_assert(f->upvalues[i] == name); return i; } } /* new one */ luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, TString *, MAX_INT, ""); while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; f->upvalues[f->nups] = name; luaC_objbarrier(fs->L, f, name); lua_assert(v->k == VLOCAL || v->k == VUPVAL); fs->upvalues[f->nups].k = cast_byte(v->k); fs->upvalues[f->nups].info = cast_byte(v->u.s.info); return f->nups++; } static int searchvar (FuncState *fs, TString *n) { int i; for (i=fs->nactvar-1; i >= 0; i--) { if (n == getlocvar(fs, i).varname) return i; } return -1; /* not found */ } static void markupval (FuncState *fs, int level) { BlockCnt *bl = fs->bl; while (bl && bl->nactvar > level) bl = bl->previous; if (bl) bl->upval = 1; } static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { if (fs == NULL) { /* no more levels? */ init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ return VGLOBAL; } else { int v = searchvar(fs, n); /* look up at current level */ if (v >= 0) { init_exp(var, VLOCAL, v); if (!base) markupval(fs, v); /* local will be used as an upval */ return VLOCAL; } else { /* not found at current level; try upper one */ if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) return VGLOBAL; var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ var->k = VUPVAL; /* upvalue in this level */ return VUPVAL; } } } static void singlevar (LexState *ls, expdesc *var) { TString *varname = str_checkname(ls); FuncState *fs = ls->fs; if (singlevaraux(fs, varname, var, 1) == VGLOBAL) var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ } static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { FuncState *fs = ls->fs; int extra = nvars - nexps; if (hasmultret(e->k)) { extra++; /* includes call itself */ if (extra < 0) extra = 0; luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ if (extra > 1) luaK_reserveregs(fs, extra-1); } else { if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ if (extra > 0) { int reg = fs->freereg; luaK_reserveregs(fs, extra); luaK_nil(fs, reg, extra); } } } static void enterlevel (LexState *ls) { if (++ls->L->nCcalls > LUAI_MAXCCALLS) luaX_lexerror(ls, "chunk has too many syntax levels", 0); } #define leavelevel(ls) ((ls)->L->nCcalls--) static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) { bl->breaklist = NO_JUMP; bl->isbreakable = isbreakable; bl->nactvar = fs->nactvar; bl->upval = 0; bl->previous = fs->bl; fs->bl = bl; lua_assert(fs->freereg == fs->nactvar); } static void leaveblock (FuncState *fs) { BlockCnt *bl = fs->bl; fs->bl = bl->previous; removevars(fs->ls, bl->nactvar); if (bl->upval) luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); /* a block either controls scope or breaks (never both) */ lua_assert(!bl->isbreakable || !bl->upval); lua_assert(bl->nactvar == fs->nactvar); fs->freereg = fs->nactvar; /* free registers */ luaK_patchtohere(fs, bl->breaklist); } static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { FuncState *fs = ls->fs; Proto *f = fs->f; int oldsize = f->sizep; int i; luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "constant table overflow"); while (oldsize < f->sizep) f->p[oldsize++] = NULL; f->p[fs->np++] = func->f; luaC_objbarrier(ls->L, f, func->f); init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); for (i=0; if->nups; i++) { OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); } } static void open_func (LexState *ls, FuncState *fs) { lua_State *L = ls->L; Proto *f = luaF_newproto(L); fs->f = f; fs->prev = ls->fs; /* linked list of funcstates */ fs->ls = ls; fs->L = L; ls->fs = fs; fs->pc = 0; fs->lasttarget = -1; fs->jpc = NO_JUMP; fs->freereg = 0; fs->nk = 0; fs->np = 0; fs->nlocvars = 0; fs->nactvar = 0; fs->bl = NULL; f->source = ls->source; f->maxstacksize = 2; /* registers 0/1 are always valid */ fs->h = luaH_new(L, 0, 0); /* anchor table of constants and prototype (to avoid being collected) */ sethvalue2s(L, L->top, fs->h); incr_top(L); setptvalue2s(L, L->top, f); incr_top(L); } static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = ls->fs; Proto *f = fs->f; removevars(ls, 0); luaK_ret(fs, 0, 0); /* final return */ luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); f->sizecode = fs->pc; luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); f->sizelineinfo = fs->pc; luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); f->sizek = fs->nk; luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); f->sizep = fs->np; luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); f->sizelocvars = fs->nlocvars; luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); f->sizeupvalues = f->nups; lua_assert(luaG_checkcode(f)); lua_assert(fs->bl == NULL); ls->fs = fs->prev; L->top -= 2; /* remove table and prototype from the stack */ /* last token read was anchored in defunct function; must reanchor it */ if (fs) anchor_token(ls); } Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { struct LexState lexstate; struct FuncState funcstate; lexstate.buff = buff; luaX_setinput(L, &lexstate, z, luaS_new(L, name)); open_func(&lexstate, &funcstate); funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ luaX_next(&lexstate); /* read first token */ chunk(&lexstate); check(&lexstate, TK_EOS); close_func(&lexstate); lua_assert(funcstate.prev == NULL); lua_assert(funcstate.f->nups == 0); lua_assert(lexstate.fs == NULL); return funcstate.f; } /*============================================================*/ /* GRAMMAR RULES */ /*============================================================*/ static void field (LexState *ls, expdesc *v) { /* field -> ['.' | ':'] NAME */ FuncState *fs = ls->fs; expdesc key; luaK_exp2anyreg(fs, v); luaX_next(ls); /* skip the dot or colon */ checkname(ls, &key); luaK_indexed(fs, v, &key); } static void yindex (LexState *ls, expdesc *v) { /* index -> '[' expr ']' */ luaX_next(ls); /* skip the '[' */ expr(ls, v); luaK_exp2val(ls->fs, v); checknext(ls, ']'); } /* ** {====================================================================== ** Rules for Constructors ** ======================================================================= */ struct ConsControl { expdesc v; /* last list item read */ expdesc *t; /* table descriptor */ int nh; /* total number of `record' elements */ int na; /* total number of array elements */ int tostore; /* number of array elements pending to be stored */ }; static void recfield (LexState *ls, struct ConsControl *cc) { /* recfield -> (NAME | `['exp1`]') = exp1 */ FuncState *fs = ls->fs; int reg = ls->fs->freereg; expdesc key, val; int rkkey; if (ls->t.token == TK_NAME) { luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); checkname(ls, &key); } else /* ls->t.token == '[' */ yindex(ls, &key); cc->nh++; checknext(ls, '='); rkkey = luaK_exp2RK(fs, &key); expr(ls, &val); luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val)); fs->freereg = reg; /* free registers */ } static void closelistfield (FuncState *fs, struct ConsControl *cc) { if (cc->v.k == VVOID) return; /* there is no list item */ luaK_exp2nextreg(fs, &cc->v); cc->v.k = VVOID; if (cc->tostore == LFIELDS_PER_FLUSH) { luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); /* flush */ cc->tostore = 0; /* no more items pending */ } } static void lastlistfield (FuncState *fs, struct ConsControl *cc) { if (cc->tostore == 0) return; if (hasmultret(cc->v.k)) { luaK_setmultret(fs, &cc->v); luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET); cc->na--; /* do not count last expression (unknown number of elements) */ } else { if (cc->v.k != VVOID) luaK_exp2nextreg(fs, &cc->v); luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); } } static void listfield (LexState *ls, struct ConsControl *cc) { expr(ls, &cc->v); luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); cc->na++; cc->tostore++; } static void constructor (LexState *ls, expdesc *t) { /* constructor -> ?? */ FuncState *fs = ls->fs; int line = ls->linenumber; int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); struct ConsControl cc; cc.na = cc.nh = cc.tostore = 0; cc.t = t; init_exp(t, VRELOCABLE, pc); init_exp(&cc.v, VVOID, 0); /* no value (yet) */ luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ checknext(ls, '{'); do { lua_assert(cc.v.k == VVOID || cc.tostore > 0); if (ls->t.token == '}') break; closelistfield(fs, &cc); switch(ls->t.token) { case TK_NAME: { /* may be listfields or recfields */ luaX_lookahead(ls); if (ls->lookahead.token != '=') /* expression? */ listfield(ls, &cc); else recfield(ls, &cc); break; } case '[': { /* constructor_item -> recfield */ recfield(ls, &cc); break; } default: { /* constructor_part -> listfield */ listfield(ls, &cc); break; } } } while (testnext(ls, ',') || testnext(ls, ';')); check_match(ls, '}', '{', line); lastlistfield(fs, &cc); SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ } /* }====================================================================== */ static void parlist (LexState *ls) { /* parlist -> [ param { `,' param } ] */ FuncState *fs = ls->fs; Proto *f = fs->f; int nparams = 0; f->is_vararg = 0; if (ls->t.token != ')') { /* is `parlist' not empty? */ do { switch (ls->t.token) { case TK_NAME: { /* param -> NAME */ new_localvar(ls, str_checkname(ls), nparams++); break; } case TK_DOTS: { /* param -> `...' */ luaX_next(ls); #if defined(LUA_COMPAT_VARARG) /* use `arg' as default name */ new_localvarliteral(ls, "arg", nparams++); f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG; #endif f->is_vararg |= VARARG_ISVARARG; break; } default: luaX_syntaxerror(ls, " or " LUA_QL("...") " expected"); } } while (!f->is_vararg && testnext(ls, ',')); } adjustlocalvars(ls, nparams); f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG)); luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ } static void body (LexState *ls, expdesc *e, int needself, int line) { /* body -> `(' parlist `)' chunk END */ FuncState new_fs; open_func(ls, &new_fs); new_fs.f->linedefined = line; checknext(ls, '('); if (needself) { new_localvarliteral(ls, "self", 0); adjustlocalvars(ls, 1); } parlist(ls); checknext(ls, ')'); chunk(ls); new_fs.f->lastlinedefined = ls->linenumber; check_match(ls, TK_END, TK_FUNCTION, line); close_func(ls); pushclosure(ls, &new_fs, e); } static int explist1 (LexState *ls, expdesc *v) { /* explist1 -> expr { `,' expr } */ int n = 1; /* at least one expression */ expr(ls, v); while (testnext(ls, ',')) { luaK_exp2nextreg(ls->fs, v); expr(ls, v); n++; } return n; } static void funcargs (LexState *ls, expdesc *f) { FuncState *fs = ls->fs; expdesc args; int base, nparams; int line = ls->linenumber; switch (ls->t.token) { case '(': { /* funcargs -> `(' [ explist1 ] `)' */ if (line != ls->lastline) luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); luaX_next(ls); if (ls->t.token == ')') /* arg list is empty? */ args.k = VVOID; else { explist1(ls, &args); luaK_setmultret(fs, &args); } check_match(ls, ')', '(', line); break; } case '{': { /* funcargs -> constructor */ constructor(ls, &args); break; } case TK_STRING: { /* funcargs -> STRING */ codestring(ls, &args, ls->t.seminfo.ts); luaX_next(ls); /* must use `seminfo' before `next' */ break; } default: { luaX_syntaxerror(ls, "function arguments expected"); return; } } lua_assert(f->k == VNONRELOC); base = f->u.s.info; /* base register for call */ if (hasmultret(args.k)) nparams = LUA_MULTRET; /* open call */ else { if (args.k != VVOID) luaK_exp2nextreg(fs, &args); /* close last argument */ nparams = fs->freereg - (base+1); } init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); luaK_fixline(fs, line); fs->freereg = base+1; /* call remove function and arguments and leaves (unless changed) one result */ } /* ** {====================================================================== ** Expression parsing ** ======================================================================= */ static void prefixexp (LexState *ls, expdesc *v) { /* prefixexp -> NAME | '(' expr ')' */ switch (ls->t.token) { case '(': { int line = ls->linenumber; luaX_next(ls); expr(ls, v); check_match(ls, ')', '(', line); luaK_dischargevars(ls->fs, v); return; } case TK_NAME: { singlevar(ls, v); return; } default: { luaX_syntaxerror(ls, "unexpected symbol"); return; } } } static void primaryexp (LexState *ls, expdesc *v) { /* primaryexp -> prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ FuncState *fs = ls->fs; prefixexp(ls, v); for (;;) { switch (ls->t.token) { case '.': { /* field */ field(ls, v); break; } case '[': { /* `[' exp1 `]' */ expdesc key; luaK_exp2anyreg(fs, v); yindex(ls, &key); luaK_indexed(fs, v, &key); break; } case ':': { /* `:' NAME funcargs */ expdesc key; luaX_next(ls); checkname(ls, &key); luaK_self(fs, v, &key); funcargs(ls, v); break; } case '(': case TK_STRING: case '{': { /* funcargs */ luaK_exp2nextreg(fs, v); funcargs(ls, v); break; } default: return; } } } static void simpleexp (LexState *ls, expdesc *v) { /* simpleexp -> NUMBER | STRING | NIL | true | false | ... | constructor | FUNCTION body | primaryexp */ switch (ls->t.token) { case TK_NUMBER: { init_exp(v, VKNUM, 0); v->u.nval = ls->t.seminfo.r; break; } case TK_STRING: { codestring(ls, v, ls->t.seminfo.ts); break; } case TK_NIL: { init_exp(v, VNIL, 0); break; } case TK_TRUE: { init_exp(v, VTRUE, 0); break; } case TK_FALSE: { init_exp(v, VFALSE, 0); break; } case TK_DOTS: { /* vararg */ FuncState *fs = ls->fs; check_condition(ls, fs->f->is_vararg, "cannot use " LUA_QL("...") " outside a vararg function"); fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */ init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); break; } case '{': { /* constructor */ constructor(ls, v); return; } case TK_FUNCTION: { luaX_next(ls); body(ls, v, 0, ls->linenumber); return; } default: { primaryexp(ls, v); return; } } luaX_next(ls); } static UnOpr getunopr (int op) { switch (op) { case TK_NOT: return OPR_NOT; case '-': return OPR_MINUS; case '#': return OPR_LEN; default: return OPR_NOUNOPR; } } static BinOpr getbinopr (int op) { switch (op) { case '+': return OPR_ADD; case '-': return OPR_SUB; case '*': return OPR_MUL; case '/': return OPR_DIV; case '%': return OPR_MOD; case '^': return OPR_POW; case TK_CONCAT: return OPR_CONCAT; case TK_NE: return OPR_NE; case TK_EQ: return OPR_EQ; case '<': return OPR_LT; case TK_LE: return OPR_LE; case '>': return OPR_GT; case TK_GE: return OPR_GE; case TK_AND: return OPR_AND; case TK_OR: return OPR_OR; default: return OPR_NOBINOPR; } } static const struct { lu_byte left; /* left priority for each binary operator */ lu_byte right; /* right priority */ } priority[] = { /* ORDER OPR */ {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */ {10, 9}, {5, 4}, /* power and concat (right associative) */ {3, 3}, {3, 3}, /* equality and inequality */ {3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */ {2, 2}, {1, 1} /* logical (and/or) */ }; #define UNARY_PRIORITY 8 /* priority for unary operators */ /* ** subexpr -> (simpleexp | unop subexpr) { binop subexpr } ** where `binop' is any binary operator with a priority higher than `limit' */ static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { BinOpr op; UnOpr uop; enterlevel(ls); uop = getunopr(ls->t.token); if (uop != OPR_NOUNOPR) { luaX_next(ls); subexpr(ls, v, UNARY_PRIORITY); luaK_prefix(ls->fs, uop, v); } else simpleexp(ls, v); /* expand while operators have priorities higher than `limit' */ op = getbinopr(ls->t.token); while (op != OPR_NOBINOPR && priority[op].left > limit) { expdesc v2; BinOpr nextop; luaX_next(ls); luaK_infix(ls->fs, op, v); /* read sub-expression with higher priority */ nextop = subexpr(ls, &v2, priority[op].right); luaK_posfix(ls->fs, op, v, &v2); op = nextop; } leavelevel(ls); return op; /* return first untreated operator */ } static void expr (LexState *ls, expdesc *v) { subexpr(ls, v, 0); } /* }==================================================================== */ /* ** {====================================================================== ** Rules for Statements ** ======================================================================= */ static int block_follow (int token) { switch (token) { case TK_ELSE: case TK_ELSEIF: case TK_END: case TK_UNTIL: case TK_EOS: return 1; default: return 0; } } static void block (LexState *ls) { /* block -> chunk */ FuncState *fs = ls->fs; BlockCnt bl; enterblock(fs, &bl, 0); chunk(ls); lua_assert(bl.breaklist == NO_JUMP); leaveblock(fs); } /* ** structure to chain all variables in the left-hand side of an ** assignment */ struct LHS_assign { struct LHS_assign *prev; expdesc v; /* variable (global, local, upvalue, or indexed) */ }; /* ** check whether, in an assignment to a local variable, the local variable ** is needed in a previous assignment (to a table). If so, save original ** local value in a safe place and use this safe copy in the previous ** assignment. */ static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { FuncState *fs = ls->fs; int extra = fs->freereg; /* eventual position to save local variable */ int conflict = 0; for (; lh; lh = lh->prev) { if (lh->v.k == VINDEXED) { if (lh->v.u.s.info == v->u.s.info) { /* conflict? */ conflict = 1; lh->v.u.s.info = extra; /* previous assignment will use safe copy */ } if (lh->v.u.s.aux == v->u.s.info) { /* conflict? */ conflict = 1; lh->v.u.s.aux = extra; /* previous assignment will use safe copy */ } } } if (conflict) { luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0); /* make copy */ luaK_reserveregs(fs, 1); } } static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { expdesc e; check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, "syntax error"); if (testnext(ls, ',')) { /* assignment -> `,' primaryexp assignment */ struct LHS_assign nv; nv.prev = lh; primaryexp(ls, &nv.v); if (nv.v.k == VLOCAL) check_conflict(ls, lh, &nv.v); luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls, "variables in assignment"); assignment(ls, &nv, nvars+1); } else { /* assignment -> `=' explist1 */ int nexps; checknext(ls, '='); nexps = explist1(ls, &e); if (nexps != nvars) { adjust_assign(ls, nvars, nexps, &e); if (nexps > nvars) ls->fs->freereg -= nexps - nvars; /* remove extra values */ } else { luaK_setoneret(ls->fs, &e); /* close last expression */ luaK_storevar(ls->fs, &lh->v, &e); return; /* avoid default */ } } init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ luaK_storevar(ls->fs, &lh->v, &e); } static int cond (LexState *ls) { /* cond -> exp */ expdesc v; expr(ls, &v); /* read condition */ if (v.k == VNIL) v.k = VFALSE; /* `falses' are all equal here */ luaK_goiftrue(ls->fs, &v); return v.f; } static void breakstat (LexState *ls) { FuncState *fs = ls->fs; BlockCnt *bl = fs->bl; int upval = 0; while (bl && !bl->isbreakable) { upval |= bl->upval; bl = bl->previous; } if (!bl) luaX_syntaxerror(ls, "no loop to break"); if (upval) luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); } static void whilestat (LexState *ls, int line) { /* whilestat -> WHILE cond DO block END */ FuncState *fs = ls->fs; int whileinit; int condexit; BlockCnt bl; luaX_next(ls); /* skip WHILE */ whileinit = luaK_getlabel(fs); condexit = cond(ls); enterblock(fs, &bl, 1); checknext(ls, TK_DO); block(ls); luaK_patchlist(fs, luaK_jump(fs), whileinit); check_match(ls, TK_END, TK_WHILE, line); leaveblock(fs); luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ } static void repeatstat (LexState *ls, int line) { /* repeatstat -> REPEAT block UNTIL cond */ int condexit; FuncState *fs = ls->fs; int repeat_init = luaK_getlabel(fs); BlockCnt bl1, bl2; enterblock(fs, &bl1, 1); /* loop block */ enterblock(fs, &bl2, 0); /* scope block */ luaX_next(ls); /* skip REPEAT */ chunk(ls); check_match(ls, TK_UNTIL, TK_REPEAT, line); condexit = cond(ls); /* read condition (inside scope block) */ if (!bl2.upval) { /* no upvalues? */ leaveblock(fs); /* finish scope */ luaK_patchlist(ls->fs, condexit, repeat_init); /* close the loop */ } else { /* complete semantics when there are upvalues */ breakstat(ls); /* if condition then break */ luaK_patchtohere(ls->fs, condexit); /* else... */ leaveblock(fs); /* finish scope... */ luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init); /* and repeat */ } leaveblock(fs); /* finish loop */ } static int exp1 (LexState *ls) { expdesc e; int k; expr(ls, &e); k = e.k; luaK_exp2nextreg(ls->fs, &e); return k; } static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { /* forbody -> DO block */ BlockCnt bl; FuncState *fs = ls->fs; int prep, endfor; adjustlocalvars(ls, 3); /* control variables */ checknext(ls, TK_DO); prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs); enterblock(fs, &bl, 0); /* scope for declared variables */ adjustlocalvars(ls, nvars); luaK_reserveregs(fs, nvars); block(ls); leaveblock(fs); /* end of scope for declared variables */ luaK_patchtohere(fs, prep); endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) : luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars); luaK_fixline(fs, line); /* pretend that `OP_FOR' starts the loop */ luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1); } static void fornum (LexState *ls, TString *varname, int line) { /* fornum -> NAME = exp1,exp1[,exp1] forbody */ FuncState *fs = ls->fs; int base = fs->freereg; new_localvarliteral(ls, "(for index)", 0); new_localvarliteral(ls, "(for limit)", 1); new_localvarliteral(ls, "(for step)", 2); new_localvar(ls, varname, 3); checknext(ls, '='); exp1(ls); /* initial value */ checknext(ls, ','); exp1(ls); /* limit */ if (testnext(ls, ',')) exp1(ls); /* optional step */ else { /* default step = 1 */ luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1)); luaK_reserveregs(fs, 1); } forbody(ls, base, line, 1, 1); } static void forlist (LexState *ls, TString *indexname) { /* forlist -> NAME {,NAME} IN explist1 forbody */ FuncState *fs = ls->fs; expdesc e; int nvars = 0; int line; int base = fs->freereg; /* create control variables */ new_localvarliteral(ls, "(for generator)", nvars++); new_localvarliteral(ls, "(for state)", nvars++); new_localvarliteral(ls, "(for control)", nvars++); /* create declared variables */ new_localvar(ls, indexname, nvars++); while (testnext(ls, ',')) new_localvar(ls, str_checkname(ls), nvars++); checknext(ls, TK_IN); line = ls->linenumber; adjust_assign(ls, 3, explist1(ls, &e), &e); luaK_checkstack(fs, 3); /* extra space to call generator */ forbody(ls, base, line, nvars - 3, 0); } static void forstat (LexState *ls, int line) { /* forstat -> FOR (fornum | forlist) END */ FuncState *fs = ls->fs; TString *varname; BlockCnt bl; enterblock(fs, &bl, 1); /* scope for loop and control variables */ luaX_next(ls); /* skip `for' */ varname = str_checkname(ls); /* first variable name */ switch (ls->t.token) { case '=': fornum(ls, varname, line); break; case ',': case TK_IN: forlist(ls, varname); break; default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); } check_match(ls, TK_END, TK_FOR, line); leaveblock(fs); /* loop scope (`break' jumps to this point) */ } static int test_then_block (LexState *ls) { /* test_then_block -> [IF | ELSEIF] cond THEN block */ int condexit; luaX_next(ls); /* skip IF or ELSEIF */ condexit = cond(ls); checknext(ls, TK_THEN); block(ls); /* `then' part */ return condexit; } static void ifstat (LexState *ls, int line) { /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ FuncState *fs = ls->fs; int flist; int escapelist = NO_JUMP; flist = test_then_block(ls); /* IF cond THEN block */ while (ls->t.token == TK_ELSEIF) { luaK_concat(fs, &escapelist, luaK_jump(fs)); luaK_patchtohere(fs, flist); flist = test_then_block(ls); /* ELSEIF cond THEN block */ } if (ls->t.token == TK_ELSE) { luaK_concat(fs, &escapelist, luaK_jump(fs)); luaK_patchtohere(fs, flist); luaX_next(ls); /* skip ELSE (after patch, for correct line info) */ block(ls); /* `else' part */ } else luaK_concat(fs, &escapelist, flist); luaK_patchtohere(fs, escapelist); check_match(ls, TK_END, TK_IF, line); } static void localfunc (LexState *ls) { expdesc v, b; FuncState *fs = ls->fs; new_localvar(ls, str_checkname(ls), 0); init_exp(&v, VLOCAL, fs->freereg); luaK_reserveregs(fs, 1); adjustlocalvars(ls, 1); body(ls, &b, 0, ls->linenumber); luaK_storevar(fs, &v, &b); /* debug information will only see the variable after this point! */ getlocvar(fs, fs->nactvar - 1).startpc = fs->pc; } static void localstat (LexState *ls) { /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */ int nvars = 0; int nexps; expdesc e; do { new_localvar(ls, str_checkname(ls), nvars++); } while (testnext(ls, ',')); if (testnext(ls, '=')) nexps = explist1(ls, &e); else { e.k = VVOID; nexps = 0; } adjust_assign(ls, nvars, nexps, &e); adjustlocalvars(ls, nvars); } static int funcname (LexState *ls, expdesc *v) { /* funcname -> NAME {field} [`:' NAME] */ int needself = 0; singlevar(ls, v); while (ls->t.token == '.') field(ls, v); if (ls->t.token == ':') { needself = 1; field(ls, v); } return needself; } static void funcstat (LexState *ls, int line) { /* funcstat -> FUNCTION funcname body */ int needself; expdesc v, b; luaX_next(ls); /* skip FUNCTION */ needself = funcname(ls, &v); body(ls, &b, needself, line); luaK_storevar(ls->fs, &v, &b); luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ } static void exprstat (LexState *ls) { /* stat -> func | assignment */ FuncState *fs = ls->fs; struct LHS_assign v; primaryexp(ls, &v.v); if (v.v.k == VCALL) /* stat -> func */ SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */ else { /* stat -> assignment */ v.prev = NULL; assignment(ls, &v, 1); } } static void retstat (LexState *ls) { /* stat -> RETURN explist */ FuncState *fs = ls->fs; expdesc e; int first, nret; /* registers with returned values */ luaX_next(ls); /* skip RETURN */ if (block_follow(ls->t.token) || ls->t.token == ';') first = nret = 0; /* return no values */ else { nret = explist1(ls, &e); /* optional return values */ if (hasmultret(e.k)) { luaK_setmultret(fs, &e); if (e.k == VCALL && nret == 1) { /* tail call? */ SET_OPCODE(getcode(fs,&e), OP_TAILCALL); lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); } first = fs->nactvar; nret = LUA_MULTRET; /* return all values */ } else { if (nret == 1) /* only one single value? */ first = luaK_exp2anyreg(fs, &e); else { luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ first = fs->nactvar; /* return all `active' values */ lua_assert(nret == fs->freereg - first); } } } luaK_ret(fs, first, nret); } static int statement (LexState *ls) { int line = ls->linenumber; /* may be needed for error messages */ switch (ls->t.token) { case TK_IF: { /* stat -> ifstat */ ifstat(ls, line); return 0; } case TK_WHILE: { /* stat -> whilestat */ whilestat(ls, line); return 0; } case TK_DO: { /* stat -> DO block END */ luaX_next(ls); /* skip DO */ block(ls); check_match(ls, TK_END, TK_DO, line); return 0; } case TK_FOR: { /* stat -> forstat */ forstat(ls, line); return 0; } case TK_REPEAT: { /* stat -> repeatstat */ repeatstat(ls, line); return 0; } case TK_FUNCTION: { funcstat(ls, line); /* stat -> funcstat */ return 0; } case TK_LOCAL: { /* stat -> localstat */ luaX_next(ls); /* skip LOCAL */ if (testnext(ls, TK_FUNCTION)) /* local function? */ localfunc(ls); else localstat(ls); return 0; } case TK_RETURN: { /* stat -> retstat */ retstat(ls); return 1; /* must be last statement */ } case TK_BREAK: { /* stat -> breakstat */ luaX_next(ls); /* skip BREAK */ breakstat(ls); return 1; /* must be last statement */ } default: { exprstat(ls); return 0; /* to avoid warnings */ } } } static void chunk (LexState *ls) { /* chunk -> { stat [`;'] } */ int islast = 0; enterlevel(ls); while (!islast && !block_follow(ls->t.token)) { islast = statement(ls); testnext(ls, ';'); lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && ls->fs->freereg >= ls->fs->nactvar); ls->fs->freereg = ls->fs->nactvar; /* free registers */ } leavelevel(ls); } /* }====================================================================== */ premake-3.7.orig/Src/Lua/lgc.h0000644000000000000000000000612711043456337013036 0ustar /* ** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */ #ifndef lgc_h #define lgc_h #include "lobject.h" /* ** Possible states of the Garbage Collector */ #define GCSpause 0 #define GCSpropagate 1 #define GCSsweepstring 2 #define GCSsweep 3 #define GCSfinalize 4 /* ** some userful bit tricks */ #define resetbits(x,m) ((x) &= cast(lu_byte, ~(m))) #define setbits(x,m) ((x) |= (m)) #define testbits(x,m) ((x) & (m)) #define bitmask(b) (1<<(b)) #define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) #define l_setbit(x,b) setbits(x, bitmask(b)) #define resetbit(x,b) resetbits(x, bitmask(b)) #define testbit(x,b) testbits(x, bitmask(b)) #define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2))) #define reset2bits(x,b1,b2) resetbits(x, (bit2mask(b1, b2))) #define test2bits(x,b1,b2) testbits(x, (bit2mask(b1, b2))) /* ** Layout for bit use in `marked' field: ** bit 0 - object is white (type 0) ** bit 1 - object is white (type 1) ** bit 2 - object is black ** bit 3 - for userdata: has been finalized ** bit 3 - for tables: has weak keys ** bit 4 - for tables: has weak values ** bit 5 - object is fixed (should not be collected) ** bit 6 - object is "super" fixed (only the main thread) */ #define WHITE0BIT 0 #define WHITE1BIT 1 #define BLACKBIT 2 #define FINALIZEDBIT 3 #define KEYWEAKBIT 3 #define VALUEWEAKBIT 4 #define FIXEDBIT 5 #define SFIXEDBIT 6 #define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) #define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) #define isblack(x) testbit((x)->gch.marked, BLACKBIT) #define isgray(x) (!isblack(x) && !iswhite(x)) #define otherwhite(g) (g->currentwhite ^ WHITEBITS) #define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) #define changewhite(x) ((x)->gch.marked ^= WHITEBITS) #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) #define luaC_checkGC(L) { \ condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \ if (G(L)->totalbytes >= G(L)->GCthreshold) \ luaC_step(L); } #define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ luaC_barrierf(L,obj2gco(p),gcvalue(v)); } #define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t))) \ luaC_barrierback(L,t); } #define luaC_objbarrier(L,p,o) \ { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ luaC_barrierf(L,obj2gco(p),obj2gco(o)); } #define luaC_objbarriert(L,t,o) \ { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); } LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all); LUAI_FUNC void luaC_callGCTM (lua_State *L); LUAI_FUNC void luaC_freeall (lua_State *L); LUAI_FUNC void luaC_step (lua_State *L); LUAI_FUNC void luaC_fullgc (lua_State *L); LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt); LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv); LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t); #endif premake-3.7.orig/Src/Lua/lvm.h0000644000000000000000000000220711043456337013062 0ustar /* ** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */ #ifndef lvm_h #define lvm_h #include "ldo.h" #include "lobject.h" #include "ltm.h" #define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o))) #define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \ (((o) = luaV_tonumber(o,n)) != NULL)) #define equalobj(L,o1,o2) \ (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2); LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n); LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val); LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val); LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls); LUAI_FUNC void luaV_concat (lua_State *L, int total, int last); #endif premake-3.7.orig/Src/Lua/lauxlib.c0000644000000000000000000004201111043456337013714 0ustar /* ** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ #include #include #include #include #include #include /* This file uses only the official API of Lua. ** Any function declared here could be written as an application function. */ #define lauxlib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #define FREELIST_REF 0 /* free list of references */ /* convert a stack index to positive */ #define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ lua_gettop(L) + (i) + 1) /* ** {====================================================== ** Error-report functions ** ======================================================= */ LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) { lua_Debug ar; if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ return luaL_error(L, "bad argument #%d (%s)", narg, extramsg); lua_getinfo(L, "n", &ar); if (strcmp(ar.namewhat, "method") == 0) { narg--; /* do not count `self' */ if (narg == 0) /* error is in the self argument itself? */ return luaL_error(L, "calling " LUA_QS " on bad self (%s)", ar.name, extramsg); } if (ar.name == NULL) ar.name = "?"; return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)", narg, ar.name, extramsg); } LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) { const char *msg = lua_pushfstring(L, "%s expected, got %s", tname, luaL_typename(L, narg)); return luaL_argerror(L, narg, msg); } static void tag_error (lua_State *L, int narg, int tag) { luaL_typerror(L, narg, lua_typename(L, tag)); } LUALIB_API void luaL_where (lua_State *L, int level) { lua_Debug ar; if (lua_getstack(L, level, &ar)) { /* check function at level */ lua_getinfo(L, "Sl", &ar); /* get info about it */ if (ar.currentline > 0) { /* is there info? */ lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); return; } } lua_pushliteral(L, ""); /* else, no information available... */ } LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); luaL_where(L, 1); lua_pushvfstring(L, fmt, argp); va_end(argp); lua_concat(L, 2); return lua_error(L); } /* }====================================================== */ LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def, const char *const lst[]) { const char *name = (def) ? luaL_optstring(L, narg, def) : luaL_checkstring(L, narg); int i; for (i=0; lst[i]; i++) if (strcmp(lst[i], name) == 0) return i; return luaL_argerror(L, narg, lua_pushfstring(L, "invalid option " LUA_QS, name)); } LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get registry.name */ if (!lua_isnil(L, -1)) /* name already in use? */ return 0; /* leave previous value on top, but return 0 */ lua_pop(L, 1); lua_newtable(L); /* create metatable */ lua_pushvalue(L, -1); lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ return 1; } LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { void *p = lua_touserdata(L, ud); if (p != NULL) { /* value is a userdata? */ if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ lua_pop(L, 2); /* remove both metatables */ return p; } } } luaL_typerror(L, ud, tname); /* else error */ return NULL; /* to avoid warnings */ } LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { if (!lua_checkstack(L, space)) luaL_error(L, "stack overflow (%s)", mes); } LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) { if (lua_type(L, narg) != t) tag_error(L, narg, t); } LUALIB_API void luaL_checkany (lua_State *L, int narg) { if (lua_type(L, narg) == LUA_TNONE) luaL_argerror(L, narg, "value expected"); } LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) { const char *s = lua_tolstring(L, narg, len); if (!s) tag_error(L, narg, LUA_TSTRING); return s; } LUALIB_API const char *luaL_optlstring (lua_State *L, int narg, const char *def, size_t *len) { if (lua_isnoneornil(L, narg)) { if (len) *len = (def ? strlen(def) : 0); return def; } else return luaL_checklstring(L, narg, len); } LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) { lua_Number d = lua_tonumber(L, narg); if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ tag_error(L, narg, LUA_TNUMBER); return d; } LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) { return luaL_opt(L, luaL_checknumber, narg, def); } LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) { lua_Integer d = lua_tointeger(L, narg); if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ tag_error(L, narg, LUA_TNUMBER); return d; } LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg, lua_Integer def) { return luaL_opt(L, luaL_checkinteger, narg, def); } LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { if (!lua_getmetatable(L, obj)) /* no metatable? */ return 0; lua_pushstring(L, event); lua_rawget(L, -2); if (lua_isnil(L, -1)) { lua_pop(L, 2); /* remove metatable and metafield */ return 0; } else { lua_remove(L, -2); /* remove only metatable */ return 1; } } LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { obj = abs_index(L, obj); if (!luaL_getmetafield(L, obj, event)) /* no metafield? */ return 0; lua_pushvalue(L, obj); lua_call(L, 1, 1); return 1; } LUALIB_API void (luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l) { luaI_openlib(L, libname, l, 0); } static int libsize (const luaL_Reg *l) { int size = 0; for (; l->name; l++) size++; return size; } LUALIB_API void luaI_openlib (lua_State *L, const char *libname, const luaL_Reg *l, int nup) { if (libname) { int size = libsize(l); /* check whether lib already exists */ luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); lua_getfield(L, -1, libname); /* get _LOADED[libname] */ if (!lua_istable(L, -1)) { /* not found? */ lua_pop(L, 1); /* remove previous result */ /* try global variable (and create one if it does not exist) */ if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL) luaL_error(L, "name conflict for module " LUA_QS, libname); lua_pushvalue(L, -1); lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */ } lua_remove(L, -2); /* remove _LOADED table */ lua_insert(L, -(nup+1)); /* move library table to below upvalues */ } for (; l->name; l++) { int i; for (i=0; ifunc, nup); lua_setfield(L, -(nup+2), l->name); } lua_pop(L, nup); /* remove upvalues */ } /* ** {====================================================== ** getn-setn: size for arrays ** ======================================================= */ #if defined(LUA_COMPAT_GETN) static int checkint (lua_State *L, int topop) { int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1; lua_pop(L, topop); return n; } static void getsizes (lua_State *L) { lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); if (lua_isnil(L, -1)) { /* no `size' table? */ lua_pop(L, 1); /* remove nil */ lua_newtable(L); /* create it */ lua_pushvalue(L, -1); /* `size' will be its own metatable */ lua_setmetatable(L, -2); lua_pushliteral(L, "kv"); lua_setfield(L, -2, "__mode"); /* metatable(N).__mode = "kv" */ lua_pushvalue(L, -1); lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); /* store in register */ } } LUALIB_API void luaL_setn (lua_State *L, int t, int n) { t = abs_index(L, t); lua_pushliteral(L, "n"); lua_rawget(L, t); if (checkint(L, 1) >= 0) { /* is there a numeric field `n'? */ lua_pushliteral(L, "n"); /* use it */ lua_pushinteger(L, n); lua_rawset(L, t); } else { /* use `sizes' */ getsizes(L); lua_pushvalue(L, t); lua_pushinteger(L, n); lua_rawset(L, -3); /* sizes[t] = n */ lua_pop(L, 1); /* remove `sizes' */ } } LUALIB_API int luaL_getn (lua_State *L, int t) { int n; t = abs_index(L, t); lua_pushliteral(L, "n"); /* try t.n */ lua_rawget(L, t); if ((n = checkint(L, 1)) >= 0) return n; getsizes(L); /* else try sizes[t] */ lua_pushvalue(L, t); lua_rawget(L, -2); if ((n = checkint(L, 2)) >= 0) return n; return (int)lua_objlen(L, t); } #endif /* }====================================================== */ LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, const char *r) { const char *wild; size_t l = strlen(p); luaL_Buffer b; luaL_buffinit(L, &b); while ((wild = strstr(s, p)) != NULL) { luaL_addlstring(&b, s, wild - s); /* push prefix */ luaL_addstring(&b, r); /* push replacement in place of pattern */ s = wild + l; /* continue after `p' */ } luaL_addstring(&b, s); /* push last suffix */ luaL_pushresult(&b); return lua_tostring(L, -1); } LUALIB_API const char *luaL_findtable (lua_State *L, int idx, const char *fname, int szhint) { const char *e; lua_pushvalue(L, idx); do { e = strchr(fname, '.'); if (e == NULL) e = fname + strlen(fname); lua_pushlstring(L, fname, e - fname); lua_rawget(L, -2); if (lua_isnil(L, -1)) { /* no such field? */ lua_pop(L, 1); /* remove this nil */ lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ lua_pushlstring(L, fname, e - fname); lua_pushvalue(L, -2); lua_settable(L, -4); /* set new table into field */ } else if (!lua_istable(L, -1)) { /* field has a non-table value? */ lua_pop(L, 2); /* remove table and value */ return fname; /* return problematic part of the name */ } lua_remove(L, -2); /* remove previous table */ fname = e + 1; } while (*e == '.'); return NULL; } /* ** {====================================================== ** Generic Buffer manipulation ** ======================================================= */ #define bufflen(B) ((B)->p - (B)->buffer) #define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) #define LIMIT (LUA_MINSTACK/2) static int emptybuffer (luaL_Buffer *B) { size_t l = bufflen(B); if (l == 0) return 0; /* put nothing on stack */ else { lua_pushlstring(B->L, B->buffer, l); B->p = B->buffer; B->lvl++; return 1; } } static void adjuststack (luaL_Buffer *B) { if (B->lvl > 1) { lua_State *L = B->L; int toget = 1; /* number of levels to concat */ size_t toplen = lua_strlen(L, -1); do { size_t l = lua_strlen(L, -(toget+1)); if (B->lvl - toget + 1 >= LIMIT || toplen > l) { toplen += l; toget++; } else break; } while (toget < B->lvl); lua_concat(L, toget); B->lvl = B->lvl - toget + 1; } } LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { if (emptybuffer(B)) adjuststack(B); return B->buffer; } LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { while (l--) luaL_addchar(B, *s++); } LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { luaL_addlstring(B, s, strlen(s)); } LUALIB_API void luaL_pushresult (luaL_Buffer *B) { emptybuffer(B); lua_concat(B->L, B->lvl); B->lvl = 1; } LUALIB_API void luaL_addvalue (luaL_Buffer *B) { lua_State *L = B->L; size_t vl; const char *s = lua_tolstring(L, -1, &vl); if (vl <= bufffree(B)) { /* fit into buffer? */ memcpy(B->p, s, vl); /* put it there */ B->p += vl; lua_pop(L, 1); /* remove from stack */ } else { if (emptybuffer(B)) lua_insert(L, -2); /* put buffer before new value */ B->lvl++; /* add new value into B stack */ adjuststack(B); } } LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { B->L = L; B->p = B->buffer; B->lvl = 0; } /* }====================================================== */ LUALIB_API int luaL_ref (lua_State *L, int t) { int ref; t = abs_index(L, t); if (lua_isnil(L, -1)) { lua_pop(L, 1); /* remove from stack */ return LUA_REFNIL; /* `nil' has a unique fixed reference */ } lua_rawgeti(L, t, FREELIST_REF); /* get first free element */ ref = (int)lua_tointeger(L, -1); /* ref = t[FREELIST_REF] */ lua_pop(L, 1); /* remove it from stack */ if (ref != 0) { /* any free element? */ lua_rawgeti(L, t, ref); /* remove it from list */ lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ } else { /* no free elements */ ref = (int)lua_objlen(L, t); ref++; /* create new reference */ } lua_rawseti(L, t, ref); return ref; } LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { if (ref >= 0) { t = abs_index(L, t); lua_rawgeti(L, t, FREELIST_REF); lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */ lua_pushinteger(L, ref); lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */ } } /* ** {====================================================== ** Load functions ** ======================================================= */ typedef struct LoadF { int extraline; FILE *f; char buff[LUAL_BUFFERSIZE]; } LoadF; static const char *getF (lua_State *L, void *ud, size_t *size) { LoadF *lf = (LoadF *)ud; (void)L; if (lf->extraline) { lf->extraline = 0; *size = 1; return "\n"; } if (feof(lf->f)) return NULL; *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); return (*size > 0) ? lf->buff : NULL; } static int errfile (lua_State *L, const char *what, int fnameindex) { const char *serr = strerror(errno); const char *filename = lua_tostring(L, fnameindex) + 1; lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); lua_remove(L, fnameindex); return LUA_ERRFILE; } LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { LoadF lf; int status, readstatus; int c; int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ lf.extraline = 0; if (filename == NULL) { lua_pushliteral(L, "=stdin"); lf.f = stdin; } else { lua_pushfstring(L, "@%s", filename); lf.f = fopen(filename, "r"); if (lf.f == NULL) return errfile(L, "open", fnameindex); } c = getc(lf.f); if (c == '#') { /* Unix exec. file? */ lf.extraline = 1; while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ if (c == '\n') c = getc(lf.f); } if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ if (lf.f == NULL) return errfile(L, "reopen", fnameindex); /* skip eventual `#!...' */ while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; lf.extraline = 0; } ungetc(c, lf.f); status = lua_load(L, getF, &lf, lua_tostring(L, -1)); readstatus = ferror(lf.f); if (filename) fclose(lf.f); /* close file (even in case of errors) */ if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ return errfile(L, "read", fnameindex); } lua_remove(L, fnameindex); return status; } typedef struct LoadS { const char *s; size_t size; } LoadS; static const char *getS (lua_State *L, void *ud, size_t *size) { LoadS *ls = (LoadS *)ud; (void)L; if (ls->size == 0) return NULL; *size = ls->size; ls->size = 0; return ls->s; } LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size, const char *name) { LoadS ls; ls.s = buff; ls.size = size; return lua_load(L, getS, &ls, name); } LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) { return luaL_loadbuffer(L, s, strlen(s), s); } /* }====================================================== */ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { (void)ud; (void)osize; if (nsize == 0) { free(ptr); return NULL; } else return realloc(ptr, nsize); } static int panic (lua_State *L) { (void)L; /* to avoid warnings */ fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", lua_tostring(L, -1)); return 0; } LUALIB_API lua_State *luaL_newstate (void) { lua_State *L = lua_newstate(l_alloc, NULL); if (L) lua_atpanic(L, &panic); return L; } premake-3.7.orig/Src/Lua/lapi.h0000644000000000000000000000040611043456337013210 0ustar /* ** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions from Lua API ** See Copyright Notice in lua.h */ #ifndef lapi_h #define lapi_h #include "lobject.h" LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o); #endif premake-3.7.orig/Src/Lua/lapi.c0000644000000000000000000005415311043456337013213 0ustar /* ** $Id: lapi.c,v 2.55.1.3 2008/01/03 15:20:39 roberto Exp $ ** Lua API ** See Copyright Notice in lua.h */ #include #include #include #include #define lapi_c #define LUA_CORE #include "lua.h" #include "lapi.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lundump.h" #include "lvm.h" const char lua_ident[] = "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n" "$Authors: " LUA_AUTHORS " $\n" "$URL: www.lua.org $\n"; #define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) #define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject) #define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;} static TValue *index2adr (lua_State *L, int idx) { if (idx > 0) { TValue *o = L->base + (idx - 1); api_check(L, idx <= L->ci->top - L->base); if (o >= L->top) return cast(TValue *, luaO_nilobject); else return o; } else if (idx > LUA_REGISTRYINDEX) { api_check(L, idx != 0 && -idx <= L->top - L->base); return L->top + idx; } else switch (idx) { /* pseudo-indices */ case LUA_REGISTRYINDEX: return registry(L); case LUA_ENVIRONINDEX: { Closure *func = curr_func(L); sethvalue(L, &L->env, func->c.env); return &L->env; } case LUA_GLOBALSINDEX: return gt(L); default: { Closure *func = curr_func(L); idx = LUA_GLOBALSINDEX - idx; return (idx <= func->c.nupvalues) ? &func->c.upvalue[idx-1] : cast(TValue *, luaO_nilobject); } } } static Table *getcurrenv (lua_State *L) { if (L->ci == L->base_ci) /* no enclosing function? */ return hvalue(gt(L)); /* use global table as environment */ else { Closure *func = curr_func(L); return func->c.env; } } void luaA_pushobject (lua_State *L, const TValue *o) { setobj2s(L, L->top, o); api_incr_top(L); } LUA_API int lua_checkstack (lua_State *L, int size) { int res; lua_lock(L); if ((L->top - L->base + size) > LUAI_MAXCSTACK) res = 0; /* stack overflow */ else { luaD_checkstack(L, size); if (L->ci->top < L->top + size) L->ci->top = L->top + size; res = 1; } lua_unlock(L); return res; } LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { int i; if (from == to) return; lua_lock(to); api_checknelems(from, n); api_check(from, G(from) == G(to)); api_check(from, to->ci->top - to->top >= n); from->top -= n; for (i = 0; i < n; i++) { setobj2s(to, to->top++, from->top + i); } lua_unlock(to); } LUA_API void lua_setlevel (lua_State *from, lua_State *to) { to->nCcalls = from->nCcalls; } LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { lua_CFunction old; lua_lock(L); old = G(L)->panic; G(L)->panic = panicf; lua_unlock(L); return old; } LUA_API lua_State *lua_newthread (lua_State *L) { lua_State *L1; lua_lock(L); luaC_checkGC(L); L1 = luaE_newthread(L); setthvalue(L, L->top, L1); api_incr_top(L); lua_unlock(L); luai_userstatethread(L, L1); return L1; } /* ** basic stack manipulation */ LUA_API int lua_gettop (lua_State *L) { return cast_int(L->top - L->base); } LUA_API void lua_settop (lua_State *L, int idx) { lua_lock(L); if (idx >= 0) { api_check(L, idx <= L->stack_last - L->base); while (L->top < L->base + idx) setnilvalue(L->top++); L->top = L->base + idx; } else { api_check(L, -(idx+1) <= (L->top - L->base)); L->top += idx+1; /* `subtract' index (index is negative) */ } lua_unlock(L); } LUA_API void lua_remove (lua_State *L, int idx) { StkId p; lua_lock(L); p = index2adr(L, idx); api_checkvalidindex(L, p); while (++p < L->top) setobjs2s(L, p-1, p); L->top--; lua_unlock(L); } LUA_API void lua_insert (lua_State *L, int idx) { StkId p; StkId q; lua_lock(L); p = index2adr(L, idx); api_checkvalidindex(L, p); for (q = L->top; q>p; q--) setobjs2s(L, q, q-1); setobjs2s(L, p, L->top); lua_unlock(L); } LUA_API void lua_replace (lua_State *L, int idx) { StkId o; lua_lock(L); /* explicit test for incompatible code */ if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci) luaG_runerror(L, "no calling environment"); api_checknelems(L, 1); o = index2adr(L, idx); api_checkvalidindex(L, o); if (idx == LUA_ENVIRONINDEX) { Closure *func = curr_func(L); api_check(L, ttistable(L->top - 1)); func->c.env = hvalue(L->top - 1); luaC_barrier(L, func, L->top - 1); } else { setobj(L, o, L->top - 1); if (idx < LUA_GLOBALSINDEX) /* function upvalue? */ luaC_barrier(L, curr_func(L), L->top - 1); } L->top--; lua_unlock(L); } LUA_API void lua_pushvalue (lua_State *L, int idx) { lua_lock(L); setobj2s(L, L->top, index2adr(L, idx)); api_incr_top(L); lua_unlock(L); } /* ** access functions (stack -> C) */ LUA_API int lua_type (lua_State *L, int idx) { StkId o = index2adr(L, idx); return (o == luaO_nilobject) ? LUA_TNONE : ttype(o); } LUA_API const char *lua_typename (lua_State *L, int t) { UNUSED(L); return (t == LUA_TNONE) ? "no value" : luaT_typenames[t]; } LUA_API int lua_iscfunction (lua_State *L, int idx) { StkId o = index2adr(L, idx); return iscfunction(o); } LUA_API int lua_isnumber (lua_State *L, int idx) { TValue n; const TValue *o = index2adr(L, idx); return tonumber(o, &n); } LUA_API int lua_isstring (lua_State *L, int idx) { int t = lua_type(L, idx); return (t == LUA_TSTRING || t == LUA_TNUMBER); } LUA_API int lua_isuserdata (lua_State *L, int idx) { const TValue *o = index2adr(L, idx); return (ttisuserdata(o) || ttislightuserdata(o)); } LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { StkId o1 = index2adr(L, index1); StkId o2 = index2adr(L, index2); return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : luaO_rawequalObj(o1, o2); } LUA_API int lua_equal (lua_State *L, int index1, int index2) { StkId o1, o2; int i; lua_lock(L); /* may call tag method */ o1 = index2adr(L, index1); o2 = index2adr(L, index2); i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2); lua_unlock(L); return i; } LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { StkId o1, o2; int i; lua_lock(L); /* may call tag method */ o1 = index2adr(L, index1); o2 = index2adr(L, index2); i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : luaV_lessthan(L, o1, o2); lua_unlock(L); return i; } LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { TValue n; const TValue *o = index2adr(L, idx); if (tonumber(o, &n)) return nvalue(o); else return 0; } LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { TValue n; const TValue *o = index2adr(L, idx); if (tonumber(o, &n)) { lua_Integer res; lua_Number num = nvalue(o); lua_number2integer(res, num); return res; } else return 0; } LUA_API int lua_toboolean (lua_State *L, int idx) { const TValue *o = index2adr(L, idx); return !l_isfalse(o); } LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { StkId o = index2adr(L, idx); if (!ttisstring(o)) { lua_lock(L); /* `luaV_tostring' may create a new string */ if (!luaV_tostring(L, o)) { /* conversion failed? */ if (len != NULL) *len = 0; lua_unlock(L); return NULL; } luaC_checkGC(L); o = index2adr(L, idx); /* previous call may reallocate the stack */ lua_unlock(L); } if (len != NULL) *len = tsvalue(o)->len; return svalue(o); } LUA_API size_t lua_objlen (lua_State *L, int idx) { StkId o = index2adr(L, idx); switch (ttype(o)) { case LUA_TSTRING: return tsvalue(o)->len; case LUA_TUSERDATA: return uvalue(o)->len; case LUA_TTABLE: return luaH_getn(hvalue(o)); case LUA_TNUMBER: { size_t l; lua_lock(L); /* `luaV_tostring' may create a new string */ l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0); lua_unlock(L); return l; } default: return 0; } } LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { StkId o = index2adr(L, idx); return (!iscfunction(o)) ? NULL : clvalue(o)->c.f; } LUA_API void *lua_touserdata (lua_State *L, int idx) { StkId o = index2adr(L, idx); switch (ttype(o)) { case LUA_TUSERDATA: return (rawuvalue(o) + 1); case LUA_TLIGHTUSERDATA: return pvalue(o); default: return NULL; } } LUA_API lua_State *lua_tothread (lua_State *L, int idx) { StkId o = index2adr(L, idx); return (!ttisthread(o)) ? NULL : thvalue(o); } LUA_API const void *lua_topointer (lua_State *L, int idx) { StkId o = index2adr(L, idx); switch (ttype(o)) { case LUA_TTABLE: return hvalue(o); case LUA_TFUNCTION: return clvalue(o); case LUA_TTHREAD: return thvalue(o); case LUA_TUSERDATA: case LUA_TLIGHTUSERDATA: return lua_touserdata(L, idx); default: return NULL; } } /* ** push functions (C -> stack) */ LUA_API void lua_pushnil (lua_State *L) { lua_lock(L); setnilvalue(L->top); api_incr_top(L); lua_unlock(L); } LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { lua_lock(L); setnvalue(L->top, n); api_incr_top(L); lua_unlock(L); } LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { lua_lock(L); setnvalue(L->top, cast_num(n)); api_incr_top(L); lua_unlock(L); } LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { lua_lock(L); luaC_checkGC(L); setsvalue2s(L, L->top, luaS_newlstr(L, s, len)); api_incr_top(L); lua_unlock(L); } LUA_API void lua_pushstring (lua_State *L, const char *s) { if (s == NULL) lua_pushnil(L); else lua_pushlstring(L, s, strlen(s)); } LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, va_list argp) { const char *ret; lua_lock(L); luaC_checkGC(L); ret = luaO_pushvfstring(L, fmt, argp); lua_unlock(L); return ret; } LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { const char *ret; va_list argp; lua_lock(L); luaC_checkGC(L); va_start(argp, fmt); ret = luaO_pushvfstring(L, fmt, argp); va_end(argp); lua_unlock(L); return ret; } LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { Closure *cl; lua_lock(L); luaC_checkGC(L); api_checknelems(L, n); cl = luaF_newCclosure(L, n, getcurrenv(L)); cl->c.f = fn; L->top -= n; while (n--) setobj2n(L, &cl->c.upvalue[n], L->top+n); setclvalue(L, L->top, cl); lua_assert(iswhite(obj2gco(cl))); api_incr_top(L); lua_unlock(L); } LUA_API void lua_pushboolean (lua_State *L, int b) { lua_lock(L); setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ api_incr_top(L); lua_unlock(L); } LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { lua_lock(L); setpvalue(L->top, p); api_incr_top(L); lua_unlock(L); } LUA_API int lua_pushthread (lua_State *L) { lua_lock(L); setthvalue(L, L->top, L); api_incr_top(L); lua_unlock(L); return (G(L)->mainthread == L); } /* ** get functions (Lua -> stack) */ LUA_API void lua_gettable (lua_State *L, int idx) { StkId t; lua_lock(L); t = index2adr(L, idx); api_checkvalidindex(L, t); luaV_gettable(L, t, L->top - 1, L->top - 1); lua_unlock(L); } LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { StkId t; TValue key; lua_lock(L); t = index2adr(L, idx); api_checkvalidindex(L, t); setsvalue(L, &key, luaS_new(L, k)); luaV_gettable(L, t, &key, L->top); api_incr_top(L); lua_unlock(L); } LUA_API void lua_rawget (lua_State *L, int idx) { StkId t; lua_lock(L); t = index2adr(L, idx); api_check(L, ttistable(t)); setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); lua_unlock(L); } LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { StkId o; lua_lock(L); o = index2adr(L, idx); api_check(L, ttistable(o)); setobj2s(L, L->top, luaH_getnum(hvalue(o), n)); api_incr_top(L); lua_unlock(L); } LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { lua_lock(L); luaC_checkGC(L); sethvalue(L, L->top, luaH_new(L, narray, nrec)); api_incr_top(L); lua_unlock(L); } LUA_API int lua_getmetatable (lua_State *L, int objindex) { const TValue *obj; Table *mt = NULL; int res; lua_lock(L); obj = index2adr(L, objindex); switch (ttype(obj)) { case LUA_TTABLE: mt = hvalue(obj)->metatable; break; case LUA_TUSERDATA: mt = uvalue(obj)->metatable; break; default: mt = G(L)->mt[ttype(obj)]; break; } if (mt == NULL) res = 0; else { sethvalue(L, L->top, mt); api_incr_top(L); res = 1; } lua_unlock(L); return res; } LUA_API void lua_getfenv (lua_State *L, int idx) { StkId o; lua_lock(L); o = index2adr(L, idx); api_checkvalidindex(L, o); switch (ttype(o)) { case LUA_TFUNCTION: sethvalue(L, L->top, clvalue(o)->c.env); break; case LUA_TUSERDATA: sethvalue(L, L->top, uvalue(o)->env); break; case LUA_TTHREAD: setobj2s(L, L->top, gt(thvalue(o))); break; default: setnilvalue(L->top); break; } api_incr_top(L); lua_unlock(L); } /* ** set functions (stack -> Lua) */ LUA_API void lua_settable (lua_State *L, int idx) { StkId t; lua_lock(L); api_checknelems(L, 2); t = index2adr(L, idx); api_checkvalidindex(L, t); luaV_settable(L, t, L->top - 2, L->top - 1); L->top -= 2; /* pop index and value */ lua_unlock(L); } LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { StkId t; TValue key; lua_lock(L); api_checknelems(L, 1); t = index2adr(L, idx); api_checkvalidindex(L, t); setsvalue(L, &key, luaS_new(L, k)); luaV_settable(L, t, &key, L->top - 1); L->top--; /* pop value */ lua_unlock(L); } LUA_API void lua_rawset (lua_State *L, int idx) { StkId t; lua_lock(L); api_checknelems(L, 2); t = index2adr(L, idx); api_check(L, ttistable(t)); setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); luaC_barriert(L, hvalue(t), L->top-1); L->top -= 2; lua_unlock(L); } LUA_API void lua_rawseti (lua_State *L, int idx, int n) { StkId o; lua_lock(L); api_checknelems(L, 1); o = index2adr(L, idx); api_check(L, ttistable(o)); setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); luaC_barriert(L, hvalue(o), L->top-1); L->top--; lua_unlock(L); } LUA_API int lua_setmetatable (lua_State *L, int objindex) { TValue *obj; Table *mt; lua_lock(L); api_checknelems(L, 1); obj = index2adr(L, objindex); api_checkvalidindex(L, obj); if (ttisnil(L->top - 1)) mt = NULL; else { api_check(L, ttistable(L->top - 1)); mt = hvalue(L->top - 1); } switch (ttype(obj)) { case LUA_TTABLE: { hvalue(obj)->metatable = mt; if (mt) luaC_objbarriert(L, hvalue(obj), mt); break; } case LUA_TUSERDATA: { uvalue(obj)->metatable = mt; if (mt) luaC_objbarrier(L, rawuvalue(obj), mt); break; } default: { G(L)->mt[ttype(obj)] = mt; break; } } L->top--; lua_unlock(L); return 1; } LUA_API int lua_setfenv (lua_State *L, int idx) { StkId o; int res = 1; lua_lock(L); api_checknelems(L, 1); o = index2adr(L, idx); api_checkvalidindex(L, o); api_check(L, ttistable(L->top - 1)); switch (ttype(o)) { case LUA_TFUNCTION: clvalue(o)->c.env = hvalue(L->top - 1); break; case LUA_TUSERDATA: uvalue(o)->env = hvalue(L->top - 1); break; case LUA_TTHREAD: sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1)); break; default: res = 0; break; } if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); L->top--; lua_unlock(L); return res; } /* ** `load' and `call' functions (run Lua code) */ #define adjustresults(L,nres) \ { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; } #define checkresults(L,na,nr) \ api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) LUA_API void lua_call (lua_State *L, int nargs, int nresults) { StkId func; lua_lock(L); api_checknelems(L, nargs+1); checkresults(L, nargs, nresults); func = L->top - (nargs+1); luaD_call(L, func, nresults); adjustresults(L, nresults); lua_unlock(L); } /* ** Execute a protected call. */ struct CallS { /* data to `f_call' */ StkId func; int nresults; }; static void f_call (lua_State *L, void *ud) { struct CallS *c = cast(struct CallS *, ud); luaD_call(L, c->func, c->nresults); } LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { struct CallS c; int status; ptrdiff_t func; lua_lock(L); api_checknelems(L, nargs+1); checkresults(L, nargs, nresults); if (errfunc == 0) func = 0; else { StkId o = index2adr(L, errfunc); api_checkvalidindex(L, o); func = savestack(L, o); } c.func = L->top - (nargs+1); /* function to be called */ c.nresults = nresults; status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); adjustresults(L, nresults); lua_unlock(L); return status; } /* ** Execute a protected C call. */ struct CCallS { /* data to `f_Ccall' */ lua_CFunction func; void *ud; }; static void f_Ccall (lua_State *L, void *ud) { struct CCallS *c = cast(struct CCallS *, ud); Closure *cl; cl = luaF_newCclosure(L, 0, getcurrenv(L)); cl->c.f = c->func; setclvalue(L, L->top, cl); /* push function */ api_incr_top(L); setpvalue(L->top, c->ud); /* push only argument */ api_incr_top(L); luaD_call(L, L->top - 2, 0); } LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { struct CCallS c; int status; lua_lock(L); c.func = func; c.ud = ud; status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); lua_unlock(L); return status; } LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, const char *chunkname) { ZIO z; int status; lua_lock(L); if (!chunkname) chunkname = "?"; luaZ_init(L, &z, reader, data); status = luaD_protectedparser(L, &z, chunkname); lua_unlock(L); return status; } LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) { int status; TValue *o; lua_lock(L); api_checknelems(L, 1); o = L->top - 1; if (isLfunction(o)) status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0); else status = 1; lua_unlock(L); return status; } LUA_API int lua_status (lua_State *L) { return L->status; } /* ** Garbage-collection function */ LUA_API int lua_gc (lua_State *L, int what, int data) { int res = 0; global_State *g; lua_lock(L); g = G(L); switch (what) { case LUA_GCSTOP: { g->GCthreshold = MAX_LUMEM; break; } case LUA_GCRESTART: { g->GCthreshold = g->totalbytes; break; } case LUA_GCCOLLECT: { luaC_fullgc(L); break; } case LUA_GCCOUNT: { /* GC values are expressed in Kbytes: #bytes/2^10 */ res = cast_int(g->totalbytes >> 10); break; } case LUA_GCCOUNTB: { res = cast_int(g->totalbytes & 0x3ff); break; } case LUA_GCSTEP: { lu_mem a = (cast(lu_mem, data) << 10); if (a <= g->totalbytes) g->GCthreshold = g->totalbytes - a; else g->GCthreshold = 0; while (g->GCthreshold <= g->totalbytes) luaC_step(L); if (g->gcstate == GCSpause) /* end of cycle? */ res = 1; /* signal it */ break; } case LUA_GCSETPAUSE: { res = g->gcpause; g->gcpause = data; break; } case LUA_GCSETSTEPMUL: { res = g->gcstepmul; g->gcstepmul = data; break; } default: res = -1; /* invalid option */ } lua_unlock(L); return res; } /* ** miscellaneous functions */ LUA_API int lua_error (lua_State *L) { lua_lock(L); api_checknelems(L, 1); luaG_errormsg(L); lua_unlock(L); return 0; /* to avoid warnings */ } LUA_API int lua_next (lua_State *L, int idx) { StkId t; int more; lua_lock(L); t = index2adr(L, idx); api_check(L, ttistable(t)); more = luaH_next(L, hvalue(t), L->top - 1); if (more) { api_incr_top(L); } else /* no more elements */ L->top -= 1; /* remove key */ lua_unlock(L); return more; } LUA_API void lua_concat (lua_State *L, int n) { lua_lock(L); api_checknelems(L, n); if (n >= 2) { luaC_checkGC(L); luaV_concat(L, n, cast_int(L->top - L->base) - 1); L->top -= (n-1); } else if (n == 0) { /* push empty string */ setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); api_incr_top(L); } /* else n == 1; nothing to do */ lua_unlock(L); } LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { lua_Alloc f; lua_lock(L); if (ud) *ud = G(L)->ud; f = G(L)->frealloc; lua_unlock(L); return f; } LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { lua_lock(L); G(L)->ud = ud; G(L)->frealloc = f; lua_unlock(L); } LUA_API void *lua_newuserdata (lua_State *L, size_t size) { Udata *u; lua_lock(L); luaC_checkGC(L); u = luaS_newudata(L, size, getcurrenv(L)); setuvalue(L, L->top, u); api_incr_top(L); lua_unlock(L); return u + 1; } static const char *aux_upvalue (StkId fi, int n, TValue **val) { Closure *f; if (!ttisfunction(fi)) return NULL; f = clvalue(fi); if (f->c.isC) { if (!(1 <= n && n <= f->c.nupvalues)) return NULL; *val = &f->c.upvalue[n-1]; return ""; } else { Proto *p = f->l.p; if (!(1 <= n && n <= p->sizeupvalues)) return NULL; *val = f->l.upvals[n-1]->v; return getstr(p->upvalues[n-1]); } } LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { const char *name; TValue *val; lua_lock(L); name = aux_upvalue(index2adr(L, funcindex), n, &val); if (name) { setobj2s(L, L->top, val); api_incr_top(L); } lua_unlock(L); return name; } LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { const char *name; TValue *val; StkId fi; lua_lock(L); fi = index2adr(L, funcindex); api_checknelems(L, 1); name = aux_upvalue(fi, n, &val); if (name) { L->top--; setobj(L, val, L->top); luaC_barrier(L, clvalue(fi), L->top); } lua_unlock(L); return name; } premake-3.7.orig/Src/Lua/liolib.c0000644000000000000000000003213611043456337013535 0ustar /* ** $Id: liolib.c,v 2.73.1.3 2008/01/18 17:47:43 roberto Exp $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */ #include #include #include #include #define liolib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" #define IO_INPUT 1 #define IO_OUTPUT 2 static const char *const fnames[] = {"input", "output"}; static int pushresult (lua_State *L, int i, const char *filename) { int en = errno; /* calls to Lua API may change this value */ if (i) { lua_pushboolean(L, 1); return 1; } else { lua_pushnil(L); if (filename) lua_pushfstring(L, "%s: %s", filename, strerror(en)); else lua_pushfstring(L, "%s", strerror(en)); lua_pushinteger(L, en); return 3; } } static void fileerror (lua_State *L, int arg, const char *filename) { lua_pushfstring(L, "%s: %s", filename, strerror(errno)); luaL_argerror(L, arg, lua_tostring(L, -1)); } #define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) static int io_type (lua_State *L) { void *ud; luaL_checkany(L, 1); ud = lua_touserdata(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1)) lua_pushnil(L); /* not a file */ else if (*((FILE **)ud) == NULL) lua_pushliteral(L, "closed file"); else lua_pushliteral(L, "file"); return 1; } static FILE *tofile (lua_State *L) { FILE **f = tofilep(L); if (*f == NULL) luaL_error(L, "attempt to use a closed file"); return *f; } /* ** When creating file handles, always creates a `closed' file handle ** before opening the actual file; so, if there is a memory error, the ** file is not left opened. */ static FILE **newfile (lua_State *L) { FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); *pf = NULL; /* file handle is currently `closed' */ luaL_getmetatable(L, LUA_FILEHANDLE); lua_setmetatable(L, -2); return pf; } /* ** function to (not) close the standard files stdin, stdout, and stderr */ static int io_noclose (lua_State *L) { lua_pushnil(L); lua_pushliteral(L, "cannot close standard file"); return 2; } /* ** function to close 'popen' files */ static int io_pclose (lua_State *L) { FILE **p = tofilep(L); int ok = lua_pclose(L, *p); *p = NULL; return pushresult(L, ok, NULL); } /* ** function to close regular files */ static int io_fclose (lua_State *L) { FILE **p = tofilep(L); int ok = (fclose(*p) == 0); *p = NULL; return pushresult(L, ok, NULL); } static int aux_close (lua_State *L) { lua_getfenv(L, 1); lua_getfield(L, -1, "__close"); return (lua_tocfunction(L, -1))(L); } static int io_close (lua_State *L) { if (lua_isnone(L, 1)) lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT); tofile(L); /* make sure argument is a file */ return aux_close(L); } static int io_gc (lua_State *L) { FILE *f = *tofilep(L); /* ignore closed files */ if (f != NULL) aux_close(L); return 0; } static int io_tostring (lua_State *L) { FILE *f = *tofilep(L); if (f == NULL) lua_pushliteral(L, "file (closed)"); else lua_pushfstring(L, "file (%p)", f); return 1; } static int io_open (lua_State *L) { const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r"); FILE **pf = newfile(L); *pf = fopen(filename, mode); return (*pf == NULL) ? pushresult(L, 0, filename) : 1; } /* ** this function has a separated environment, which defines the ** correct __close for 'popen' files */ static int io_popen (lua_State *L) { const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r"); FILE **pf = newfile(L); *pf = lua_popen(L, filename, mode); return (*pf == NULL) ? pushresult(L, 0, filename) : 1; } static int io_tmpfile (lua_State *L) { FILE **pf = newfile(L); *pf = tmpfile(); return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; } static FILE *getiofile (lua_State *L, int findex) { FILE *f; lua_rawgeti(L, LUA_ENVIRONINDEX, findex); f = *(FILE **)lua_touserdata(L, -1); if (f == NULL) luaL_error(L, "standard %s file is closed", fnames[findex - 1]); return f; } static int g_iofile (lua_State *L, int f, const char *mode) { if (!lua_isnoneornil(L, 1)) { const char *filename = lua_tostring(L, 1); if (filename) { FILE **pf = newfile(L); *pf = fopen(filename, mode); if (*pf == NULL) fileerror(L, 1, filename); } else { tofile(L); /* check that it's a valid file handle */ lua_pushvalue(L, 1); } lua_rawseti(L, LUA_ENVIRONINDEX, f); } /* return current value */ lua_rawgeti(L, LUA_ENVIRONINDEX, f); return 1; } static int io_input (lua_State *L) { return g_iofile(L, IO_INPUT, "r"); } static int io_output (lua_State *L) { return g_iofile(L, IO_OUTPUT, "w"); } static int io_readline (lua_State *L); static void aux_lines (lua_State *L, int idx, int toclose) { lua_pushvalue(L, idx); lua_pushboolean(L, toclose); /* close/not close file when finished */ lua_pushcclosure(L, io_readline, 2); } static int f_lines (lua_State *L) { tofile(L); /* check that it's a valid file handle */ aux_lines(L, 1, 0); return 1; } static int io_lines (lua_State *L) { if (lua_isnoneornil(L, 1)) { /* no arguments? */ /* will iterate over default input */ lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT); return f_lines(L); } else { const char *filename = luaL_checkstring(L, 1); FILE **pf = newfile(L); *pf = fopen(filename, "r"); if (*pf == NULL) fileerror(L, 1, filename); aux_lines(L, lua_gettop(L), 1); return 1; } } /* ** {====================================================== ** READ ** ======================================================= */ static int read_number (lua_State *L, FILE *f) { lua_Number d; if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) { lua_pushnumber(L, d); return 1; } else return 0; /* read fails */ } static int test_eof (lua_State *L, FILE *f) { int c = getc(f); ungetc(c, f); lua_pushlstring(L, NULL, 0); return (c != EOF); } static int read_line (lua_State *L, FILE *f) { luaL_Buffer b; luaL_buffinit(L, &b); for (;;) { size_t l; char *p = luaL_prepbuffer(&b); if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ luaL_pushresult(&b); /* close buffer */ return (lua_objlen(L, -1) > 0); /* check whether read something */ } l = strlen(p); if (l == 0 || p[l-1] != '\n') luaL_addsize(&b, l); else { luaL_addsize(&b, l - 1); /* do not include `eol' */ luaL_pushresult(&b); /* close buffer */ return 1; /* read at least an `eol' */ } } } static int read_chars (lua_State *L, FILE *f, size_t n) { size_t rlen; /* how much to read */ size_t nr; /* number of chars actually read */ luaL_Buffer b; luaL_buffinit(L, &b); rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ do { char *p = luaL_prepbuffer(&b); if (rlen > n) rlen = n; /* cannot read more than asked */ nr = fread(p, sizeof(char), rlen, f); luaL_addsize(&b, nr); n -= nr; /* still have to read `n' chars */ } while (n > 0 && nr == rlen); /* until end of count or eof */ luaL_pushresult(&b); /* close buffer */ return (n == 0 || lua_objlen(L, -1) > 0); } static int g_read (lua_State *L, FILE *f, int first) { int nargs = lua_gettop(L) - 1; int success; int n; clearerr(f); if (nargs == 0) { /* no arguments? */ success = read_line(L, f); n = first+1; /* to return 1 result */ } else { /* ensure stack space for all results and for auxlib's buffer */ luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); success = 1; for (n = first; nargs-- && success; n++) { if (lua_type(L, n) == LUA_TNUMBER) { size_t l = (size_t)lua_tointeger(L, n); success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); } else { const char *p = lua_tostring(L, n); luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); switch (p[1]) { case 'n': /* number */ success = read_number(L, f); break; case 'l': /* line */ success = read_line(L, f); break; case 'a': /* file */ read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */ success = 1; /* always success */ break; default: return luaL_argerror(L, n, "invalid format"); } } } } if (ferror(f)) return pushresult(L, 0, NULL); if (!success) { lua_pop(L, 1); /* remove last result */ lua_pushnil(L); /* push nil instead */ } return n - first; } static int io_read (lua_State *L) { return g_read(L, getiofile(L, IO_INPUT), 1); } static int f_read (lua_State *L) { return g_read(L, tofile(L), 2); } static int io_readline (lua_State *L) { FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1)); int sucess; if (f == NULL) /* file is already closed? */ luaL_error(L, "file is already closed"); sucess = read_line(L, f); if (ferror(f)) return luaL_error(L, "%s", strerror(errno)); if (sucess) return 1; else { /* EOF */ if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */ lua_settop(L, 0); lua_pushvalue(L, lua_upvalueindex(1)); aux_close(L); /* close it */ } return 0; } } /* }====================================================== */ static int g_write (lua_State *L, FILE *f, int arg) { int nargs = lua_gettop(L) - 1; int status = 1; for (; nargs--; arg++) { if (lua_type(L, arg) == LUA_TNUMBER) { /* optimization: could be done exactly as for strings */ status = status && fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; } else { size_t l; const char *s = luaL_checklstring(L, arg, &l); status = status && (fwrite(s, sizeof(char), l, f) == l); } } return pushresult(L, status, NULL); } static int io_write (lua_State *L) { return g_write(L, getiofile(L, IO_OUTPUT), 1); } static int f_write (lua_State *L) { return g_write(L, tofile(L), 2); } static int f_seek (lua_State *L) { static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; static const char *const modenames[] = {"set", "cur", "end", NULL}; FILE *f = tofile(L); int op = luaL_checkoption(L, 2, "cur", modenames); long offset = luaL_optlong(L, 3, 0); op = fseek(f, offset, mode[op]); if (op) return pushresult(L, 0, NULL); /* error */ else { lua_pushinteger(L, ftell(f)); return 1; } } static int f_setvbuf (lua_State *L) { static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; static const char *const modenames[] = {"no", "full", "line", NULL}; FILE *f = tofile(L); int op = luaL_checkoption(L, 2, NULL, modenames); lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); int res = setvbuf(f, NULL, mode[op], sz); return pushresult(L, res == 0, NULL); } static int io_flush (lua_State *L) { return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); } static int f_flush (lua_State *L) { return pushresult(L, fflush(tofile(L)) == 0, NULL); } static const luaL_Reg iolib[] = { {"close", io_close}, {"flush", io_flush}, {"input", io_input}, {"lines", io_lines}, {"open", io_open}, {"output", io_output}, {"popen", io_popen}, {"read", io_read}, {"tmpfile", io_tmpfile}, {"type", io_type}, {"write", io_write}, {NULL, NULL} }; static const luaL_Reg flib[] = { {"close", io_close}, {"flush", f_flush}, {"lines", f_lines}, {"read", f_read}, {"seek", f_seek}, {"setvbuf", f_setvbuf}, {"write", f_write}, {"__gc", io_gc}, {"__tostring", io_tostring}, {NULL, NULL} }; static void createmeta (lua_State *L) { luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ lua_pushvalue(L, -1); /* push metatable */ lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ luaL_register(L, NULL, flib); /* file methods */ } static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) { *newfile(L) = f; if (k > 0) { lua_pushvalue(L, -1); lua_rawseti(L, LUA_ENVIRONINDEX, k); } lua_pushvalue(L, -2); /* copy environment */ lua_setfenv(L, -2); /* set it */ lua_setfield(L, -3, fname); } static void newfenv (lua_State *L, lua_CFunction cls) { lua_createtable(L, 0, 1); lua_pushcfunction(L, cls); lua_setfield(L, -2, "__close"); } LUALIB_API int luaopen_io (lua_State *L) { createmeta(L); /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */ newfenv(L, io_fclose); lua_replace(L, LUA_ENVIRONINDEX); /* open library */ luaL_register(L, LUA_IOLIBNAME, iolib); /* create (and set) default files */ newfenv(L, io_noclose); /* close function for default files */ createstdfile(L, stdin, IO_INPUT, "stdin"); createstdfile(L, stdout, IO_OUTPUT, "stdout"); createstdfile(L, stderr, 0, "stderr"); lua_pop(L, 1); /* pop environment for default files */ lua_getfield(L, -1, "popen"); newfenv(L, io_pclose); /* create environment for 'popen' */ lua_setfenv(L, -2); /* set fenv for 'popen' */ lua_pop(L, 1); /* pop 'popen' */ return 1; } premake-3.7.orig/Src/Lua/lua.h0000644000000000000000000002665011043456337013055 0ustar /* ** $Id: lua.h,v 1.218.1.4 2008/01/03 15:41:15 roberto Exp $ ** Lua - An Extensible Extension Language ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) ** See Copyright Notice at the end of this file */ #ifndef lua_h #define lua_h #include #include #include "luaconf.h" #define LUA_VERSION "Lua 5.1" #define LUA_RELEASE "Lua 5.1.3" #define LUA_VERSION_NUM 501 #define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" /* mark for precompiled code (`Lua') */ #define LUA_SIGNATURE "\033Lua" /* option for multiple returns in `lua_pcall' and `lua_call' */ #define LUA_MULTRET (-1) /* ** pseudo-indices */ #define LUA_REGISTRYINDEX (-10000) #define LUA_ENVIRONINDEX (-10001) #define LUA_GLOBALSINDEX (-10002) #define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) /* thread status; 0 is OK */ #define LUA_YIELD 1 #define LUA_ERRRUN 2 #define LUA_ERRSYNTAX 3 #define LUA_ERRMEM 4 #define LUA_ERRERR 5 typedef struct lua_State lua_State; typedef int (*lua_CFunction) (lua_State *L); /* ** functions that read/write blocks when loading/dumping Lua chunks */ typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); /* ** prototype for memory-allocation functions */ typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); /* ** basic types */ #define LUA_TNONE (-1) #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERDATA 2 #define LUA_TNUMBER 3 #define LUA_TSTRING 4 #define LUA_TTABLE 5 #define LUA_TFUNCTION 6 #define LUA_TUSERDATA 7 #define LUA_TTHREAD 8 /* minimum Lua stack available to a C function */ #define LUA_MINSTACK 20 /* ** generic extra include file */ #if defined(LUA_USER_H) #include LUA_USER_H #endif /* type of numbers in Lua */ typedef LUA_NUMBER lua_Number; /* type for integer functions */ typedef LUA_INTEGER lua_Integer; /* ** state manipulation */ LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); LUA_API void (lua_close) (lua_State *L); LUA_API lua_State *(lua_newthread) (lua_State *L); LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); /* ** basic stack manipulation */ LUA_API int (lua_gettop) (lua_State *L); LUA_API void (lua_settop) (lua_State *L, int idx); LUA_API void (lua_pushvalue) (lua_State *L, int idx); LUA_API void (lua_remove) (lua_State *L, int idx); LUA_API void (lua_insert) (lua_State *L, int idx); LUA_API void (lua_replace) (lua_State *L, int idx); LUA_API int (lua_checkstack) (lua_State *L, int sz); LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); /* ** access functions (stack -> C) */ LUA_API int (lua_isnumber) (lua_State *L, int idx); LUA_API int (lua_isstring) (lua_State *L, int idx); LUA_API int (lua_iscfunction) (lua_State *L, int idx); LUA_API int (lua_isuserdata) (lua_State *L, int idx); LUA_API int (lua_type) (lua_State *L, int idx); LUA_API const char *(lua_typename) (lua_State *L, int tp); LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); LUA_API int (lua_toboolean) (lua_State *L, int idx); LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); LUA_API size_t (lua_objlen) (lua_State *L, int idx); LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); LUA_API void *(lua_touserdata) (lua_State *L, int idx); LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); LUA_API const void *(lua_topointer) (lua_State *L, int idx); /* ** push functions (C -> stack) */ LUA_API void (lua_pushnil) (lua_State *L); LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); LUA_API void (lua_pushstring) (lua_State *L, const char *s); LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp); LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); LUA_API void (lua_pushboolean) (lua_State *L, int b); LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); LUA_API int (lua_pushthread) (lua_State *L); /* ** get functions (Lua -> stack) */ LUA_API void (lua_gettable) (lua_State *L, int idx); LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); LUA_API void (lua_rawget) (lua_State *L, int idx); LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); LUA_API int (lua_getmetatable) (lua_State *L, int objindex); LUA_API void (lua_getfenv) (lua_State *L, int idx); /* ** set functions (stack -> Lua) */ LUA_API void (lua_settable) (lua_State *L, int idx); LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); LUA_API void (lua_rawset) (lua_State *L, int idx); LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); LUA_API int (lua_setmetatable) (lua_State *L, int objindex); LUA_API int (lua_setfenv) (lua_State *L, int idx); /* ** `load' and `call' functions (load and run Lua code) */ LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, const char *chunkname); LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); /* ** coroutine functions */ LUA_API int (lua_yield) (lua_State *L, int nresults); LUA_API int (lua_resume) (lua_State *L, int narg); LUA_API int (lua_status) (lua_State *L); /* ** garbage-collection function and options */ #define LUA_GCSTOP 0 #define LUA_GCRESTART 1 #define LUA_GCCOLLECT 2 #define LUA_GCCOUNT 3 #define LUA_GCCOUNTB 4 #define LUA_GCSTEP 5 #define LUA_GCSETPAUSE 6 #define LUA_GCSETSTEPMUL 7 LUA_API int (lua_gc) (lua_State *L, int what, int data); /* ** miscellaneous functions */ LUA_API int (lua_error) (lua_State *L); LUA_API int (lua_next) (lua_State *L, int idx); LUA_API void (lua_concat) (lua_State *L, int n); LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); /* ** =============================================================== ** some useful macros ** =============================================================== */ #define lua_pop(L,n) lua_settop(L, -(n)-1) #define lua_newtable(L) lua_createtable(L, 0, 0) #define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) #define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) #define lua_strlen(L,i) lua_objlen(L, (i)) #define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) #define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) #define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) #define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) #define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) #define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) #define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) #define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) #define lua_pushliteral(L, s) \ lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) #define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) #define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) #define lua_tostring(L,i) lua_tolstring(L, (i), NULL) /* ** compatibility macros and functions */ #define lua_open() luaL_newstate() #define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) #define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) #define lua_Chunkreader lua_Reader #define lua_Chunkwriter lua_Writer /* hack */ LUA_API void lua_setlevel (lua_State *from, lua_State *to); /* ** {====================================================================== ** Debug API ** ======================================================================= */ /* ** Event codes */ #define LUA_HOOKCALL 0 #define LUA_HOOKRET 1 #define LUA_HOOKLINE 2 #define LUA_HOOKCOUNT 3 #define LUA_HOOKTAILRET 4 /* ** Event masks */ #define LUA_MASKCALL (1 << LUA_HOOKCALL) #define LUA_MASKRET (1 << LUA_HOOKRET) #define LUA_MASKLINE (1 << LUA_HOOKLINE) #define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) typedef struct lua_Debug lua_Debug; /* activation record */ /* Functions to be called by the debuger in specific events */ typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); LUA_API lua_Hook lua_gethook (lua_State *L); LUA_API int lua_gethookmask (lua_State *L); LUA_API int lua_gethookcount (lua_State *L); struct lua_Debug { int event; const char *name; /* (n) */ const char *namewhat; /* (n) `global', `local', `field', `method' */ const char *what; /* (S) `Lua', `C', `main', `tail' */ const char *source; /* (S) */ int currentline; /* (l) */ int nups; /* (u) number of upvalues */ int linedefined; /* (S) */ int lastlinedefined; /* (S) */ char short_src[LUA_IDSIZE]; /* (S) */ /* private part */ int i_ci; /* active function */ }; /* }====================================================================== */ /****************************************************************************** * Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************************/ #endif premake-3.7.orig/Src/Lua/lgc.c0000644000000000000000000004720311043456337013031 0ustar /* ** $Id: lgc.c,v 2.38.1.1 2007/12/27 13:02:25 roberto Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */ #include #define lgc_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #define GCSTEPSIZE 1024u #define GCSWEEPMAX 40 #define GCSWEEPCOST 10 #define GCFINALIZECOST 100 #define maskmarks cast_byte(~(bitmask(BLACKBIT)|WHITEBITS)) #define makewhite(g,x) \ ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g))) #define white2gray(x) reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) #define black2gray(x) resetbit((x)->gch.marked, BLACKBIT) #define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT) #define isfinalized(u) testbit((u)->marked, FINALIZEDBIT) #define markfinalized(u) l_setbit((u)->marked, FINALIZEDBIT) #define KEYWEAK bitmask(KEYWEAKBIT) #define VALUEWEAK bitmask(VALUEWEAKBIT) #define markvalue(g,o) { checkconsistency(o); \ if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); } #define markobject(g,t) { if (iswhite(obj2gco(t))) \ reallymarkobject(g, obj2gco(t)); } #define setthreshold(g) (g->GCthreshold = (g->estimate/100) * g->gcpause) static void removeentry (Node *n) { lua_assert(ttisnil(gval(n))); if (iscollectable(gkey(n))) setttype(gkey(n), LUA_TDEADKEY); /* dead key; remove it */ } static void reallymarkobject (global_State *g, GCObject *o) { lua_assert(iswhite(o) && !isdead(g, o)); white2gray(o); switch (o->gch.tt) { case LUA_TSTRING: { return; } case LUA_TUSERDATA: { Table *mt = gco2u(o)->metatable; gray2black(o); /* udata are never gray */ if (mt) markobject(g, mt); markobject(g, gco2u(o)->env); return; } case LUA_TUPVAL: { UpVal *uv = gco2uv(o); markvalue(g, uv->v); if (uv->v == &uv->u.value) /* closed? */ gray2black(o); /* open upvalues are never black */ return; } case LUA_TFUNCTION: { gco2cl(o)->c.gclist = g->gray; g->gray = o; break; } case LUA_TTABLE: { gco2h(o)->gclist = g->gray; g->gray = o; break; } case LUA_TTHREAD: { gco2th(o)->gclist = g->gray; g->gray = o; break; } case LUA_TPROTO: { gco2p(o)->gclist = g->gray; g->gray = o; break; } default: lua_assert(0); } } static void marktmu (global_State *g) { GCObject *u = g->tmudata; if (u) { do { u = u->gch.next; makewhite(g, u); /* may be marked, if left from previous GC */ reallymarkobject(g, u); } while (u != g->tmudata); } } /* move `dead' udata that need finalization to list `tmudata' */ size_t luaC_separateudata (lua_State *L, int all) { global_State *g = G(L); size_t deadmem = 0; GCObject **p = &g->mainthread->next; GCObject *curr; while ((curr = *p) != NULL) { if (!(iswhite(curr) || all) || isfinalized(gco2u(curr))) p = &curr->gch.next; /* don't bother with them */ else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) { markfinalized(gco2u(curr)); /* don't need finalization */ p = &curr->gch.next; } else { /* must call its gc method */ deadmem += sizeudata(gco2u(curr)); markfinalized(gco2u(curr)); *p = curr->gch.next; /* link `curr' at the end of `tmudata' list */ if (g->tmudata == NULL) /* list is empty? */ g->tmudata = curr->gch.next = curr; /* creates a circular list */ else { curr->gch.next = g->tmudata->gch.next; g->tmudata->gch.next = curr; g->tmudata = curr; } } } return deadmem; } static int traversetable (global_State *g, Table *h) { int i; int weakkey = 0; int weakvalue = 0; const TValue *mode; if (h->metatable) markobject(g, h->metatable); mode = gfasttm(g, h->metatable, TM_MODE); if (mode && ttisstring(mode)) { /* is there a weak mode? */ weakkey = (strchr(svalue(mode), 'k') != NULL); weakvalue = (strchr(svalue(mode), 'v') != NULL); if (weakkey || weakvalue) { /* is really weak? */ h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */ h->marked |= cast_byte((weakkey << KEYWEAKBIT) | (weakvalue << VALUEWEAKBIT)); h->gclist = g->weak; /* must be cleared after GC, ... */ g->weak = obj2gco(h); /* ... so put in the appropriate list */ } } if (weakkey && weakvalue) return 1; if (!weakvalue) { i = h->sizearray; while (i--) markvalue(g, &h->array[i]); } i = sizenode(h); while (i--) { Node *n = gnode(h, i); lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n))); if (ttisnil(gval(n))) removeentry(n); /* remove empty entries */ else { lua_assert(!ttisnil(gkey(n))); if (!weakkey) markvalue(g, gkey(n)); if (!weakvalue) markvalue(g, gval(n)); } } return weakkey || weakvalue; } /* ** All marks are conditional because a GC may happen while the ** prototype is still being created */ static void traverseproto (global_State *g, Proto *f) { int i; if (f->source) stringmark(f->source); for (i=0; isizek; i++) /* mark literals */ markvalue(g, &f->k[i]); for (i=0; isizeupvalues; i++) { /* mark upvalue names */ if (f->upvalues[i]) stringmark(f->upvalues[i]); } for (i=0; isizep; i++) { /* mark nested protos */ if (f->p[i]) markobject(g, f->p[i]); } for (i=0; isizelocvars; i++) { /* mark local-variable names */ if (f->locvars[i].varname) stringmark(f->locvars[i].varname); } } static void traverseclosure (global_State *g, Closure *cl) { markobject(g, cl->c.env); if (cl->c.isC) { int i; for (i=0; ic.nupvalues; i++) /* mark its upvalues */ markvalue(g, &cl->c.upvalue[i]); } else { int i; lua_assert(cl->l.nupvalues == cl->l.p->nups); markobject(g, cl->l.p); for (i=0; il.nupvalues; i++) /* mark its upvalues */ markobject(g, cl->l.upvals[i]); } } static void checkstacksizes (lua_State *L, StkId max) { int ci_used = cast_int(L->ci - L->base_ci); /* number of `ci' in use */ int s_used = cast_int(max - L->stack); /* part of stack in use */ if (L->size_ci > LUAI_MAXCALLS) /* handling overflow? */ return; /* do not touch the stacks */ if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci) luaD_reallocCI(L, L->size_ci/2); /* still big enough... */ condhardstacktests(luaD_reallocCI(L, ci_used + 1)); if (4*s_used < L->stacksize && 2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize) luaD_reallocstack(L, L->stacksize/2); /* still big enough... */ condhardstacktests(luaD_reallocstack(L, s_used)); } static void traversestack (global_State *g, lua_State *l) { StkId o, lim; CallInfo *ci; markvalue(g, gt(l)); lim = l->top; for (ci = l->base_ci; ci <= l->ci; ci++) { lua_assert(ci->top <= l->stack_last); if (lim < ci->top) lim = ci->top; } for (o = l->stack; o < l->top; o++) markvalue(g, o); for (; o <= lim; o++) setnilvalue(o); checkstacksizes(l, lim); } /* ** traverse one gray object, turning it to black. ** Returns `quantity' traversed. */ static l_mem propagatemark (global_State *g) { GCObject *o = g->gray; lua_assert(isgray(o)); gray2black(o); switch (o->gch.tt) { case LUA_TTABLE: { Table *h = gco2h(o); g->gray = h->gclist; if (traversetable(g, h)) /* table is weak? */ black2gray(o); /* keep it gray */ return sizeof(Table) + sizeof(TValue) * h->sizearray + sizeof(Node) * sizenode(h); } case LUA_TFUNCTION: { Closure *cl = gco2cl(o); g->gray = cl->c.gclist; traverseclosure(g, cl); return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : sizeLclosure(cl->l.nupvalues); } case LUA_TTHREAD: { lua_State *th = gco2th(o); g->gray = th->gclist; th->gclist = g->grayagain; g->grayagain = o; black2gray(o); traversestack(g, th); return sizeof(lua_State) + sizeof(TValue) * th->stacksize + sizeof(CallInfo) * th->size_ci; } case LUA_TPROTO: { Proto *p = gco2p(o); g->gray = p->gclist; traverseproto(g, p); return sizeof(Proto) + sizeof(Instruction) * p->sizecode + sizeof(Proto *) * p->sizep + sizeof(TValue) * p->sizek + sizeof(int) * p->sizelineinfo + sizeof(LocVar) * p->sizelocvars + sizeof(TString *) * p->sizeupvalues; } default: lua_assert(0); return 0; } } static size_t propagateall (global_State *g) { size_t m = 0; while (g->gray) m += propagatemark(g); return m; } /* ** The next function tells whether a key or value can be cleared from ** a weak table. Non-collectable objects are never removed from weak ** tables. Strings behave as `values', so are never removed too. for ** other objects: if really collected, cannot keep them; for userdata ** being finalized, keep them in keys, but not in values */ static int iscleared (const TValue *o, int iskey) { if (!iscollectable(o)) return 0; if (ttisstring(o)) { stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */ return 0; } return iswhite(gcvalue(o)) || (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o)))); } /* ** clear collected entries from weaktables */ static void cleartable (GCObject *l) { while (l) { Table *h = gco2h(l); int i = h->sizearray; lua_assert(testbit(h->marked, VALUEWEAKBIT) || testbit(h->marked, KEYWEAKBIT)); if (testbit(h->marked, VALUEWEAKBIT)) { while (i--) { TValue *o = &h->array[i]; if (iscleared(o, 0)) /* value was collected? */ setnilvalue(o); /* remove value */ } } i = sizenode(h); while (i--) { Node *n = gnode(h, i); if (!ttisnil(gval(n)) && /* non-empty entry? */ (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) { setnilvalue(gval(n)); /* remove value ... */ removeentry(n); /* remove entry from table */ } } l = h->gclist; } } static void freeobj (lua_State *L, GCObject *o) { switch (o->gch.tt) { case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; case LUA_TTABLE: luaH_free(L, gco2h(o)); break; case LUA_TTHREAD: { lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread); luaE_freethread(L, gco2th(o)); break; } case LUA_TSTRING: { G(L)->strt.nuse--; luaM_freemem(L, o, sizestring(gco2ts(o))); break; } case LUA_TUSERDATA: { luaM_freemem(L, o, sizeudata(gco2u(o))); break; } default: lua_assert(0); } } #define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM) static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { GCObject *curr; global_State *g = G(L); int deadmask = otherwhite(g); while ((curr = *p) != NULL && count-- > 0) { if (curr->gch.tt == LUA_TTHREAD) /* sweep open upvalues of each thread */ sweepwholelist(L, &gco2th(curr)->openupval); if ((curr->gch.marked ^ WHITEBITS) & deadmask) { /* not dead? */ lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT)); makewhite(g, curr); /* make it white (for next cycle) */ p = &curr->gch.next; } else { /* must erase `curr' */ lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT)); *p = curr->gch.next; if (curr == g->rootgc) /* is the first element of the list? */ g->rootgc = curr->gch.next; /* adjust first */ freeobj(L, curr); } } return p; } static void checkSizes (lua_State *L) { global_State *g = G(L); /* check size of string hash */ if (g->strt.nuse < cast(lu_int32, g->strt.size/4) && g->strt.size > MINSTRTABSIZE*2) luaS_resize(L, g->strt.size/2); /* table is too big */ /* check size of buffer */ if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) { /* buffer too big? */ size_t newsize = luaZ_sizebuffer(&g->buff) / 2; luaZ_resizebuffer(L, &g->buff, newsize); } } static void GCTM (lua_State *L) { global_State *g = G(L); GCObject *o = g->tmudata->gch.next; /* get first element */ Udata *udata = rawgco2u(o); const TValue *tm; /* remove udata from `tmudata' */ if (o == g->tmudata) /* last element? */ g->tmudata = NULL; else g->tmudata->gch.next = udata->uv.next; udata->uv.next = g->mainthread->next; /* return it to `root' list */ g->mainthread->next = o; makewhite(g, o); tm = fasttm(L, udata->uv.metatable, TM_GC); if (tm != NULL) { lu_byte oldah = L->allowhook; lu_mem oldt = g->GCthreshold; L->allowhook = 0; /* stop debug hooks during GC tag method */ g->GCthreshold = 2*g->totalbytes; /* avoid GC steps */ setobj2s(L, L->top, tm); setuvalue(L, L->top+1, udata); L->top += 2; luaD_call(L, L->top - 2, 0); L->allowhook = oldah; /* restore hooks */ g->GCthreshold = oldt; /* restore threshold */ } } /* ** Call all GC tag methods */ void luaC_callGCTM (lua_State *L) { while (G(L)->tmudata) GCTM(L); } void luaC_freeall (lua_State *L) { global_State *g = G(L); int i; g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT); /* mask to collect all elements */ sweepwholelist(L, &g->rootgc); for (i = 0; i < g->strt.size; i++) /* free all string lists */ sweepwholelist(L, &g->strt.hash[i]); } static void markmt (global_State *g) { int i; for (i=0; imt[i]) markobject(g, g->mt[i]); } /* mark root set */ static void markroot (lua_State *L) { global_State *g = G(L); g->gray = NULL; g->grayagain = NULL; g->weak = NULL; markobject(g, g->mainthread); /* make global table be traversed before main stack */ markvalue(g, gt(g->mainthread)); markvalue(g, registry(L)); markmt(g); g->gcstate = GCSpropagate; } static void remarkupvals (global_State *g) { UpVal *uv; for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) { lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); if (isgray(obj2gco(uv))) markvalue(g, uv->v); } } static void atomic (lua_State *L) { global_State *g = G(L); size_t udsize; /* total size of userdata to be finalized */ /* remark occasional upvalues of (maybe) dead threads */ remarkupvals(g); /* traverse objects cautch by write barrier and by 'remarkupvals' */ propagateall(g); /* remark weak tables */ g->gray = g->weak; g->weak = NULL; lua_assert(!iswhite(obj2gco(g->mainthread))); markobject(g, L); /* mark running thread */ markmt(g); /* mark basic metatables (again) */ propagateall(g); /* remark gray again */ g->gray = g->grayagain; g->grayagain = NULL; propagateall(g); udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ marktmu(g); /* mark `preserved' userdata */ udsize += propagateall(g); /* remark, to propagate `preserveness' */ cleartable(g->weak); /* remove collected objects from weak tables */ /* flip current white */ g->currentwhite = cast_byte(otherwhite(g)); g->sweepstrgc = 0; g->sweepgc = &g->rootgc; g->gcstate = GCSsweepstring; g->estimate = g->totalbytes - udsize; /* first estimate */ } static l_mem singlestep (lua_State *L) { global_State *g = G(L); /*lua_checkmemory(L);*/ switch (g->gcstate) { case GCSpause: { markroot(L); /* start a new collection */ return 0; } case GCSpropagate: { if (g->gray) return propagatemark(g); else { /* no more `gray' objects */ atomic(L); /* finish mark phase */ return 0; } } case GCSsweepstring: { lu_mem old = g->totalbytes; sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */ g->gcstate = GCSsweep; /* end sweep-string phase */ lua_assert(old >= g->totalbytes); g->estimate -= old - g->totalbytes; return GCSWEEPCOST; } case GCSsweep: { lu_mem old = g->totalbytes; g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); if (*g->sweepgc == NULL) { /* nothing more to sweep? */ checkSizes(L); g->gcstate = GCSfinalize; /* end sweep phase */ } lua_assert(old >= g->totalbytes); g->estimate -= old - g->totalbytes; return GCSWEEPMAX*GCSWEEPCOST; } case GCSfinalize: { if (g->tmudata) { GCTM(L); if (g->estimate > GCFINALIZECOST) g->estimate -= GCFINALIZECOST; return GCFINALIZECOST; } else { g->gcstate = GCSpause; /* end collection */ g->gcdept = 0; return 0; } } default: lua_assert(0); return 0; } } void luaC_step (lua_State *L) { global_State *g = G(L); l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul; if (lim == 0) lim = (MAX_LUMEM-1)/2; /* no limit */ g->gcdept += g->totalbytes - g->GCthreshold; do { lim -= singlestep(L); if (g->gcstate == GCSpause) break; } while (lim > 0); if (g->gcstate != GCSpause) { if (g->gcdept < GCSTEPSIZE) g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/g->gcstepmul;*/ else { g->gcdept -= GCSTEPSIZE; g->GCthreshold = g->totalbytes; } } else { lua_assert(g->totalbytes >= g->estimate); setthreshold(g); } } void luaC_fullgc (lua_State *L) { global_State *g = G(L); if (g->gcstate <= GCSpropagate) { /* reset sweep marks to sweep all elements (returning them to white) */ g->sweepstrgc = 0; g->sweepgc = &g->rootgc; /* reset other collector lists */ g->gray = NULL; g->grayagain = NULL; g->weak = NULL; g->gcstate = GCSsweepstring; } lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate); /* finish any pending sweep phase */ while (g->gcstate != GCSfinalize) { lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep); singlestep(L); } markroot(L); while (g->gcstate != GCSpause) { singlestep(L); } setthreshold(g); } void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) { global_State *g = G(L); lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); lua_assert(ttype(&o->gch) != LUA_TTABLE); /* must keep invariant? */ if (g->gcstate == GCSpropagate) reallymarkobject(g, v); /* restore invariant */ else /* don't mind */ makewhite(g, o); /* mark as white just to avoid other barriers */ } void luaC_barrierback (lua_State *L, Table *t) { global_State *g = G(L); GCObject *o = obj2gco(t); lua_assert(isblack(o) && !isdead(g, o)); lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); black2gray(o); /* make table gray (again) */ t->gclist = g->grayagain; g->grayagain = o; } void luaC_link (lua_State *L, GCObject *o, lu_byte tt) { global_State *g = G(L); o->gch.next = g->rootgc; g->rootgc = o; o->gch.marked = luaC_white(g); o->gch.tt = tt; } void luaC_linkupval (lua_State *L, UpVal *uv) { global_State *g = G(L); GCObject *o = obj2gco(uv); o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ g->rootgc = o; if (isgray(o)) { if (g->gcstate == GCSpropagate) { gray2black(o); /* closed upvalues need barrier */ luaC_barrier(L, uv, uv->v); } else { /* sweep phase: sweep it (turning it into white) */ makewhite(g, o); lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); } } } premake-3.7.orig/Src/Lua/lvm.c0000644000000000000000000005512611043456337013065 0ustar /* ** $Id: lvm.c,v 2.63.1.3 2007/12/28 15:32:23 roberto Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */ #include #include #include #define lvm_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "lobject.h" #include "lopcodes.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lvm.h" /* limit for table tag-method chains (to avoid loops) */ #define MAXTAGLOOP 100 const TValue *luaV_tonumber (const TValue *obj, TValue *n) { lua_Number num; if (ttisnumber(obj)) return obj; if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { setnvalue(n, num); return n; } else return NULL; } int luaV_tostring (lua_State *L, StkId obj) { if (!ttisnumber(obj)) return 0; else { char s[LUAI_MAXNUMBER2STR]; lua_Number n = nvalue(obj); lua_number2str(s, n); setsvalue2s(L, obj, luaS_new(L, s)); return 1; } } static void traceexec (lua_State *L, const Instruction *pc) { lu_byte mask = L->hookmask; const Instruction *oldpc = L->savedpc; L->savedpc = pc; if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) { resethookcount(L); luaD_callhook(L, LUA_HOOKCOUNT, -1); } if (mask & LUA_MASKLINE) { Proto *p = ci_func(L->ci)->l.p; int npc = pcRel(pc, p); int newline = getline(p, npc); /* call linehook when enter a new function, when jump back (loop), or when enter a new line */ if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p))) luaD_callhook(L, LUA_HOOKLINE, newline); } } static void callTMres (lua_State *L, StkId res, const TValue *f, const TValue *p1, const TValue *p2) { ptrdiff_t result = savestack(L, res); setobj2s(L, L->top, f); /* push function */ setobj2s(L, L->top+1, p1); /* 1st argument */ setobj2s(L, L->top+2, p2); /* 2nd argument */ luaD_checkstack(L, 3); L->top += 3; luaD_call(L, L->top - 3, 1); res = restorestack(L, result); L->top--; setobjs2s(L, res, L->top); } static void callTM (lua_State *L, const TValue *f, const TValue *p1, const TValue *p2, const TValue *p3) { setobj2s(L, L->top, f); /* push function */ setobj2s(L, L->top+1, p1); /* 1st argument */ setobj2s(L, L->top+2, p2); /* 2nd argument */ setobj2s(L, L->top+3, p3); /* 3th argument */ luaD_checkstack(L, 4); L->top += 4; luaD_call(L, L->top - 4, 0); } void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { int loop; for (loop = 0; loop < MAXTAGLOOP; loop++) { const TValue *tm; if (ttistable(t)) { /* `t' is a table? */ Table *h = hvalue(t); const TValue *res = luaH_get(h, key); /* do a primitive get */ if (!ttisnil(res) || /* result is no nil? */ (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ setobj2s(L, val, res); return; } /* else will try the tag method */ } else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) luaG_typeerror(L, t, "index"); if (ttisfunction(tm)) { callTMres(L, val, tm, t, key); return; } t = tm; /* else repeat with `tm' */ } luaG_runerror(L, "loop in gettable"); } void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { int loop; for (loop = 0; loop < MAXTAGLOOP; loop++) { const TValue *tm; if (ttistable(t)) { /* `t' is a table? */ Table *h = hvalue(t); TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ if (!ttisnil(oldval) || /* result is no nil? */ (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ setobj2t(L, oldval, val); luaC_barriert(L, h, val); return; } /* else will try the tag method */ } else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) luaG_typeerror(L, t, "index"); if (ttisfunction(tm)) { callTM(L, tm, t, key, val); return; } t = tm; /* else repeat with `tm' */ } luaG_runerror(L, "loop in settable"); } static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, StkId res, TMS event) { const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ if (ttisnil(tm)) tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ if (ttisnil(tm)) return 0; callTMres(L, res, tm, p1, p2); return 1; } static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, TMS event) { const TValue *tm1 = fasttm(L, mt1, event); const TValue *tm2; if (tm1 == NULL) return NULL; /* no metamethod */ if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ tm2 = fasttm(L, mt2, event); if (tm2 == NULL) return NULL; /* no metamethod */ if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ return tm1; return NULL; } static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, TMS event) { const TValue *tm1 = luaT_gettmbyobj(L, p1, event); const TValue *tm2; if (ttisnil(tm1)) return -1; /* no metamethod? */ tm2 = luaT_gettmbyobj(L, p2, event); if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ return -1; callTMres(L, L->top, tm1, p1, p2); return !l_isfalse(L->top); } static int l_strcmp (const TString *ls, const TString *rs) { const char *l = getstr(ls); size_t ll = ls->tsv.len; const char *r = getstr(rs); size_t lr = rs->tsv.len; for (;;) { int temp = strcoll(l, r); if (temp != 0) return temp; else { /* strings are equal up to a `\0' */ size_t len = strlen(l); /* index of first `\0' in both strings */ if (len == lr) /* r is finished? */ return (len == ll) ? 0 : 1; else if (len == ll) /* l is finished? */ return -1; /* l is smaller than r (because r is not finished) */ /* both strings longer than `len'; go on comparing (after the `\0') */ len++; l += len; ll -= len; r += len; lr -= len; } } } int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { int res; if (ttype(l) != ttype(r)) return luaG_ordererror(L, l, r); else if (ttisnumber(l)) return luai_numlt(nvalue(l), nvalue(r)); else if (ttisstring(l)) return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) return res; return luaG_ordererror(L, l, r); } static int lessequal (lua_State *L, const TValue *l, const TValue *r) { int res; if (ttype(l) != ttype(r)) return luaG_ordererror(L, l, r); else if (ttisnumber(l)) return luai_numle(nvalue(l), nvalue(r)); else if (ttisstring(l)) return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ return res; else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ return !res; return luaG_ordererror(L, l, r); } int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { const TValue *tm; lua_assert(ttype(t1) == ttype(t2)); switch (ttype(t1)) { case LUA_TNIL: return 1; case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); case LUA_TUSERDATA: { if (uvalue(t1) == uvalue(t2)) return 1; tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, TM_EQ); break; /* will try TM */ } case LUA_TTABLE: { if (hvalue(t1) == hvalue(t2)) return 1; tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); break; /* will try TM */ } default: return gcvalue(t1) == gcvalue(t2); } if (tm == NULL) return 0; /* no TM? */ callTMres(L, L->top, tm, t1, t2); /* call TM */ return !l_isfalse(L->top); } void luaV_concat (lua_State *L, int total, int last) { do { StkId top = L->base + last + 1; int n = 2; /* number of elements handled in this pass (at least 2) */ if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) luaG_concaterror(L, top-2, top-1); } else if (tsvalue(top-1)->len == 0) /* second op is empty? */ (void)tostring(L, top - 2); /* result is first op (as string) */ else { /* at least two string values; get as many as possible */ size_t tl = tsvalue(top-1)->len; char *buffer; int i; /* collect total length */ for (n = 1; n < total && tostring(L, top-n-1); n++) { size_t l = tsvalue(top-n-1)->len; if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); tl += l; } buffer = luaZ_openspace(L, &G(L)->buff, tl); tl = 0; for (i=n; i>0; i--) { /* concat all strings */ size_t l = tsvalue(top-i)->len; memcpy(buffer+tl, svalue(top-i), l); tl += l; } setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); } total -= n-1; /* got `n' strings to create 1 new */ last -= n-1; } while (total > 1); /* repeat until only 1 result left */ } static void Arith (lua_State *L, StkId ra, const TValue *rb, const TValue *rc, TMS op) { TValue tempb, tempc; const TValue *b, *c; if ((b = luaV_tonumber(rb, &tempb)) != NULL && (c = luaV_tonumber(rc, &tempc)) != NULL) { lua_Number nb = nvalue(b), nc = nvalue(c); switch (op) { case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break; case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break; case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break; case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break; case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break; case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break; case TM_UNM: setnvalue(ra, luai_numunm(nb)); break; default: lua_assert(0); break; } } else if (!call_binTM(L, rb, rc, ra, op)) luaG_aritherror(L, rb, rc); } /* ** some macros for common tasks in `luaV_execute' */ #define runtime_check(L, c) { if (!(c)) break; } #define RA(i) (base+GETARG_A(i)) /* to be used after possible stack reallocation */ #define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) #define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) #define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);} #define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } #define arith_op(op,tm) { \ TValue *rb = RKB(i); \ TValue *rc = RKC(i); \ if (ttisnumber(rb) && ttisnumber(rc)) { \ lua_Number nb = nvalue(rb), nc = nvalue(rc); \ setnvalue(ra, op(nb, nc)); \ } \ else \ Protect(Arith(L, ra, rb, rc, tm)); \ } void luaV_execute (lua_State *L, int nexeccalls) { LClosure *cl; StkId base; TValue *k; const Instruction *pc; reentry: /* entry point */ lua_assert(isLua(L->ci)); pc = L->savedpc; cl = &clvalue(L->ci->func)->l; base = L->base; k = cl->p->k; /* main loop of interpreter */ for (;;) { const Instruction i = *pc++; StkId ra; if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { traceexec(L, pc); if (L->status == LUA_YIELD) { /* did hook yield? */ L->savedpc = pc - 1; return; } base = L->base; } /* warning!! several calls may realloc the stack and invalidate `ra' */ ra = RA(i); lua_assert(base == L->base && L->base == L->ci->base); lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); switch (GET_OPCODE(i)) { case OP_MOVE: { setobjs2s(L, ra, RB(i)); continue; } case OP_LOADK: { setobj2s(L, ra, KBx(i)); continue; } case OP_LOADBOOL: { setbvalue(ra, GETARG_B(i)); if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ continue; } case OP_LOADNIL: { TValue *rb = RB(i); do { setnilvalue(rb--); } while (rb >= ra); continue; } case OP_GETUPVAL: { int b = GETARG_B(i); setobj2s(L, ra, cl->upvals[b]->v); continue; } case OP_GETGLOBAL: { TValue g; TValue *rb = KBx(i); sethvalue(L, &g, cl->env); lua_assert(ttisstring(rb)); Protect(luaV_gettable(L, &g, rb, ra)); continue; } case OP_GETTABLE: { Protect(luaV_gettable(L, RB(i), RKC(i), ra)); continue; } case OP_SETGLOBAL: { TValue g; sethvalue(L, &g, cl->env); lua_assert(ttisstring(KBx(i))); Protect(luaV_settable(L, &g, KBx(i), ra)); continue; } case OP_SETUPVAL: { UpVal *uv = cl->upvals[GETARG_B(i)]; setobj(L, uv->v, ra); luaC_barrier(L, uv, ra); continue; } case OP_SETTABLE: { Protect(luaV_settable(L, ra, RKB(i), RKC(i))); continue; } case OP_NEWTABLE: { int b = GETARG_B(i); int c = GETARG_C(i); sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c))); Protect(luaC_checkGC(L)); continue; } case OP_SELF: { StkId rb = RB(i); setobjs2s(L, ra+1, rb); Protect(luaV_gettable(L, rb, RKC(i), ra)); continue; } case OP_ADD: { arith_op(luai_numadd, TM_ADD); continue; } case OP_SUB: { arith_op(luai_numsub, TM_SUB); continue; } case OP_MUL: { arith_op(luai_nummul, TM_MUL); continue; } case OP_DIV: { arith_op(luai_numdiv, TM_DIV); continue; } case OP_MOD: { arith_op(luai_nummod, TM_MOD); continue; } case OP_POW: { arith_op(luai_numpow, TM_POW); continue; } case OP_UNM: { TValue *rb = RB(i); if (ttisnumber(rb)) { lua_Number nb = nvalue(rb); setnvalue(ra, luai_numunm(nb)); } else { Protect(Arith(L, ra, rb, rb, TM_UNM)); } continue; } case OP_NOT: { int res = l_isfalse(RB(i)); /* next assignment may change this value */ setbvalue(ra, res); continue; } case OP_LEN: { const TValue *rb = RB(i); switch (ttype(rb)) { case LUA_TTABLE: { setnvalue(ra, cast_num(luaH_getn(hvalue(rb)))); break; } case LUA_TSTRING: { setnvalue(ra, cast_num(tsvalue(rb)->len)); break; } default: { /* try metamethod */ Protect( if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN)) luaG_typeerror(L, rb, "get length of"); ) } } continue; } case OP_CONCAT: { int b = GETARG_B(i); int c = GETARG_C(i); Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L)); setobjs2s(L, RA(i), base+b); continue; } case OP_JMP: { dojump(L, pc, GETARG_sBx(i)); continue; } case OP_EQ: { TValue *rb = RKB(i); TValue *rc = RKC(i); Protect( if (equalobj(L, rb, rc) == GETARG_A(i)) dojump(L, pc, GETARG_sBx(*pc)); ) pc++; continue; } case OP_LT: { Protect( if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i)) dojump(L, pc, GETARG_sBx(*pc)); ) pc++; continue; } case OP_LE: { Protect( if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) dojump(L, pc, GETARG_sBx(*pc)); ) pc++; continue; } case OP_TEST: { if (l_isfalse(ra) != GETARG_C(i)) dojump(L, pc, GETARG_sBx(*pc)); pc++; continue; } case OP_TESTSET: { TValue *rb = RB(i); if (l_isfalse(rb) != GETARG_C(i)) { setobjs2s(L, ra, rb); dojump(L, pc, GETARG_sBx(*pc)); } pc++; continue; } case OP_CALL: { int b = GETARG_B(i); int nresults = GETARG_C(i) - 1; if (b != 0) L->top = ra+b; /* else previous instruction set top */ L->savedpc = pc; switch (luaD_precall(L, ra, nresults)) { case PCRLUA: { nexeccalls++; goto reentry; /* restart luaV_execute over new Lua function */ } case PCRC: { /* it was a C function (`precall' called it); adjust results */ if (nresults >= 0) L->top = L->ci->top; base = L->base; continue; } default: { return; /* yield */ } } } case OP_TAILCALL: { int b = GETARG_B(i); if (b != 0) L->top = ra+b; /* else previous instruction set top */ L->savedpc = pc; lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); switch (luaD_precall(L, ra, LUA_MULTRET)) { case PCRLUA: { /* tail call: put new frame in place of previous one */ CallInfo *ci = L->ci - 1; /* previous frame */ int aux; StkId func = ci->func; StkId pfunc = (ci+1)->func; /* previous function index */ if (L->openupval) luaF_close(L, ci->base); L->base = ci->base = ci->func + ((ci+1)->base - pfunc); for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */ setobjs2s(L, func+aux, pfunc+aux); ci->top = L->top = func+aux; /* correct top */ lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); ci->savedpc = L->savedpc; ci->tailcalls++; /* one more call lost */ L->ci--; /* remove new frame */ goto reentry; } case PCRC: { /* it was a C function (`precall' called it) */ base = L->base; continue; } default: { return; /* yield */ } } } case OP_RETURN: { int b = GETARG_B(i); if (b != 0) L->top = ra+b-1; if (L->openupval) luaF_close(L, base); L->savedpc = pc; b = luaD_poscall(L, ra); if (--nexeccalls == 0) /* was previous function running `here'? */ return; /* no: return */ else { /* yes: continue its execution */ if (b) L->top = L->ci->top; lua_assert(isLua(L->ci)); lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); goto reentry; } } case OP_FORLOOP: { lua_Number step = nvalue(ra+2); lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ lua_Number limit = nvalue(ra+1); if (luai_numlt(0, step) ? luai_numle(idx, limit) : luai_numle(limit, idx)) { dojump(L, pc, GETARG_sBx(i)); /* jump back */ setnvalue(ra, idx); /* update internal index... */ setnvalue(ra+3, idx); /* ...and external index */ } continue; } case OP_FORPREP: { const TValue *init = ra; const TValue *plimit = ra+1; const TValue *pstep = ra+2; L->savedpc = pc; /* next steps may throw errors */ if (!tonumber(init, ra)) luaG_runerror(L, LUA_QL("for") " initial value must be a number"); else if (!tonumber(plimit, ra+1)) luaG_runerror(L, LUA_QL("for") " limit must be a number"); else if (!tonumber(pstep, ra+2)) luaG_runerror(L, LUA_QL("for") " step must be a number"); setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); dojump(L, pc, GETARG_sBx(i)); continue; } case OP_TFORLOOP: { StkId cb = ra + 3; /* call base */ setobjs2s(L, cb+2, ra+2); setobjs2s(L, cb+1, ra+1); setobjs2s(L, cb, ra); L->top = cb+3; /* func. + 2 args (state and index) */ Protect(luaD_call(L, cb, GETARG_C(i))); L->top = L->ci->top; cb = RA(i) + 3; /* previous call may change the stack */ if (!ttisnil(cb)) { /* continue loop? */ setobjs2s(L, cb-1, cb); /* save control variable */ dojump(L, pc, GETARG_sBx(*pc)); /* jump back */ } pc++; continue; } case OP_SETLIST: { int n = GETARG_B(i); int c = GETARG_C(i); int last; Table *h; if (n == 0) { n = cast_int(L->top - ra) - 1; L->top = L->ci->top; } if (c == 0) c = cast_int(*pc++); runtime_check(L, ttistable(ra)); h = hvalue(ra); last = ((c-1)*LFIELDS_PER_FLUSH) + n; if (last > h->sizearray) /* needs more space? */ luaH_resizearray(L, h, last); /* pre-alloc it at once */ for (; n > 0; n--) { TValue *val = ra+n; setobj2t(L, luaH_setnum(L, h, last--), val); luaC_barriert(L, h, val); } continue; } case OP_CLOSE: { luaF_close(L, ra); continue; } case OP_CLOSURE: { Proto *p; Closure *ncl; int nup, j; p = cl->p->p[GETARG_Bx(i)]; nup = p->nups; ncl = luaF_newLclosure(L, nup, cl->env); ncl->l.p = p; for (j=0; jl.upvals[j] = cl->upvals[GETARG_B(*pc)]; else { lua_assert(GET_OPCODE(*pc) == OP_MOVE); ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); } } setclvalue(L, ra, ncl); Protect(luaC_checkGC(L)); continue; } case OP_VARARG: { int b = GETARG_B(i) - 1; int j; CallInfo *ci = L->ci; int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1; if (b == LUA_MULTRET) { Protect(luaD_checkstack(L, n)); ra = RA(i); /* previous call may change the stack */ b = n; L->top = ra + n; } for (j = 0; j < b; j++) { if (j < n) { setobjs2s(L, ra + j, ci->base - n + j); } else { setnilvalue(ra + j); } } continue; } } } } premake-3.7.orig/Src/Lua/ldo.h0000644000000000000000000000355111043456337013045 0ustar /* ** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ #ifndef ldo_h #define ldo_h #include "lobject.h" #include "lstate.h" #include "lzio.h" #define luaD_checkstack(L,n) \ if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \ luaD_growstack(L, n); \ else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); #define incr_top(L) {luaD_checkstack(L,1); L->top++;} #define savestack(L,p) ((char *)(p) - (char *)L->stack) #define restorestack(L,n) ((TValue *)((char *)L->stack + (n))) #define saveci(L,p) ((char *)(p) - (char *)L->base_ci) #define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n))) /* results from luaD_precall */ #define PCRLUA 0 /* initiated a call to a Lua function */ #define PCRC 1 /* did a call to a C function */ #define PCRYIELD 2 /* C funtion yielded */ /* type of protected functions, to be ran by `runprotected' */ typedef void (*Pfunc) (lua_State *L, void *ud); LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name); LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line); LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, ptrdiff_t oldtop, ptrdiff_t ef); LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); LUAI_FUNC void luaD_growstack (lua_State *L, int n); LUAI_FUNC void luaD_throw (lua_State *L, int errcode); LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); #endif premake-3.7.orig/Src/Lua/README0000644000000000000000000000345110504524316012767 0ustar This is Lua 5.0. See HISTORY for a summary of changes since the last released version. * What is Lua? ------------ Lua is a powerful, light-weight programming language designed for extending applications. Lua is also frequently used as a general-purpose, stand-alone language. Lua is free software. For complete information, visit Lua's web site at http://www.lua.org/ . For an executive summary, see http://www.lua.org/about.html . Lua has been used in many different projects around the world. For a short list, see http://www.lua.org/uses.html . * Availability ------------ Lua is freely available for both academic and commercial purposes. See COPYRIGHT and http://www.lua.org/license.html for details. Lua can be downloaded from its official site http://www.lua.org/ and several other sites aroung the world. For a complete list of mirror sites, see http://www.lua.org/mirrors.html . * Installation ------------ Lua is implemented in pure ANSI C, and compiles unmodified in all known platforms that have an ANSI C compiler. Under Unix, simply typing "make" should work. See INSTALL for detailed instructions. * Contacting the authors ---------------------- Send your comments, questions, and bug reports to lua@tecgraf.puc-rio.br. For more information about the authors, see http://www.lua.org/authors.html . For reporting bugs, try also the mailing list: lua-l@tecgraf.puc-rio.br. For more information about this list, including instructions on how to subscribe and access the archives, see http://www.lua.org/lua-l.html . * Origin ------ Lua is developed at Tecgraf, the Computer Graphics Technology Group of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro in Brazil). Tecgraf is a laboratory of the Department of Computer Science. (end of README) premake-3.7.orig/Src/Lua/lfunc.h0000644000000000000000000000214511043456337013374 0ustar /* ** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ #ifndef lfunc_h #define lfunc_h #include "lobject.h" #define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ cast(int, sizeof(TValue)*((n)-1))) #define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ cast(int, sizeof(TValue *)*((n)-1))) LUAI_FUNC Proto *luaF_newproto (lua_State *L); LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e); LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e); LUAI_FUNC UpVal *luaF_newupval (lua_State *L); LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); LUAI_FUNC void luaF_close (lua_State *L, StkId level); LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c); LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv); LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, int pc); #endif premake-3.7.orig/Src/Lua/ltable.h0000644000000000000000000000224011043456337013524 0ustar /* ** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua tables (hash) ** See Copyright Notice in lua.h */ #ifndef ltable_h #define ltable_h #include "lobject.h" #define gnode(t,i) (&(t)->node[i]) #define gkey(n) (&(n)->i_key.nk) #define gval(n) (&(n)->i_val) #define gnext(n) ((n)->i_key.nk.next) #define key2tval(n) (&(n)->i_key.tvk) LUAI_FUNC const TValue *luaH_getnum (Table *t, int key); LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key); LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key); LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key); LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash); LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize); LUAI_FUNC void luaH_free (lua_State *L, Table *t); LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); LUAI_FUNC int luaH_getn (Table *t); #if defined(LUA_DEBUG) LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); LUAI_FUNC int luaH_isdummy (Node *n); #endif #endif premake-3.7.orig/Src/Lua/lbaselib.c0000644000000000000000000004077211043456337014045 0ustar /* ** $Id: lbaselib.c,v 1.191.1.4 2008/01/20 13:53:22 roberto Exp $ ** Basic library ** See Copyright Notice in lua.h */ #include #include #include #include #define lbaselib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" /* ** If your system does not support `stdout', you can just remove this function. ** If you need, you can define your own `print' function, following this ** model but changing `fputs' to put the strings at a proper place ** (a console window or a log file, for instance). */ static int luaB_print (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ int i; lua_getglobal(L, "tostring"); for (i=1; i<=n; i++) { const char *s; lua_pushvalue(L, -1); /* function to be called */ lua_pushvalue(L, i); /* value to print */ lua_call(L, 1, 1); s = lua_tostring(L, -1); /* get result */ if (s == NULL) return luaL_error(L, LUA_QL("tostring") " must return a string to " LUA_QL("print")); if (i>1) fputs("\t", stdout); fputs(s, stdout); lua_pop(L, 1); /* pop result */ } fputs("\n", stdout); return 0; } static int luaB_tonumber (lua_State *L) { int base = luaL_optint(L, 2, 10); if (base == 10) { /* standard conversion */ luaL_checkany(L, 1); if (lua_isnumber(L, 1)) { lua_pushnumber(L, lua_tonumber(L, 1)); return 1; } } else { const char *s1 = luaL_checkstring(L, 1); char *s2; unsigned long n; luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); n = strtoul(s1, &s2, base); if (s1 != s2) { /* at least one valid digit? */ while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */ if (*s2 == '\0') { /* no invalid trailing characters? */ lua_pushnumber(L, (lua_Number)n); return 1; } } } lua_pushnil(L); /* else not a number */ return 1; } static int luaB_error (lua_State *L) { int level = luaL_optint(L, 2, 1); lua_settop(L, 1); if (lua_isstring(L, 1) && level > 0) { /* add extra information? */ luaL_where(L, level); lua_pushvalue(L, 1); lua_concat(L, 2); } return lua_error(L); } static int luaB_getmetatable (lua_State *L) { luaL_checkany(L, 1); if (!lua_getmetatable(L, 1)) { lua_pushnil(L); return 1; /* no metatable */ } luaL_getmetafield(L, 1, "__metatable"); return 1; /* returns either __metatable field (if present) or metatable */ } static int luaB_setmetatable (lua_State *L) { int t = lua_type(L, 2); luaL_checktype(L, 1, LUA_TTABLE); luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table expected"); if (luaL_getmetafield(L, 1, "__metatable")) luaL_error(L, "cannot change a protected metatable"); lua_settop(L, 2); lua_setmetatable(L, 1); return 1; } static void getfunc (lua_State *L, int opt) { if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); else { lua_Debug ar; int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1); luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); if (lua_getstack(L, level, &ar) == 0) luaL_argerror(L, 1, "invalid level"); lua_getinfo(L, "f", &ar); if (lua_isnil(L, -1)) luaL_error(L, "no function environment for tail call at level %d", level); } } static int luaB_getfenv (lua_State *L) { getfunc(L, 1); if (lua_iscfunction(L, -1)) /* is a C function? */ lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */ else lua_getfenv(L, -1); return 1; } static int luaB_setfenv (lua_State *L) { luaL_checktype(L, 2, LUA_TTABLE); getfunc(L, 0); lua_pushvalue(L, 2); if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) { /* change environment of current thread */ lua_pushthread(L); lua_insert(L, -2); lua_setfenv(L, -2); return 0; } else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0) luaL_error(L, LUA_QL("setfenv") " cannot change environment of given object"); return 1; } static int luaB_rawequal (lua_State *L) { luaL_checkany(L, 1); luaL_checkany(L, 2); lua_pushboolean(L, lua_rawequal(L, 1, 2)); return 1; } static int luaB_rawget (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checkany(L, 2); lua_settop(L, 2); lua_rawget(L, 1); return 1; } static int luaB_rawset (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); luaL_checkany(L, 2); luaL_checkany(L, 3); lua_settop(L, 3); lua_rawset(L, 1); return 1; } static int luaB_gcinfo (lua_State *L) { lua_pushinteger(L, lua_getgccount(L)); return 1; } static int luaB_collectgarbage (lua_State *L) { static const char *const opts[] = {"stop", "restart", "collect", "count", "step", "setpause", "setstepmul", NULL}; static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL}; int o = luaL_checkoption(L, 1, "collect", opts); int ex = luaL_optint(L, 2, 0); int res = lua_gc(L, optsnum[o], ex); switch (optsnum[o]) { case LUA_GCCOUNT: { int b = lua_gc(L, LUA_GCCOUNTB, 0); lua_pushnumber(L, res + ((lua_Number)b/1024)); return 1; } case LUA_GCSTEP: { lua_pushboolean(L, res); return 1; } default: { lua_pushnumber(L, res); return 1; } } } static int luaB_type (lua_State *L) { luaL_checkany(L, 1); lua_pushstring(L, luaL_typename(L, 1)); return 1; } static int luaB_next (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_settop(L, 2); /* create a 2nd argument if there isn't one */ if (lua_next(L, 1)) return 2; else { lua_pushnil(L); return 1; } } static int luaB_pairs (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ lua_pushvalue(L, 1); /* state, */ lua_pushnil(L); /* and initial value */ return 3; } static int ipairsaux (lua_State *L) { int i = luaL_checkint(L, 2); luaL_checktype(L, 1, LUA_TTABLE); i++; /* next value */ lua_pushinteger(L, i); lua_rawgeti(L, 1, i); return (lua_isnil(L, -1)) ? 0 : 2; } static int luaB_ipairs (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ lua_pushvalue(L, 1); /* state, */ lua_pushinteger(L, 0); /* and initial value */ return 3; } static int load_aux (lua_State *L, int status) { if (status == 0) /* OK? */ return 1; else { lua_pushnil(L); lua_insert(L, -2); /* put before error message */ return 2; /* return nil plus error message */ } } static int luaB_loadstring (lua_State *L) { size_t l; const char *s = luaL_checklstring(L, 1, &l); const char *chunkname = luaL_optstring(L, 2, s); return load_aux(L, luaL_loadbuffer(L, s, l, chunkname)); } static int luaB_loadfile (lua_State *L) { const char *fname = luaL_optstring(L, 1, NULL); return load_aux(L, luaL_loadfile(L, fname)); } /* ** Reader for generic `load' function: `lua_load' uses the ** stack for internal stuff, so the reader cannot change the ** stack top. Instead, it keeps its resulting string in a ** reserved slot inside the stack. */ static const char *generic_reader (lua_State *L, void *ud, size_t *size) { (void)ud; /* to avoid warnings */ luaL_checkstack(L, 2, "too many nested functions"); lua_pushvalue(L, 1); /* get function */ lua_call(L, 0, 1); /* call it */ if (lua_isnil(L, -1)) { *size = 0; return NULL; } else if (lua_isstring(L, -1)) { lua_replace(L, 3); /* save string in a reserved stack slot */ return lua_tolstring(L, 3, size); } else luaL_error(L, "reader function must return a string"); return NULL; /* to avoid warnings */ } static int luaB_load (lua_State *L) { int status; const char *cname = luaL_optstring(L, 2, "=(load)"); luaL_checktype(L, 1, LUA_TFUNCTION); lua_settop(L, 3); /* function, eventual name, plus one reserved slot */ status = lua_load(L, generic_reader, NULL, cname); return load_aux(L, status); } static int luaB_dofile (lua_State *L) { const char *fname = luaL_optstring(L, 1, NULL); int n = lua_gettop(L); if (luaL_loadfile(L, fname) != 0) lua_error(L); lua_call(L, 0, LUA_MULTRET); return lua_gettop(L) - n; } static int luaB_assert (lua_State *L) { luaL_checkany(L, 1); if (!lua_toboolean(L, 1)) return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!")); return lua_gettop(L); } static int luaB_unpack (lua_State *L) { int i, e, n; luaL_checktype(L, 1, LUA_TTABLE); i = luaL_optint(L, 2, 1); e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1)); n = e - i + 1; /* number of elements */ if (n <= 0) return 0; /* empty range */ luaL_checkstack(L, n, "table too big to unpack"); for (; i<=e; i++) /* push arg[i...e] */ lua_rawgeti(L, 1, i); return n; } static int luaB_select (lua_State *L) { int n = lua_gettop(L); if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { lua_pushinteger(L, n-1); return 1; } else { int i = luaL_checkint(L, 1); if (i < 0) i = n + i; else if (i > n) i = n; luaL_argcheck(L, 1 <= i, 1, "index out of range"); return n - i; } } static int luaB_pcall (lua_State *L) { int status; luaL_checkany(L, 1); status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0); lua_pushboolean(L, (status == 0)); lua_insert(L, 1); return lua_gettop(L); /* return status + all results */ } static int luaB_xpcall (lua_State *L) { int status; luaL_checkany(L, 2); lua_settop(L, 2); lua_insert(L, 1); /* put error function under function to be called */ status = lua_pcall(L, 0, LUA_MULTRET, 1); lua_pushboolean(L, (status == 0)); lua_replace(L, 1); return lua_gettop(L); /* return status + all results */ } static int luaB_tostring (lua_State *L) { luaL_checkany(L, 1); if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */ return 1; /* use its value */ switch (lua_type(L, 1)) { case LUA_TNUMBER: lua_pushstring(L, lua_tostring(L, 1)); break; case LUA_TSTRING: lua_pushvalue(L, 1); break; case LUA_TBOOLEAN: lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); break; case LUA_TNIL: lua_pushliteral(L, "nil"); break; default: lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1)); break; } return 1; } static int luaB_newproxy (lua_State *L) { lua_settop(L, 1); lua_newuserdata(L, 0); /* create proxy */ if (lua_toboolean(L, 1) == 0) return 1; /* no metatable */ else if (lua_isboolean(L, 1)) { lua_newtable(L); /* create a new metatable `m' ... */ lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */ lua_pushboolean(L, 1); lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */ } else { int validproxy = 0; /* to check if weaktable[metatable(u)] == true */ if (lua_getmetatable(L, 1)) { lua_rawget(L, lua_upvalueindex(1)); validproxy = lua_toboolean(L, -1); lua_pop(L, 1); /* remove value */ } luaL_argcheck(L, validproxy, 1, "boolean or proxy expected"); lua_getmetatable(L, 1); /* metatable is valid; get it */ } lua_setmetatable(L, 2); return 1; } static const luaL_Reg base_funcs[] = { {"assert", luaB_assert}, {"collectgarbage", luaB_collectgarbage}, {"dofile", luaB_dofile}, {"error", luaB_error}, {"gcinfo", luaB_gcinfo}, {"getfenv", luaB_getfenv}, {"getmetatable", luaB_getmetatable}, {"loadfile", luaB_loadfile}, {"load", luaB_load}, {"loadstring", luaB_loadstring}, {"next", luaB_next}, {"pcall", luaB_pcall}, {"print", luaB_print}, {"rawequal", luaB_rawequal}, {"rawget", luaB_rawget}, {"rawset", luaB_rawset}, {"select", luaB_select}, {"setfenv", luaB_setfenv}, {"setmetatable", luaB_setmetatable}, {"tonumber", luaB_tonumber}, {"tostring", luaB_tostring}, {"type", luaB_type}, {"unpack", luaB_unpack}, {"xpcall", luaB_xpcall}, {NULL, NULL} }; /* ** {====================================================== ** Coroutine library ** ======================================================= */ #define CO_RUN 0 /* running */ #define CO_SUS 1 /* suspended */ #define CO_NOR 2 /* 'normal' (it resumed another coroutine) */ #define CO_DEAD 3 static const char *const statnames[] = {"running", "suspended", "normal", "dead"}; static int costatus (lua_State *L, lua_State *co) { if (L == co) return CO_RUN; switch (lua_status(co)) { case LUA_YIELD: return CO_SUS; case 0: { lua_Debug ar; if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */ return CO_NOR; /* it is running */ else if (lua_gettop(co) == 0) return CO_DEAD; else return CO_SUS; /* initial state */ } default: /* some error occured */ return CO_DEAD; } } static int luaB_costatus (lua_State *L) { lua_State *co = lua_tothread(L, 1); luaL_argcheck(L, co, 1, "coroutine expected"); lua_pushstring(L, statnames[costatus(L, co)]); return 1; } static int auxresume (lua_State *L, lua_State *co, int narg) { int status = costatus(L, co); if (!lua_checkstack(co, narg)) luaL_error(L, "too many arguments to resume"); if (status != CO_SUS) { lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]); return -1; /* error flag */ } lua_xmove(L, co, narg); lua_setlevel(L, co); status = lua_resume(co, narg); if (status == 0 || status == LUA_YIELD) { int nres = lua_gettop(co); if (!lua_checkstack(L, nres)) luaL_error(L, "too many results to resume"); lua_xmove(co, L, nres); /* move yielded values */ return nres; } else { lua_xmove(co, L, 1); /* move error message */ return -1; /* error flag */ } } static int luaB_coresume (lua_State *L) { lua_State *co = lua_tothread(L, 1); int r; luaL_argcheck(L, co, 1, "coroutine expected"); r = auxresume(L, co, lua_gettop(L) - 1); if (r < 0) { lua_pushboolean(L, 0); lua_insert(L, -2); return 2; /* return false + error message */ } else { lua_pushboolean(L, 1); lua_insert(L, -(r + 1)); return r + 1; /* return true + `resume' returns */ } } static int luaB_auxwrap (lua_State *L) { lua_State *co = lua_tothread(L, lua_upvalueindex(1)); int r = auxresume(L, co, lua_gettop(L)); if (r < 0) { if (lua_isstring(L, -1)) { /* error object is a string? */ luaL_where(L, 1); /* add extra info */ lua_insert(L, -2); lua_concat(L, 2); } lua_error(L); /* propagate error */ } return r; } static int luaB_cocreate (lua_State *L) { lua_State *NL = lua_newthread(L); luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, "Lua function expected"); lua_pushvalue(L, 1); /* move function to top */ lua_xmove(L, NL, 1); /* move function from L to NL */ return 1; } static int luaB_cowrap (lua_State *L) { luaB_cocreate(L); lua_pushcclosure(L, luaB_auxwrap, 1); return 1; } static int luaB_yield (lua_State *L) { return lua_yield(L, lua_gettop(L)); } static int luaB_corunning (lua_State *L) { if (lua_pushthread(L)) lua_pushnil(L); /* main thread is not a coroutine */ return 1; } static const luaL_Reg co_funcs[] = { {"create", luaB_cocreate}, {"resume", luaB_coresume}, {"running", luaB_corunning}, {"status", luaB_costatus}, {"wrap", luaB_cowrap}, {"yield", luaB_yield}, {NULL, NULL} }; /* }====================================================== */ static void auxopen (lua_State *L, const char *name, lua_CFunction f, lua_CFunction u) { lua_pushcfunction(L, u); lua_pushcclosure(L, f, 1); lua_setfield(L, -2, name); } static void base_open (lua_State *L) { /* set global _G */ lua_pushvalue(L, LUA_GLOBALSINDEX); lua_setglobal(L, "_G"); /* open lib into global table */ luaL_register(L, "_G", base_funcs); lua_pushliteral(L, LUA_VERSION); lua_setglobal(L, "_VERSION"); /* set global _VERSION */ /* `ipairs' and `pairs' need auxliliary functions as upvalues */ auxopen(L, "ipairs", luaB_ipairs, ipairsaux); auxopen(L, "pairs", luaB_pairs, luaB_next); /* `newproxy' needs a weaktable as upvalue */ lua_createtable(L, 0, 1); /* new table `w' */ lua_pushvalue(L, -1); /* `w' will be its own metatable */ lua_setmetatable(L, -2); lua_pushliteral(L, "kv"); lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */ lua_pushcclosure(L, luaB_newproxy, 1); lua_setglobal(L, "newproxy"); /* set global `newproxy' */ } LUALIB_API int luaopen_base (lua_State *L) { base_open(L); luaL_register(L, LUA_COLIBNAME, co_funcs); return 2; } premake-3.7.orig/Src/Lua/lobject.h0000644000000000000000000002046311043456337013712 0ustar /* ** $Id: lobject.h,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ #ifndef lobject_h #define lobject_h #include #include "llimits.h" #include "lua.h" /* tags for values visible from Lua */ #define LAST_TAG LUA_TTHREAD #define NUM_TAGS (LAST_TAG+1) /* ** Extra tags for non-values */ #define LUA_TPROTO (LAST_TAG+1) #define LUA_TUPVAL (LAST_TAG+2) #define LUA_TDEADKEY (LAST_TAG+3) /* ** Union of all collectable objects */ typedef union GCObject GCObject; /* ** Common Header for all collectable objects (in macro form, to be ** included in other objects) */ #define CommonHeader GCObject *next; lu_byte tt; lu_byte marked /* ** Common header in struct form */ typedef struct GCheader { CommonHeader; } GCheader; /* ** Union of all Lua values */ typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; /* ** Tagged Values */ #define TValuefields Value value; int tt typedef struct lua_TValue { TValuefields; } TValue; /* Macros to test type */ #define ttisnil(o) (ttype(o) == LUA_TNIL) #define ttisnumber(o) (ttype(o) == LUA_TNUMBER) #define ttisstring(o) (ttype(o) == LUA_TSTRING) #define ttistable(o) (ttype(o) == LUA_TTABLE) #define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) #define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) #define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) #define ttisthread(o) (ttype(o) == LUA_TTHREAD) #define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) /* Macros to access values */ #define ttype(o) ((o)->tt) #define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) #define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) #define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) #define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) #define tsvalue(o) (&rawtsvalue(o)->tsv) #define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) #define uvalue(o) (&rawuvalue(o)->uv) #define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) #define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) #define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) #define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th) #define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) /* ** for internal debug only */ #define checkconsistency(obj) \ lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt)) #define checkliveness(g,obj) \ lua_assert(!iscollectable(obj) || \ ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc))) /* Macros to set values */ #define setnilvalue(obj) ((obj)->tt=LUA_TNIL) #define setnvalue(obj,x) \ { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; } #define setpvalue(obj,x) \ { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; } #define setbvalue(obj,x) \ { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; } #define setsvalue(L,obj,x) \ { TValue *i_o=(obj); \ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \ checkliveness(G(L),i_o); } #define setuvalue(L,obj,x) \ { TValue *i_o=(obj); \ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \ checkliveness(G(L),i_o); } #define setthvalue(L,obj,x) \ { TValue *i_o=(obj); \ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \ checkliveness(G(L),i_o); } #define setclvalue(L,obj,x) \ { TValue *i_o=(obj); \ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \ checkliveness(G(L),i_o); } #define sethvalue(L,obj,x) \ { TValue *i_o=(obj); \ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \ checkliveness(G(L),i_o); } #define setptvalue(L,obj,x) \ { TValue *i_o=(obj); \ i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \ checkliveness(G(L),i_o); } #define setobj(L,obj1,obj2) \ { const TValue *o2=(obj2); TValue *o1=(obj1); \ o1->value = o2->value; o1->tt=o2->tt; \ checkliveness(G(L),o1); } /* ** different types of sets, according to destination */ /* from stack to (same) stack */ #define setobjs2s setobj /* to stack (not from same stack) */ #define setobj2s setobj #define setsvalue2s setsvalue #define sethvalue2s sethvalue #define setptvalue2s setptvalue /* from table to same table */ #define setobjt2t setobj /* to table */ #define setobj2t setobj /* to new object */ #define setobj2n setobj #define setsvalue2n setsvalue #define setttype(obj, tt) (ttype(obj) = (tt)) #define iscollectable(o) (ttype(o) >= LUA_TSTRING) typedef TValue *StkId; /* index to stack elements */ /* ** String headers for string table */ typedef union TString { L_Umaxalign dummy; /* ensures maximum alignment for strings */ struct { CommonHeader; lu_byte reserved; unsigned int hash; size_t len; } tsv; } TString; #define getstr(ts) cast(const char *, (ts) + 1) #define svalue(o) getstr(tsvalue(o)) typedef union Udata { L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ struct { CommonHeader; struct Table *metatable; struct Table *env; size_t len; } uv; } Udata; /* ** Function Prototypes */ typedef struct Proto { CommonHeader; TValue *k; /* constants used by the function */ Instruction *code; struct Proto **p; /* functions defined inside the function */ int *lineinfo; /* map from opcodes to source lines */ struct LocVar *locvars; /* information about local variables */ TString **upvalues; /* upvalue names */ TString *source; int sizeupvalues; int sizek; /* size of `k' */ int sizecode; int sizelineinfo; int sizep; /* size of `p' */ int sizelocvars; int linedefined; int lastlinedefined; GCObject *gclist; lu_byte nups; /* number of upvalues */ lu_byte numparams; lu_byte is_vararg; lu_byte maxstacksize; } Proto; /* masks for new-style vararg */ #define VARARG_HASARG 1 #define VARARG_ISVARARG 2 #define VARARG_NEEDSARG 4 typedef struct LocVar { TString *varname; int startpc; /* first point where variable is active */ int endpc; /* first point where variable is dead */ } LocVar; /* ** Upvalues */ typedef struct UpVal { CommonHeader; TValue *v; /* points to stack or to its own value */ union { TValue value; /* the value (when closed) */ struct { /* double linked list (when open) */ struct UpVal *prev; struct UpVal *next; } l; } u; } UpVal; /* ** Closures */ #define ClosureHeader \ CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \ struct Table *env typedef struct CClosure { ClosureHeader; lua_CFunction f; TValue upvalue[1]; } CClosure; typedef struct LClosure { ClosureHeader; struct Proto *p; UpVal *upvals[1]; } LClosure; typedef union Closure { CClosure c; LClosure l; } Closure; #define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC) #define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC) /* ** Tables */ typedef union TKey { struct { TValuefields; struct Node *next; /* for chaining */ } nk; TValue tvk; } TKey; typedef struct Node { TValue i_val; TKey i_key; } Node; typedef struct Table { CommonHeader; lu_byte flags; /* 1<

lsizenode)) #define luaO_nilobject (&luaO_nilobject_) LUAI_DATA const TValue luaO_nilobject_; #define ceillog2(x) (luaO_log2((x)-1) + 1) LUAI_FUNC int luaO_log2 (unsigned int x); LUAI_FUNC int luaO_int2fb (unsigned int x); LUAI_FUNC int luaO_fb2int (int x); LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result); LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp); LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); #endif premake-3.7.orig/Src/Lua/lstring.h0000644000000000000000000000145611043456337013753 0ustar /* ** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ #ifndef lstring_h #define lstring_h #include "lgc.h" #include "lobject.h" #include "lstate.h" #define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char)) #define sizeudata(u) (sizeof(union Udata)+(u)->len) #define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s))) #define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ (sizeof(s)/sizeof(char))-1)) #define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT) LUAI_FUNC void luaS_resize (lua_State *L, int newsize); LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); #endif premake-3.7.orig/Src/Lua/lundump.h0000644000000000000000000000157211043456337013754 0ustar /* ** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ ** load precompiled Lua chunks ** See Copyright Notice in lua.h */ #ifndef lundump_h #define lundump_h #include "lobject.h" #include "lzio.h" /* load one chunk; from lundump.c */ LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name); /* make header; from lundump.c */ LUAI_FUNC void luaU_header (char* h); /* dump one chunk; from ldump.c */ LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); #ifdef luac_c /* print one chunk; from print.c */ LUAI_FUNC void luaU_print (const Proto* f, int full); #endif /* for header of binary files -- this is Lua 5.1 */ #define LUAC_VERSION 0x51 /* for header of binary files -- this is the official format */ #define LUAC_FORMAT 0 /* size of header of binary files */ #define LUAC_HEADERSIZE 12 #endif premake-3.7.orig/Src/Lua/ldebug.c0000644000000000000000000003744211043456337013532 0ustar /* ** $Id: ldebug.c,v 2.29.1.3 2007/12/28 15:32:23 roberto Exp $ ** Debug Interface ** See Copyright Notice in lua.h */ #include #include #include #define ldebug_c #define LUA_CORE #include "lua.h" #include "lapi.h" #include "lcode.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lobject.h" #include "lopcodes.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #include "lvm.h" static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); static int currentpc (lua_State *L, CallInfo *ci) { if (!isLua(ci)) return -1; /* function is not a Lua function? */ if (ci == L->ci) ci->savedpc = L->savedpc; return pcRel(ci->savedpc, ci_func(ci)->l.p); } static int currentline (lua_State *L, CallInfo *ci) { int pc = currentpc(L, ci); if (pc < 0) return -1; /* only active lua functions have current-line information */ else return getline(ci_func(ci)->l.p, pc); } /* ** this function can be called asynchronous (e.g. during a signal) */ LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { if (func == NULL || mask == 0) { /* turn off hooks? */ mask = 0; func = NULL; } L->hook = func; L->basehookcount = count; resethookcount(L); L->hookmask = cast_byte(mask); return 1; } LUA_API lua_Hook lua_gethook (lua_State *L) { return L->hook; } LUA_API int lua_gethookmask (lua_State *L) { return L->hookmask; } LUA_API int lua_gethookcount (lua_State *L) { return L->basehookcount; } LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { int status; CallInfo *ci; lua_lock(L); for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { level--; if (f_isLua(ci)) /* Lua function? */ level -= ci->tailcalls; /* skip lost tail calls */ } if (level == 0 && ci > L->base_ci) { /* level found? */ status = 1; ar->i_ci = cast_int(ci - L->base_ci); } else if (level < 0) { /* level is of a lost tail call? */ status = 1; ar->i_ci = 0; } else status = 0; /* no such level */ lua_unlock(L); return status; } static Proto *getluaproto (CallInfo *ci) { return (isLua(ci) ? ci_func(ci)->l.p : NULL); } static const char *findlocal (lua_State *L, CallInfo *ci, int n) { const char *name; Proto *fp = getluaproto(ci); if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL) return name; /* is a local variable in a Lua function */ else { StkId limit = (ci == L->ci) ? L->top : (ci+1)->func; if (limit - ci->base >= n && n > 0) /* is 'n' inside 'ci' stack? */ return "(*temporary)"; else return NULL; } } LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { CallInfo *ci = L->base_ci + ar->i_ci; const char *name = findlocal(L, ci, n); lua_lock(L); if (name) luaA_pushobject(L, ci->base + (n - 1)); lua_unlock(L); return name; } LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { CallInfo *ci = L->base_ci + ar->i_ci; const char *name = findlocal(L, ci, n); lua_lock(L); if (name) setobjs2s(L, ci->base + (n - 1), L->top - 1); L->top--; /* pop value */ lua_unlock(L); return name; } static void funcinfo (lua_Debug *ar, Closure *cl) { if (cl->c.isC) { ar->source = "=[C]"; ar->linedefined = -1; ar->lastlinedefined = -1; ar->what = "C"; } else { ar->source = getstr(cl->l.p->source); ar->linedefined = cl->l.p->linedefined; ar->lastlinedefined = cl->l.p->lastlinedefined; ar->what = (ar->linedefined == 0) ? "main" : "Lua"; } luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); } static void info_tailcall (lua_Debug *ar) { ar->name = ar->namewhat = ""; ar->what = "tail"; ar->lastlinedefined = ar->linedefined = ar->currentline = -1; ar->source = "=(tail call)"; luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); ar->nups = 0; } static void collectvalidlines (lua_State *L, Closure *f) { if (f == NULL || f->c.isC) { setnilvalue(L->top); } else { Table *t = luaH_new(L, 0, 0); int *lineinfo = f->l.p->lineinfo; int i; for (i=0; il.p->sizelineinfo; i++) setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); sethvalue(L, L->top, t); } incr_top(L); } static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, Closure *f, CallInfo *ci) { int status = 1; if (f == NULL) { info_tailcall(ar); return status; } for (; *what; what++) { switch (*what) { case 'S': { funcinfo(ar, f); break; } case 'l': { ar->currentline = (ci) ? currentline(L, ci) : -1; break; } case 'u': { ar->nups = f->c.nupvalues; break; } case 'n': { ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL; if (ar->namewhat == NULL) { ar->namewhat = ""; /* not found */ ar->name = NULL; } break; } case 'L': case 'f': /* handled by lua_getinfo */ break; default: status = 0; /* invalid option */ } } return status; } LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { int status; Closure *f = NULL; CallInfo *ci = NULL; lua_lock(L); if (*what == '>') { StkId func = L->top - 1; luai_apicheck(L, ttisfunction(func)); what++; /* skip the '>' */ f = clvalue(func); L->top--; /* pop function */ } else if (ar->i_ci != 0) { /* no tail call? */ ci = L->base_ci + ar->i_ci; lua_assert(ttisfunction(ci->func)); f = clvalue(ci->func); } status = auxgetinfo(L, what, ar, f, ci); if (strchr(what, 'f')) { if (f == NULL) setnilvalue(L->top); else setclvalue(L, L->top, f); incr_top(L); } if (strchr(what, 'L')) collectvalidlines(L, f); lua_unlock(L); return status; } /* ** {====================================================== ** Symbolic Execution and code checker ** ======================================================= */ #define check(x) if (!(x)) return 0; #define checkjump(pt,pc) check(0 <= pc && pc < pt->sizecode) #define checkreg(pt,reg) check((reg) < (pt)->maxstacksize) static int precheck (const Proto *pt) { check(pt->maxstacksize <= MAXSTACK); lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); lua_assert(!(pt->is_vararg & VARARG_NEEDSARG) || (pt->is_vararg & VARARG_HASARG)); check(pt->sizeupvalues <= pt->nups); check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); return 1; } #define checkopenop(pt,pc) luaG_checkopenop((pt)->code[(pc)+1]) int luaG_checkopenop (Instruction i) { switch (GET_OPCODE(i)) { case OP_CALL: case OP_TAILCALL: case OP_RETURN: case OP_SETLIST: { check(GETARG_B(i) == 0); return 1; } default: return 0; /* invalid instruction after an open call */ } } static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) { switch (mode) { case OpArgN: check(r == 0); break; case OpArgU: break; case OpArgR: checkreg(pt, r); break; case OpArgK: check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize); break; } return 1; } static Instruction symbexec (const Proto *pt, int lastpc, int reg) { int pc; int last; /* stores position of last instruction that changed `reg' */ last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */ check(precheck(pt)); for (pc = 0; pc < lastpc; pc++) { Instruction i = pt->code[pc]; OpCode op = GET_OPCODE(i); int a = GETARG_A(i); int b = 0; int c = 0; check(op < NUM_OPCODES); checkreg(pt, a); switch (getOpMode(op)) { case iABC: { b = GETARG_B(i); c = GETARG_C(i); check(checkArgMode(pt, b, getBMode(op))); check(checkArgMode(pt, c, getCMode(op))); break; } case iABx: { b = GETARG_Bx(i); if (getBMode(op) == OpArgK) check(b < pt->sizek); break; } case iAsBx: { b = GETARG_sBx(i); if (getBMode(op) == OpArgR) { int dest = pc+1+b; check(0 <= dest && dest < pt->sizecode); if (dest > 0) { /* cannot jump to a setlist count */ Instruction d = pt->code[dest-1]; check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)); } } break; } } if (testAMode(op)) { if (a == reg) last = pc; /* change register `a' */ } if (testTMode(op)) { check(pc+2 < pt->sizecode); /* check skip */ check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); } switch (op) { case OP_LOADBOOL: { check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ break; } case OP_LOADNIL: { if (a <= reg && reg <= b) last = pc; /* set registers from `a' to `b' */ break; } case OP_GETUPVAL: case OP_SETUPVAL: { check(b < pt->nups); break; } case OP_GETGLOBAL: case OP_SETGLOBAL: { check(ttisstring(&pt->k[b])); break; } case OP_SELF: { checkreg(pt, a+1); if (reg == a+1) last = pc; break; } case OP_CONCAT: { check(b < c); /* at least two operands */ break; } case OP_TFORLOOP: { check(c >= 1); /* at least one result (control variable) */ checkreg(pt, a+2+c); /* space for results */ if (reg >= a+2) last = pc; /* affect all regs above its base */ break; } case OP_FORLOOP: case OP_FORPREP: checkreg(pt, a+3); /* go through */ case OP_JMP: { int dest = pc+1+b; /* not full check and jump is forward and do not skip `lastpc'? */ if (reg != NO_REG && pc < dest && dest <= lastpc) pc += b; /* do the jump */ break; } case OP_CALL: case OP_TAILCALL: { if (b != 0) { checkreg(pt, a+b-1); } c--; /* c = num. returns */ if (c == LUA_MULTRET) { check(checkopenop(pt, pc)); } else if (c != 0) checkreg(pt, a+c-1); if (reg >= a) last = pc; /* affect all registers above base */ break; } case OP_RETURN: { b--; /* b = num. returns */ if (b > 0) checkreg(pt, a+b-1); break; } case OP_SETLIST: { if (b > 0) checkreg(pt, a + b); if (c == 0) pc++; break; } case OP_CLOSURE: { int nup, j; check(b < pt->sizep); nup = pt->p[b]->nups; check(pc + nup < pt->sizecode); for (j = 1; j <= nup; j++) { OpCode op1 = GET_OPCODE(pt->code[pc + j]); check(op1 == OP_GETUPVAL || op1 == OP_MOVE); } if (reg != NO_REG) /* tracing? */ pc += nup; /* do not 'execute' these pseudo-instructions */ break; } case OP_VARARG: { check((pt->is_vararg & VARARG_ISVARARG) && !(pt->is_vararg & VARARG_NEEDSARG)); b--; if (b == LUA_MULTRET) check(checkopenop(pt, pc)); checkreg(pt, a+b-1); break; } default: break; } } return pt->code[last]; } #undef check #undef checkjump #undef checkreg /* }====================================================== */ int luaG_checkcode (const Proto *pt) { return (symbexec(pt, pt->sizecode, NO_REG) != 0); } static const char *kname (Proto *p, int c) { if (ISK(c) && ttisstring(&p->k[INDEXK(c)])) return svalue(&p->k[INDEXK(c)]); else return "?"; } static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos, const char **name) { if (isLua(ci)) { /* a Lua function? */ Proto *p = ci_func(ci)->l.p; int pc = currentpc(L, ci); Instruction i; *name = luaF_getlocalname(p, stackpos+1, pc); if (*name) /* is a local? */ return "local"; i = symbexec(p, pc, stackpos); /* try symbolic execution */ lua_assert(pc != -1); switch (GET_OPCODE(i)) { case OP_GETGLOBAL: { int g = GETARG_Bx(i); /* global index */ lua_assert(ttisstring(&p->k[g])); *name = svalue(&p->k[g]); return "global"; } case OP_MOVE: { int a = GETARG_A(i); int b = GETARG_B(i); /* move from `b' to `a' */ if (b < a) return getobjname(L, ci, b, name); /* get name for `b' */ break; } case OP_GETTABLE: { int k = GETARG_C(i); /* key index */ *name = kname(p, k); return "field"; } case OP_GETUPVAL: { int u = GETARG_B(i); /* upvalue index */ *name = p->upvalues ? getstr(p->upvalues[u]) : "?"; return "upvalue"; } case OP_SELF: { int k = GETARG_C(i); /* key index */ *name = kname(p, k); return "method"; } default: break; } } return NULL; /* no useful name found */ } static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { Instruction i; if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) return NULL; /* calling function is not Lua (or is unknown) */ ci--; /* calling function */ i = ci_func(ci)->l.p->code[currentpc(L, ci)]; if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || GET_OPCODE(i) == OP_TFORLOOP) return getobjname(L, ci, GETARG_A(i), name); else return NULL; /* no useful name can be found */ } /* only ANSI way to check whether a pointer points to an array */ static int isinstack (CallInfo *ci, const TValue *o) { StkId p; for (p = ci->base; p < ci->top; p++) if (o == p) return 1; return 0; } void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { const char *name = NULL; const char *t = luaT_typenames[ttype(o)]; const char *kind = (isinstack(L->ci, o)) ? getobjname(L, L->ci, cast_int(o - L->base), &name) : NULL; if (kind) luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)", op, kind, name, t); else luaG_runerror(L, "attempt to %s a %s value", op, t); } void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { if (ttisstring(p1) || ttisnumber(p1)) p1 = p2; lua_assert(!ttisstring(p1) && !ttisnumber(p1)); luaG_typeerror(L, p1, "concatenate"); } void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) { TValue temp; if (luaV_tonumber(p1, &temp) == NULL) p2 = p1; /* first operand is wrong */ luaG_typeerror(L, p2, "perform arithmetic on"); } int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { const char *t1 = luaT_typenames[ttype(p1)]; const char *t2 = luaT_typenames[ttype(p2)]; if (t1[2] == t2[2]) luaG_runerror(L, "attempt to compare two %s values", t1); else luaG_runerror(L, "attempt to compare %s with %s", t1, t2); return 0; } static void addinfo (lua_State *L, const char *msg) { CallInfo *ci = L->ci; if (isLua(ci)) { /* is Lua code? */ char buff[LUA_IDSIZE]; /* add file:line information */ int line = currentline(L, ci); luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE); luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); } } void luaG_errormsg (lua_State *L) { if (L->errfunc != 0) { /* is there an error handling function? */ StkId errfunc = restorestack(L, L->errfunc); if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR); setobjs2s(L, L->top, L->top - 1); /* move argument */ setobjs2s(L, L->top - 1, errfunc); /* push function */ incr_top(L); luaD_call(L, L->top - 2, 1); /* call it */ } luaD_throw(L, LUA_ERRRUN); } void luaG_runerror (lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); addinfo(L, luaO_pushvfstring(L, fmt, argp)); va_end(argp); luaG_errormsg(L); } premake-3.7.orig/Src/Lua/lstrlib.c0000644000000000000000000005564011043456337013743 0ustar /* ** $Id: lstrlib.c,v 1.132.1.3 2007/12/28 15:32:23 roberto Exp $ ** Standard library for string operations and pattern-matching ** See Copyright Notice in lua.h */ #include #include #include #include #include #define lstrlib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" /* macro to `unsign' a character */ #define uchar(c) ((unsigned char)(c)) static int str_len (lua_State *L) { size_t l; luaL_checklstring(L, 1, &l); lua_pushinteger(L, l); return 1; } static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { /* relative string position: negative means back from end */ return (pos>=0) ? pos : (ptrdiff_t)len+pos+1; } static int str_sub (lua_State *L) { size_t l; const char *s = luaL_checklstring(L, 1, &l); ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l); ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l); if (start < 1) start = 1; if (end > (ptrdiff_t)l) end = (ptrdiff_t)l; if (start <= end) lua_pushlstring(L, s+start-1, end-start+1); else lua_pushliteral(L, ""); return 1; } static int str_reverse (lua_State *L) { size_t l; luaL_Buffer b; const char *s = luaL_checklstring(L, 1, &l); luaL_buffinit(L, &b); while (l--) luaL_addchar(&b, s[l]); luaL_pushresult(&b); return 1; } static int str_lower (lua_State *L) { size_t l; size_t i; luaL_Buffer b; const char *s = luaL_checklstring(L, 1, &l); luaL_buffinit(L, &b); for (i=0; i 0) luaL_addlstring(&b, s, l); luaL_pushresult(&b); return 1; } static int str_byte (lua_State *L) { size_t l; const char *s = luaL_checklstring(L, 1, &l); ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l); ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l); int n, i; if (posi <= 0) posi = 1; if ((size_t)pose > l) pose = l; if (posi > pose) return 0; /* empty interval; return no values */ n = (int)(pose - posi + 1); if (posi + n <= pose) /* overflow? */ luaL_error(L, "string slice too long"); luaL_checkstack(L, n, "string slice too long"); for (i=0; i= ms->level || ms->capture[l].len == CAP_UNFINISHED) return luaL_error(ms->L, "invalid capture index"); return l; } static int capture_to_close (MatchState *ms) { int level = ms->level; for (level--; level>=0; level--) if (ms->capture[level].len == CAP_UNFINISHED) return level; return luaL_error(ms->L, "invalid pattern capture"); } static const char *classend (MatchState *ms, const char *p) { switch (*p++) { case L_ESC: { if (*p == '\0') luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")"); return p+1; } case '[': { if (*p == '^') p++; do { /* look for a `]' */ if (*p == '\0') luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")"); if (*(p++) == L_ESC && *p != '\0') p++; /* skip escapes (e.g. `%]') */ } while (*p != ']'); return p+1; } default: { return p; } } } static int match_class (int c, int cl) { int res; switch (tolower(cl)) { case 'a' : res = isalpha(c); break; case 'c' : res = iscntrl(c); break; case 'd' : res = isdigit(c); break; case 'l' : res = islower(c); break; case 'p' : res = ispunct(c); break; case 's' : res = isspace(c); break; case 'u' : res = isupper(c); break; case 'w' : res = isalnum(c); break; case 'x' : res = isxdigit(c); break; case 'z' : res = (c == 0); break; default: return (cl == c); } return (islower(cl) ? res : !res); } static int matchbracketclass (int c, const char *p, const char *ec) { int sig = 1; if (*(p+1) == '^') { sig = 0; p++; /* skip the `^' */ } while (++p < ec) { if (*p == L_ESC) { p++; if (match_class(c, uchar(*p))) return sig; } else if ((*(p+1) == '-') && (p+2 < ec)) { p+=2; if (uchar(*(p-2)) <= c && c <= uchar(*p)) return sig; } else if (uchar(*p) == c) return sig; } return !sig; } static int singlematch (int c, const char *p, const char *ep) { switch (*p) { case '.': return 1; /* matches any char */ case L_ESC: return match_class(c, uchar(*(p+1))); case '[': return matchbracketclass(c, p, ep-1); default: return (uchar(*p) == c); } } static const char *match (MatchState *ms, const char *s, const char *p); static const char *matchbalance (MatchState *ms, const char *s, const char *p) { if (*p == 0 || *(p+1) == 0) luaL_error(ms->L, "unbalanced pattern"); if (*s != *p) return NULL; else { int b = *p; int e = *(p+1); int cont = 1; while (++s < ms->src_end) { if (*s == e) { if (--cont == 0) return s+1; } else if (*s == b) cont++; } } return NULL; /* string ends out of balance */ } static const char *max_expand (MatchState *ms, const char *s, const char *p, const char *ep) { ptrdiff_t i = 0; /* counts maximum expand for item */ while ((s+i)src_end && singlematch(uchar(*(s+i)), p, ep)) i++; /* keeps trying to match with the maximum repetitions */ while (i>=0) { const char *res = match(ms, (s+i), ep+1); if (res) return res; i--; /* else didn't match; reduce 1 repetition to try again */ } return NULL; } static const char *min_expand (MatchState *ms, const char *s, const char *p, const char *ep) { for (;;) { const char *res = match(ms, s, ep+1); if (res != NULL) return res; else if (ssrc_end && singlematch(uchar(*s), p, ep)) s++; /* try with one more repetition */ else return NULL; } } static const char *start_capture (MatchState *ms, const char *s, const char *p, int what) { const char *res; int level = ms->level; if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); ms->capture[level].init = s; ms->capture[level].len = what; ms->level = level+1; if ((res=match(ms, s, p)) == NULL) /* match failed? */ ms->level--; /* undo capture */ return res; } static const char *end_capture (MatchState *ms, const char *s, const char *p) { int l = capture_to_close(ms); const char *res; ms->capture[l].len = s - ms->capture[l].init; /* close capture */ if ((res = match(ms, s, p)) == NULL) /* match failed? */ ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ return res; } static const char *match_capture (MatchState *ms, const char *s, int l) { size_t len; l = check_capture(ms, l); len = ms->capture[l].len; if ((size_t)(ms->src_end-s) >= len && memcmp(ms->capture[l].init, s, len) == 0) return s+len; else return NULL; } static const char *match (MatchState *ms, const char *s, const char *p) { init: /* using goto's to optimize tail recursion */ switch (*p) { case '(': { /* start capture */ if (*(p+1) == ')') /* position capture? */ return start_capture(ms, s, p+2, CAP_POSITION); else return start_capture(ms, s, p+1, CAP_UNFINISHED); } case ')': { /* end capture */ return end_capture(ms, s, p+1); } case L_ESC: { switch (*(p+1)) { case 'b': { /* balanced string? */ s = matchbalance(ms, s, p+2); if (s == NULL) return NULL; p+=4; goto init; /* else return match(ms, s, p+4); */ } case 'f': { /* frontier? */ const char *ep; char previous; p += 2; if (*p != '[') luaL_error(ms->L, "missing " LUA_QL("[") " after " LUA_QL("%%f") " in pattern"); ep = classend(ms, p); /* points to what is next */ previous = (s == ms->src_init) ? '\0' : *(s-1); if (matchbracketclass(uchar(previous), p, ep-1) || !matchbracketclass(uchar(*s), p, ep-1)) return NULL; p=ep; goto init; /* else return match(ms, s, ep); */ } default: { if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */ s = match_capture(ms, s, uchar(*(p+1))); if (s == NULL) return NULL; p+=2; goto init; /* else return match(ms, s, p+2) */ } goto dflt; /* case default */ } } } case '\0': { /* end of pattern */ return s; /* match succeeded */ } case '$': { if (*(p+1) == '\0') /* is the `$' the last char in pattern? */ return (s == ms->src_end) ? s : NULL; /* check end of string */ else goto dflt; } default: dflt: { /* it is a pattern item */ const char *ep = classend(ms, p); /* points to what is next */ int m = ssrc_end && singlematch(uchar(*s), p, ep); switch (*ep) { case '?': { /* optional */ const char *res; if (m && ((res=match(ms, s+1, ep+1)) != NULL)) return res; p=ep+1; goto init; /* else return match(ms, s, ep+1); */ } case '*': { /* 0 or more repetitions */ return max_expand(ms, s, p, ep); } case '+': { /* 1 or more repetitions */ return (m ? max_expand(ms, s+1, p, ep) : NULL); } case '-': { /* 0 or more repetitions (minimum) */ return min_expand(ms, s, p, ep); } default: { if (!m) return NULL; s++; p=ep; goto init; /* else return match(ms, s+1, ep); */ } } } } } static const char *lmemfind (const char *s1, size_t l1, const char *s2, size_t l2) { if (l2 == 0) return s1; /* empty strings are everywhere */ else if (l2 > l1) return NULL; /* avoids a negative `l1' */ else { const char *init; /* to search for a `*s2' inside `s1' */ l2--; /* 1st char will be checked by `memchr' */ l1 = l1-l2; /* `s2' cannot be found after that */ while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { init++; /* 1st char is already checked */ if (memcmp(init, s2+1, l2) == 0) return init-1; else { /* correct `l1' and `s1' to try again */ l1 -= init-s1; s1 = init; } } return NULL; /* not found */ } } static void push_onecapture (MatchState *ms, int i, const char *s, const char *e) { if (i >= ms->level) { if (i == 0) /* ms->level == 0, too */ lua_pushlstring(ms->L, s, e - s); /* add whole match */ else luaL_error(ms->L, "invalid capture index"); } else { ptrdiff_t l = ms->capture[i].len; if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); if (l == CAP_POSITION) lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1); else lua_pushlstring(ms->L, ms->capture[i].init, l); } } static int push_captures (MatchState *ms, const char *s, const char *e) { int i; int nlevels = (ms->level == 0 && s) ? 1 : ms->level; luaL_checkstack(ms->L, nlevels, "too many captures"); for (i = 0; i < nlevels; i++) push_onecapture(ms, i, s, e); return nlevels; /* number of strings pushed */ } static int str_find_aux (lua_State *L, int find) { size_t l1, l2; const char *s = luaL_checklstring(L, 1, &l1); const char *p = luaL_checklstring(L, 2, &l2); ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; if (init < 0) init = 0; else if ((size_t)(init) > l1) init = (ptrdiff_t)l1; if (find && (lua_toboolean(L, 4) || /* explicit request? */ strpbrk(p, SPECIALS) == NULL)) { /* or no special characters? */ /* do a plain search */ const char *s2 = lmemfind(s+init, l1-init, p, l2); if (s2) { lua_pushinteger(L, s2-s+1); lua_pushinteger(L, s2-s+l2); return 2; } } else { MatchState ms; int anchor = (*p == '^') ? (p++, 1) : 0; const char *s1=s+init; ms.L = L; ms.src_init = s; ms.src_end = s+l1; do { const char *res; ms.level = 0; if ((res=match(&ms, s1, p)) != NULL) { if (find) { lua_pushinteger(L, s1-s+1); /* start */ lua_pushinteger(L, res-s); /* end */ return push_captures(&ms, NULL, 0) + 2; } else return push_captures(&ms, s1, res); } } while (s1++ < ms.src_end && !anchor); } lua_pushnil(L); /* not found */ return 1; } static int str_find (lua_State *L) { return str_find_aux(L, 1); } static int str_match (lua_State *L) { return str_find_aux(L, 0); } static int gmatch_aux (lua_State *L) { MatchState ms; size_t ls; const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); const char *p = lua_tostring(L, lua_upvalueindex(2)); const char *src; ms.L = L; ms.src_init = s; ms.src_end = s+ls; for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3)); src <= ms.src_end; src++) { const char *e; ms.level = 0; if ((e = match(&ms, src, p)) != NULL) { lua_Integer newstart = e-s; if (e == src) newstart++; /* empty match? go at least one position */ lua_pushinteger(L, newstart); lua_replace(L, lua_upvalueindex(3)); return push_captures(&ms, src, e); } } return 0; /* not found */ } static int gmatch (lua_State *L) { luaL_checkstring(L, 1); luaL_checkstring(L, 2); lua_settop(L, 2); lua_pushinteger(L, 0); lua_pushcclosure(L, gmatch_aux, 3); return 1; } static int gfind_nodef (lua_State *L) { return luaL_error(L, LUA_QL("string.gfind") " was renamed to " LUA_QL("string.gmatch")); } static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, const char *e) { size_t l, i; const char *news = lua_tolstring(ms->L, 3, &l); for (i = 0; i < l; i++) { if (news[i] != L_ESC) luaL_addchar(b, news[i]); else { i++; /* skip ESC */ if (!isdigit(uchar(news[i]))) luaL_addchar(b, news[i]); else if (news[i] == '0') luaL_addlstring(b, s, e - s); else { push_onecapture(ms, news[i] - '1', s, e); luaL_addvalue(b); /* add capture to accumulated result */ } } } } static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, const char *e) { lua_State *L = ms->L; switch (lua_type(L, 3)) { case LUA_TNUMBER: case LUA_TSTRING: { add_s(ms, b, s, e); return; } case LUA_TFUNCTION: { int n; lua_pushvalue(L, 3); n = push_captures(ms, s, e); lua_call(L, n, 1); break; } case LUA_TTABLE: { push_onecapture(ms, 0, s, e); lua_gettable(L, 3); break; } } if (!lua_toboolean(L, -1)) { /* nil or false? */ lua_pop(L, 1); lua_pushlstring(L, s, e - s); /* keep original text */ } else if (!lua_isstring(L, -1)) luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); luaL_addvalue(b); /* add result to accumulator */ } static int str_gsub (lua_State *L) { size_t srcl; const char *src = luaL_checklstring(L, 1, &srcl); const char *p = luaL_checkstring(L, 2); int tr = lua_type(L, 3); int max_s = luaL_optint(L, 4, srcl+1); int anchor = (*p == '^') ? (p++, 1) : 0; int n = 0; MatchState ms; luaL_Buffer b; luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, "string/function/table expected"); luaL_buffinit(L, &b); ms.L = L; ms.src_init = src; ms.src_end = src+srcl; while (n < max_s) { const char *e; ms.level = 0; e = match(&ms, src, p); if (e) { n++; add_value(&ms, &b, src, e); } if (e && e>src) /* non empty match? */ src = e; /* skip it */ else if (src < ms.src_end) luaL_addchar(&b, *src++); else break; if (anchor) break; } luaL_addlstring(&b, src, ms.src_end-src); luaL_pushresult(&b); lua_pushinteger(L, n); /* number of substitutions */ return 2; } /* }====================================================== */ /* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ #define MAX_ITEM 512 /* valid flags in a format specification */ #define FLAGS "-+ #0" /* ** maximum size of each format specification (such as '%-099.99d') ** (+10 accounts for %99.99x plus margin of error) */ #define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10) static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { size_t l; const char *s = luaL_checklstring(L, arg, &l); luaL_addchar(b, '"'); while (l--) { switch (*s) { case '"': case '\\': case '\n': { luaL_addchar(b, '\\'); luaL_addchar(b, *s); break; } case '\r': { luaL_addlstring(b, "\\r", 2); break; } case '\0': { luaL_addlstring(b, "\\000", 4); break; } default: { luaL_addchar(b, *s); break; } } s++; } luaL_addchar(b, '"'); } static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { const char *p = strfrmt; while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */ if ((size_t)(p - strfrmt) >= sizeof(FLAGS)) luaL_error(L, "invalid format (repeated flags)"); if (isdigit(uchar(*p))) p++; /* skip width */ if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ if (*p == '.') { p++; if (isdigit(uchar(*p))) p++; /* skip precision */ if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ } if (isdigit(uchar(*p))) luaL_error(L, "invalid format (width or precision too long)"); *(form++) = '%'; strncpy(form, strfrmt, p - strfrmt + 1); form += p - strfrmt + 1; *form = '\0'; return p; } static void addintlen (char *form) { size_t l = strlen(form); char spec = form[l - 1]; strcpy(form + l - 1, LUA_INTFRMLEN); form[l + sizeof(LUA_INTFRMLEN) - 2] = spec; form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; } static int str_format (lua_State *L) { int arg = 1; size_t sfl; const char *strfrmt = luaL_checklstring(L, arg, &sfl); const char *strfrmt_end = strfrmt+sfl; luaL_Buffer b; luaL_buffinit(L, &b); while (strfrmt < strfrmt_end) { if (*strfrmt != L_ESC) luaL_addchar(&b, *strfrmt++); else if (*++strfrmt == L_ESC) luaL_addchar(&b, *strfrmt++); /* %% */ else { /* format item */ char form[MAX_FORMAT]; /* to store the format (`%...') */ char buff[MAX_ITEM]; /* to store the formatted item */ arg++; strfrmt = scanformat(L, strfrmt, form); switch (*strfrmt++) { case 'c': { sprintf(buff, form, (int)luaL_checknumber(L, arg)); break; } case 'd': case 'i': { addintlen(form); sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg)); break; } case 'o': case 'u': case 'x': case 'X': { addintlen(form); sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg)); break; } case 'e': case 'E': case 'f': case 'g': case 'G': { sprintf(buff, form, (double)luaL_checknumber(L, arg)); break; } case 'q': { addquoted(L, &b, arg); continue; /* skip the 'addsize' at the end */ } case 's': { size_t l; const char *s = luaL_checklstring(L, arg, &l); if (!strchr(form, '.') && l >= 100) { /* no precision and string is too long to be formatted; keep original string */ lua_pushvalue(L, arg); luaL_addvalue(&b); continue; /* skip the `addsize' at the end */ } else { sprintf(buff, form, s); break; } } default: { /* also treat cases `pnLlh' */ return luaL_error(L, "invalid option " LUA_QL("%%%c") " to " LUA_QL("format"), *(strfrmt - 1)); } } luaL_addlstring(&b, buff, strlen(buff)); } } luaL_pushresult(&b); return 1; } static const luaL_Reg strlib[] = { {"byte", str_byte}, {"char", str_char}, {"dump", str_dump}, {"find", str_find}, {"format", str_format}, {"gfind", gfind_nodef}, {"gmatch", gmatch}, {"gsub", str_gsub}, {"len", str_len}, {"lower", str_lower}, {"match", str_match}, {"rep", str_rep}, {"reverse", str_reverse}, {"sub", str_sub}, {"upper", str_upper}, {NULL, NULL} }; static void createmetatable (lua_State *L) { lua_createtable(L, 0, 1); /* create metatable for strings */ lua_pushliteral(L, ""); /* dummy string */ lua_pushvalue(L, -2); lua_setmetatable(L, -2); /* set string metatable */ lua_pop(L, 1); /* pop dummy string */ lua_pushvalue(L, -2); /* string library... */ lua_setfield(L, -2, "__index"); /* ...is the __index metamethod */ lua_pop(L, 1); /* pop metatable */ } /* ** Open string library */ LUALIB_API int luaopen_string (lua_State *L) { luaL_register(L, LUA_STRLIBNAME, strlib); #if defined(LUA_COMPAT_GFIND) lua_getfield(L, -1, "gmatch"); lua_setfield(L, -2, "gfind"); #endif createmetatable(L); return 1; } premake-3.7.orig/Src/Lua/COPYRIGHT0000644000000000000000000000277010504524316013405 0ustar Lua License ----------- Lua is licensed under the terms of the MIT license reproduced below. This means that Lua is free software and can be used for both academic and commercial purposes at absolutely no cost. For details and rationale, see http://www.lua.org/license.html . =============================================================================== Copyright (C) 2003-2006 Tecgraf, PUC-Rio. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =============================================================================== (end of COPYRIGHT) premake-3.7.orig/Src/Lua/lmem.h0000644000000000000000000000272611043456337013224 0ustar /* ** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */ #ifndef lmem_h #define lmem_h #include #include "llimits.h" #include "lua.h" #define MEMERRMSG "not enough memory" #define luaM_reallocv(L,b,on,n,e) \ ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \ luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \ luaM_toobig(L)) #define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0) #define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0) #define luaM_freearray(L, b, n, t) luaM_reallocv(L, (b), n, 0, sizeof(t)) #define luaM_malloc(L,t) luaM_realloc_(L, NULL, 0, (t)) #define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t))) #define luaM_newvector(L,n,t) \ cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t))) #define luaM_growvector(L,v,nelems,size,t,limit,e) \ if ((nelems)+1 > (size)) \ ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) #define luaM_reallocvector(L, v,oldn,n,t) \ ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t)))) LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, size_t size); LUAI_FUNC void *luaM_toobig (lua_State *L); LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elem, int limit, const char *errormsg); #endif premake-3.7.orig/Src/Lua/lstate.c0000644000000000000000000001305211043456337013553 0ustar /* ** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $ ** Global State ** See Copyright Notice in lua.h */ #include #define lstate_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lgc.h" #include "llex.h" #include "lmem.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "ltm.h" #define state_size(x) (sizeof(x) + LUAI_EXTRASPACE) #define fromstate(l) (cast(lu_byte *, (l)) - LUAI_EXTRASPACE) #define tostate(l) (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE)) /* ** Main thread combines a thread state and the global state */ typedef struct LG { lua_State l; global_State g; } LG; static void stack_init (lua_State *L1, lua_State *L) { /* initialize CallInfo array */ L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); L1->ci = L1->base_ci; L1->size_ci = BASIC_CI_SIZE; L1->end_ci = L1->base_ci + L1->size_ci - 1; /* initialize stack array */ L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; L1->top = L1->stack; L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; /* initialize first ci */ L1->ci->func = L1->top; setnilvalue(L1->top++); /* `function' entry for this `ci' */ L1->base = L1->ci->base = L1->top; L1->ci->top = L1->top + LUA_MINSTACK; } static void freestack (lua_State *L, lua_State *L1) { luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo); luaM_freearray(L, L1->stack, L1->stacksize, TValue); } /* ** open parts that may cause memory-allocation errors */ static void f_luaopen (lua_State *L, void *ud) { global_State *g = G(L); UNUSED(ud); stack_init(L, L); /* init stack */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ luaT_init(L); luaX_init(L); luaS_fix(luaS_newliteral(L, MEMERRMSG)); g->GCthreshold = 4*g->totalbytes; } static void preinit_state (lua_State *L, global_State *g) { G(L) = g; L->stack = NULL; L->stacksize = 0; L->errorJmp = NULL; L->hook = NULL; L->hookmask = 0; L->basehookcount = 0; L->allowhook = 1; resethookcount(L); L->openupval = NULL; L->size_ci = 0; L->nCcalls = L->baseCcalls = 0; L->status = 0; L->base_ci = L->ci = NULL; L->savedpc = NULL; L->errfunc = 0; setnilvalue(gt(L)); } static void close_state (lua_State *L) { global_State *g = G(L); luaF_close(L, L->stack); /* close all upvalues for this thread */ luaC_freeall(L); /* collect all objects */ lua_assert(g->rootgc == obj2gco(L)); lua_assert(g->strt.nuse == 0); luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); luaZ_freebuffer(L, &g->buff); freestack(L, L); lua_assert(g->totalbytes == sizeof(LG)); (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); } lua_State *luaE_newthread (lua_State *L) { lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State))); luaC_link(L, obj2gco(L1), LUA_TTHREAD); preinit_state(L1, G(L)); stack_init(L1, L); /* init stack */ setobj2n(L, gt(L1), gt(L)); /* share table of globals */ L1->hookmask = L->hookmask; L1->basehookcount = L->basehookcount; L1->hook = L->hook; resethookcount(L1); lua_assert(iswhite(obj2gco(L1))); return L1; } void luaE_freethread (lua_State *L, lua_State *L1) { luaF_close(L1, L1->stack); /* close all upvalues for this thread */ lua_assert(L1->openupval == NULL); luai_userstatefree(L1); freestack(L, L1); luaM_freemem(L, fromstate(L1), state_size(lua_State)); } LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { int i; lua_State *L; global_State *g; void *l = (*f)(ud, NULL, 0, state_size(LG)); if (l == NULL) return NULL; L = tostate(l); g = &((LG *)L)->g; L->next = NULL; L->tt = LUA_TTHREAD; g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); L->marked = luaC_white(g); set2bits(L->marked, FIXEDBIT, SFIXEDBIT); preinit_state(L, g); g->frealloc = f; g->ud = ud; g->mainthread = L; g->uvhead.u.l.prev = &g->uvhead; g->uvhead.u.l.next = &g->uvhead; g->GCthreshold = 0; /* mark it as unfinished state */ g->strt.size = 0; g->strt.nuse = 0; g->strt.hash = NULL; setnilvalue(registry(L)); luaZ_initbuffer(L, &g->buff); g->panic = NULL; g->gcstate = GCSpause; g->rootgc = obj2gco(L); g->sweepstrgc = 0; g->sweepgc = &g->rootgc; g->gray = NULL; g->grayagain = NULL; g->weak = NULL; g->tmudata = NULL; g->totalbytes = sizeof(LG); g->gcpause = LUAI_GCPAUSE; g->gcstepmul = LUAI_GCMUL; g->gcdept = 0; for (i=0; imt[i] = NULL; if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { /* memory allocation error: free partial state */ close_state(L); L = NULL; } else luai_userstateopen(L); return L; } static void callallgcTM (lua_State *L, void *ud) { UNUSED(ud); luaC_callGCTM(L); /* call GC metamethods for all udata */ } LUA_API void lua_close (lua_State *L) { L = G(L)->mainthread; /* only the main thread can be closed */ lua_lock(L); luaF_close(L, L->stack); /* close all upvalues for this thread */ luaC_separateudata(L, 1); /* separate udata that have GC metamethods */ L->errfunc = 0; /* no error function during GC metamethods */ do { /* repeat until no more errors */ L->ci = L->base_ci; L->base = L->top = L->ci->base; L->nCcalls = L->baseCcalls = 0; } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); lua_assert(G(L)->tmudata == NULL); luai_userstateclose(L); close_state(L); } premake-3.7.orig/Src/Lua/ldblib.c0000644000000000000000000002352511043456337013515 0ustar /* ** $Id: ldblib.c,v 1.104.1.3 2008/01/21 13:11:21 roberto Exp $ ** Interface from Lua to its debug API ** See Copyright Notice in lua.h */ #include #include #include #define ldblib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" static int db_getregistry (lua_State *L) { lua_pushvalue(L, LUA_REGISTRYINDEX); return 1; } static int db_getmetatable (lua_State *L) { luaL_checkany(L, 1); if (!lua_getmetatable(L, 1)) { lua_pushnil(L); /* no metatable */ } return 1; } static int db_setmetatable (lua_State *L) { int t = lua_type(L, 2); luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table expected"); lua_settop(L, 2); lua_pushboolean(L, lua_setmetatable(L, 1)); return 1; } static int db_getfenv (lua_State *L) { lua_getfenv(L, 1); return 1; } static int db_setfenv (lua_State *L) { luaL_checktype(L, 2, LUA_TTABLE); lua_settop(L, 2); if (lua_setfenv(L, 1) == 0) luaL_error(L, LUA_QL("setfenv") " cannot change environment of given object"); return 1; } static void settabss (lua_State *L, const char *i, const char *v) { lua_pushstring(L, v); lua_setfield(L, -2, i); } static void settabsi (lua_State *L, const char *i, int v) { lua_pushinteger(L, v); lua_setfield(L, -2, i); } static lua_State *getthread (lua_State *L, int *arg) { if (lua_isthread(L, 1)) { *arg = 1; return lua_tothread(L, 1); } else { *arg = 0; return L; } } static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { if (L == L1) { lua_pushvalue(L, -2); lua_remove(L, -3); } else lua_xmove(L1, L, 1); lua_setfield(L, -2, fname); } static int db_getinfo (lua_State *L) { lua_Debug ar; int arg; lua_State *L1 = getthread(L, &arg); const char *options = luaL_optstring(L, arg+2, "flnSu"); if (lua_isnumber(L, arg+1)) { if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) { lua_pushnil(L); /* level out of range */ return 1; } } else if (lua_isfunction(L, arg+1)) { lua_pushfstring(L, ">%s", options); options = lua_tostring(L, -1); lua_pushvalue(L, arg+1); lua_xmove(L, L1, 1); } else return luaL_argerror(L, arg+1, "function or level expected"); if (!lua_getinfo(L1, options, &ar)) return luaL_argerror(L, arg+2, "invalid option"); lua_createtable(L, 0, 2); if (strchr(options, 'S')) { settabss(L, "source", ar.source); settabss(L, "short_src", ar.short_src); settabsi(L, "linedefined", ar.linedefined); settabsi(L, "lastlinedefined", ar.lastlinedefined); settabss(L, "what", ar.what); } if (strchr(options, 'l')) settabsi(L, "currentline", ar.currentline); if (strchr(options, 'u')) settabsi(L, "nups", ar.nups); if (strchr(options, 'n')) { settabss(L, "name", ar.name); settabss(L, "namewhat", ar.namewhat); } if (strchr(options, 'L')) treatstackoption(L, L1, "activelines"); if (strchr(options, 'f')) treatstackoption(L, L1, "func"); return 1; /* return table */ } static int db_getlocal (lua_State *L) { int arg; lua_State *L1 = getthread(L, &arg); lua_Debug ar; const char *name; if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ return luaL_argerror(L, arg+1, "level out of range"); name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2)); if (name) { lua_xmove(L1, L, 1); lua_pushstring(L, name); lua_pushvalue(L, -2); return 2; } else { lua_pushnil(L); return 1; } } static int db_setlocal (lua_State *L) { int arg; lua_State *L1 = getthread(L, &arg); lua_Debug ar; if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ return luaL_argerror(L, arg+1, "level out of range"); luaL_checkany(L, arg+3); lua_settop(L, arg+3); lua_xmove(L, L1, 1); lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2))); return 1; } static int auxupvalue (lua_State *L, int get) { const char *name; int n = luaL_checkint(L, 2); luaL_checktype(L, 1, LUA_TFUNCTION); if (lua_iscfunction(L, 1)) return 0; /* cannot touch C upvalues from Lua */ name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); if (name == NULL) return 0; lua_pushstring(L, name); lua_insert(L, -(get+1)); return get + 1; } static int db_getupvalue (lua_State *L) { return auxupvalue(L, 1); } static int db_setupvalue (lua_State *L) { luaL_checkany(L, 3); return auxupvalue(L, 0); } static const char KEY_HOOK = 'h'; static void hookf (lua_State *L, lua_Debug *ar) { static const char *const hooknames[] = {"call", "return", "line", "count", "tail return"}; lua_pushlightuserdata(L, (void *)&KEY_HOOK); lua_rawget(L, LUA_REGISTRYINDEX); lua_pushlightuserdata(L, L); lua_rawget(L, -2); if (lua_isfunction(L, -1)) { lua_pushstring(L, hooknames[(int)ar->event]); if (ar->currentline >= 0) lua_pushinteger(L, ar->currentline); else lua_pushnil(L); lua_assert(lua_getinfo(L, "lS", ar)); lua_call(L, 2, 0); } } static int makemask (const char *smask, int count) { int mask = 0; if (strchr(smask, 'c')) mask |= LUA_MASKCALL; if (strchr(smask, 'r')) mask |= LUA_MASKRET; if (strchr(smask, 'l')) mask |= LUA_MASKLINE; if (count > 0) mask |= LUA_MASKCOUNT; return mask; } static char *unmakemask (int mask, char *smask) { int i = 0; if (mask & LUA_MASKCALL) smask[i++] = 'c'; if (mask & LUA_MASKRET) smask[i++] = 'r'; if (mask & LUA_MASKLINE) smask[i++] = 'l'; smask[i] = '\0'; return smask; } static void gethooktable (lua_State *L) { lua_pushlightuserdata(L, (void *)&KEY_HOOK); lua_rawget(L, LUA_REGISTRYINDEX); if (!lua_istable(L, -1)) { lua_pop(L, 1); lua_createtable(L, 0, 1); lua_pushlightuserdata(L, (void *)&KEY_HOOK); lua_pushvalue(L, -2); lua_rawset(L, LUA_REGISTRYINDEX); } } static int db_sethook (lua_State *L) { int arg, mask, count; lua_Hook func; lua_State *L1 = getthread(L, &arg); if (lua_isnoneornil(L, arg+1)) { lua_settop(L, arg+1); func = NULL; mask = 0; count = 0; /* turn off hooks */ } else { const char *smask = luaL_checkstring(L, arg+2); luaL_checktype(L, arg+1, LUA_TFUNCTION); count = luaL_optint(L, arg+3, 0); func = hookf; mask = makemask(smask, count); } gethooktable(L); lua_pushlightuserdata(L, L1); lua_pushvalue(L, arg+1); lua_rawset(L, -3); /* set new hook */ lua_pop(L, 1); /* remove hook table */ lua_sethook(L1, func, mask, count); /* set hooks */ return 0; } static int db_gethook (lua_State *L) { int arg; lua_State *L1 = getthread(L, &arg); char buff[5]; int mask = lua_gethookmask(L1); lua_Hook hook = lua_gethook(L1); if (hook != NULL && hook != hookf) /* external hook? */ lua_pushliteral(L, "external hook"); else { gethooktable(L); lua_pushlightuserdata(L, L1); lua_rawget(L, -2); /* get hook */ lua_remove(L, -2); /* remove hook table */ } lua_pushstring(L, unmakemask(mask, buff)); lua_pushinteger(L, lua_gethookcount(L1)); return 3; } static int db_debug (lua_State *L) { for (;;) { char buffer[250]; fputs("lua_debug> ", stderr); if (fgets(buffer, sizeof(buffer), stdin) == 0 || strcmp(buffer, "cont\n") == 0) return 0; if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || lua_pcall(L, 0, 0, 0)) { fputs(lua_tostring(L, -1), stderr); fputs("\n", stderr); } lua_settop(L, 0); /* remove eventual returns */ } } #define LEVELS1 12 /* size of the first part of the stack */ #define LEVELS2 10 /* size of the second part of the stack */ static int db_errorfb (lua_State *L) { int level; int firstpart = 1; /* still before eventual `...' */ int arg; lua_State *L1 = getthread(L, &arg); lua_Debug ar; if (lua_isnumber(L, arg+2)) { level = (int)lua_tointeger(L, arg+2); lua_pop(L, 1); } else level = (L == L1) ? 1 : 0; /* level 0 may be this own function */ if (lua_gettop(L) == arg) lua_pushliteral(L, ""); else if (!lua_isstring(L, arg+1)) return 1; /* message is not a string */ else lua_pushliteral(L, "\n"); lua_pushliteral(L, "stack traceback:"); while (lua_getstack(L1, level++, &ar)) { if (level > LEVELS1 && firstpart) { /* no more than `LEVELS2' more levels? */ if (!lua_getstack(L1, level+LEVELS2, &ar)) level--; /* keep going */ else { lua_pushliteral(L, "\n\t..."); /* too many levels */ while (lua_getstack(L1, level+LEVELS2, &ar)) /* find last levels */ level++; } firstpart = 0; continue; } lua_pushliteral(L, "\n\t"); lua_getinfo(L1, "Snl", &ar); lua_pushfstring(L, "%s:", ar.short_src); if (ar.currentline > 0) lua_pushfstring(L, "%d:", ar.currentline); if (*ar.namewhat != '\0') /* is there a name? */ lua_pushfstring(L, " in function " LUA_QS, ar.name); else { if (*ar.what == 'm') /* main? */ lua_pushfstring(L, " in main chunk"); else if (*ar.what == 'C' || *ar.what == 't') lua_pushliteral(L, " ?"); /* C function or tail call */ else lua_pushfstring(L, " in function <%s:%d>", ar.short_src, ar.linedefined); } lua_concat(L, lua_gettop(L) - arg); } lua_concat(L, lua_gettop(L) - arg); return 1; } static const luaL_Reg dblib[] = { {"debug", db_debug}, {"getfenv", db_getfenv}, {"gethook", db_gethook}, {"getinfo", db_getinfo}, {"getlocal", db_getlocal}, {"getregistry", db_getregistry}, {"getmetatable", db_getmetatable}, {"getupvalue", db_getupvalue}, {"setfenv", db_setfenv}, {"sethook", db_sethook}, {"setlocal", db_setlocal}, {"setmetatable", db_setmetatable}, {"setupvalue", db_setupvalue}, {"traceback", db_errorfb}, {NULL, NULL} }; LUALIB_API int luaopen_debug (lua_State *L) { luaL_register(L, LUA_DBLIBNAME, dblib); return 1; } premake-3.7.orig/Src/Lua/lualib.h0000644000000000000000000000200211043456337013525 0ustar /* ** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua standard libraries ** See Copyright Notice in lua.h */ #ifndef lualib_h #define lualib_h #include "lua.h" /* Key to file-handle type */ #define LUA_FILEHANDLE "FILE*" #define LUA_COLIBNAME "coroutine" LUALIB_API int (luaopen_base) (lua_State *L); #define LUA_TABLIBNAME "table" LUALIB_API int (luaopen_table) (lua_State *L); #define LUA_IOLIBNAME "io" LUALIB_API int (luaopen_io) (lua_State *L); #define LUA_OSLIBNAME "os" LUALIB_API int (luaopen_os) (lua_State *L); #define LUA_STRLIBNAME "string" LUALIB_API int (luaopen_string) (lua_State *L); #define LUA_MATHLIBNAME "math" LUALIB_API int (luaopen_math) (lua_State *L); #define LUA_DBLIBNAME "debug" LUALIB_API int (luaopen_debug) (lua_State *L); #define LUA_LOADLIBNAME "package" LUALIB_API int (luaopen_package) (lua_State *L); /* open all previous libraries */ LUALIB_API void (luaL_openlibs) (lua_State *L); #ifndef lua_assert #define lua_assert(x) ((void)0) #endif #endif premake-3.7.orig/Src/Lua/llex.h0000644000000000000000000000420111043456337013224 0ustar /* ** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lexical Analyzer ** See Copyright Notice in lua.h */ #ifndef llex_h #define llex_h #include "lobject.h" #include "lzio.h" #define FIRST_RESERVED 257 /* maximum length of a reserved word */ #define TOKEN_LEN (sizeof("function")/sizeof(char)) /* * WARNING: if you change the order of this enumeration, * grep "ORDER RESERVED" */ enum RESERVED { /* terminal symbols denoted by reserved words */ TK_AND = FIRST_RESERVED, TK_BREAK, TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, /* other terminal symbols */ TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, TK_NAME, TK_STRING, TK_EOS }; /* number of reserved words */ #define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) /* array with token `names' */ LUAI_DATA const char *const luaX_tokens []; typedef union { lua_Number r; TString *ts; } SemInfo; /* semantics information */ typedef struct Token { int token; SemInfo seminfo; } Token; typedef struct LexState { int current; /* current character (charint) */ int linenumber; /* input line counter */ int lastline; /* line of last token `consumed' */ Token t; /* current token */ Token lookahead; /* look ahead token */ struct FuncState *fs; /* `FuncState' is private to the parser */ struct lua_State *L; ZIO *z; /* input stream */ Mbuffer *buff; /* buffer for tokens */ TString *source; /* current source name */ char decpoint; /* locale decimal point */ } LexState; LUAI_FUNC void luaX_init (lua_State *L); LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source); LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); LUAI_FUNC void luaX_next (LexState *ls); LUAI_FUNC void luaX_lookahead (LexState *ls); LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token); LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s); LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); #endif premake-3.7.orig/Src/Lua/lstring.c0000644000000000000000000000604611043456337013746 0ustar /* ** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** String table (keeps all strings handled by Lua) ** See Copyright Notice in lua.h */ #include #define lstring_c #define LUA_CORE #include "lua.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" void luaS_resize (lua_State *L, int newsize) { GCObject **newhash; stringtable *tb; int i; if (G(L)->gcstate == GCSsweepstring) return; /* cannot resize during GC traverse */ newhash = luaM_newvector(L, newsize, GCObject *); tb = &G(L)->strt; for (i=0; isize; i++) { GCObject *p = tb->hash[i]; while (p) { /* for each node in the list */ GCObject *next = p->gch.next; /* save next */ unsigned int h = gco2ts(p)->hash; int h1 = lmod(h, newsize); /* new position */ lua_assert(cast_int(h%newsize) == lmod(h, newsize)); p->gch.next = newhash[h1]; /* chain it */ newhash[h1] = p; p = next; } } luaM_freearray(L, tb->hash, tb->size, TString *); tb->size = newsize; tb->hash = newhash; } static TString *newlstr (lua_State *L, const char *str, size_t l, unsigned int h) { TString *ts; stringtable *tb; if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) luaM_toobig(L); ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString))); ts->tsv.len = l; ts->tsv.hash = h; ts->tsv.marked = luaC_white(G(L)); ts->tsv.tt = LUA_TSTRING; ts->tsv.reserved = 0; memcpy(ts+1, str, l*sizeof(char)); ((char *)(ts+1))[l] = '\0'; /* ending 0 */ tb = &G(L)->strt; h = lmod(h, tb->size); ts->tsv.next = tb->hash[h]; /* chain new entry */ tb->hash[h] = obj2gco(ts); tb->nuse++; if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) luaS_resize(L, tb->size*2); /* too crowded */ return ts; } TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { GCObject *o; unsigned int h = cast(unsigned int, l); /* seed */ size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ size_t l1; for (l1=l; l1>=step; l1-=step) /* compute hash */ h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; o != NULL; o = o->gch.next) { TString *ts = rawgco2ts(o); if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) { /* string may be dead */ if (isdead(G(L), o)) changewhite(o); return ts; } } return newlstr(L, str, l, h); /* not found */ } Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { Udata *u; if (s > MAX_SIZET - sizeof(Udata)) luaM_toobig(L); u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata))); u->uv.marked = luaC_white(G(L)); /* is not finalized */ u->uv.tt = LUA_TUSERDATA; u->uv.len = s; u->uv.metatable = NULL; u->uv.env = e; /* chain it on udata list (after main thread) */ u->uv.next = G(L)->mainthread->next; G(L)->mainthread->next = obj2gco(u); return u; } premake-3.7.orig/Src/Lua/lstate.h0000644000000000000000000001162311043456337013562 0ustar /* ** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $ ** Global State ** See Copyright Notice in lua.h */ #ifndef lstate_h #define lstate_h #include "lua.h" #include "lobject.h" #include "ltm.h" #include "lzio.h" struct lua_longjmp; /* defined in ldo.c */ /* table of globals */ #define gt(L) (&L->l_gt) /* registry */ #define registry(L) (&G(L)->l_registry) /* extra stack space to handle TM calls and some other extras */ #define EXTRA_STACK 5 #define BASIC_CI_SIZE 8 #define BASIC_STACK_SIZE (2*LUA_MINSTACK) typedef struct stringtable { GCObject **hash; lu_int32 nuse; /* number of elements */ int size; } stringtable; /* ** informations about a call */ typedef struct CallInfo { StkId base; /* base for this function */ StkId func; /* function index in the stack */ StkId top; /* top for this function */ const Instruction *savedpc; int nresults; /* expected number of results from this function */ int tailcalls; /* number of tail calls lost under this entry */ } CallInfo; #define curr_func(L) (clvalue(L->ci->func)) #define ci_func(ci) (clvalue((ci)->func)) #define f_isLua(ci) (!ci_func(ci)->c.isC) #define isLua(ci) (ttisfunction((ci)->func) && f_isLua(ci)) /* ** `global state', shared by all threads of this state */ typedef struct global_State { stringtable strt; /* hash table for strings */ lua_Alloc frealloc; /* function to reallocate memory */ void *ud; /* auxiliary data to `frealloc' */ lu_byte currentwhite; lu_byte gcstate; /* state of garbage collector */ int sweepstrgc; /* position of sweep in `strt' */ GCObject *rootgc; /* list of all collectable objects */ GCObject **sweepgc; /* position of sweep in `rootgc' */ GCObject *gray; /* list of gray objects */ GCObject *grayagain; /* list of objects to be traversed atomically */ GCObject *weak; /* list of weak tables (to be cleared) */ GCObject *tmudata; /* last element of list of userdata to be GC */ Mbuffer buff; /* temporary buffer for string concatentation */ lu_mem GCthreshold; lu_mem totalbytes; /* number of bytes currently allocated */ lu_mem estimate; /* an estimate of number of bytes actually in use */ lu_mem gcdept; /* how much GC is `behind schedule' */ int gcpause; /* size of pause between successive GCs */ int gcstepmul; /* GC `granularity' */ lua_CFunction panic; /* to be called in unprotected errors */ TValue l_registry; struct lua_State *mainthread; UpVal uvhead; /* head of double-linked list of all open upvalues */ struct Table *mt[NUM_TAGS]; /* metatables for basic types */ TString *tmname[TM_N]; /* array with tag-method names */ } global_State; /* ** `per thread' state */ struct lua_State { CommonHeader; lu_byte status; StkId top; /* first free slot in the stack */ StkId base; /* base of current function */ global_State *l_G; CallInfo *ci; /* call info for current function */ const Instruction *savedpc; /* `savedpc' of current function */ StkId stack_last; /* last free slot in the stack */ StkId stack; /* stack base */ CallInfo *end_ci; /* points after end of ci array*/ CallInfo *base_ci; /* array of CallInfo's */ int stacksize; int size_ci; /* size of array `base_ci' */ unsigned short nCcalls; /* number of nested C calls */ unsigned short baseCcalls; /* nested C calls when resuming coroutine */ lu_byte hookmask; lu_byte allowhook; int basehookcount; int hookcount; lua_Hook hook; TValue l_gt; /* table of globals */ TValue env; /* temporary place for environments */ GCObject *openupval; /* list of open upvalues in this stack */ GCObject *gclist; struct lua_longjmp *errorJmp; /* current error recover point */ ptrdiff_t errfunc; /* current error handling function (stack index) */ }; #define G(L) (L->l_G) /* ** Union of all collectable objects */ union GCObject { GCheader gch; union TString ts; union Udata u; union Closure cl; struct Table h; struct Proto p; struct UpVal uv; struct lua_State th; /* thread */ }; /* macros to convert a GCObject into a specific value */ #define rawgco2ts(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) #define gco2ts(o) (&rawgco2ts(o)->tsv) #define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) #define gco2u(o) (&rawgco2u(o)->uv) #define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) #define gco2h(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) #define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) #define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) #define ngcotouv(o) \ check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv)) #define gco2th(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) /* macro to convert any Lua object into a GCObject */ #define obj2gco(v) (cast(GCObject *, (v))) LUAI_FUNC lua_State *luaE_newthread (lua_State *L); LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); #endif premake-3.7.orig/Src/Lua/lcode.h0000644000000000000000000000527611043456337013363 0ustar /* ** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */ #ifndef lcode_h #define lcode_h #include "llex.h" #include "lobject.h" #include "lopcodes.h" #include "lparser.h" /* ** Marks the end of a patch list. It is an invalid value both as an absolute ** address, and as a list link (would link an element to itself). */ #define NO_JUMP (-1) /* ** grep "ORDER OPR" if you change these enums */ typedef enum BinOpr { OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, OPR_CONCAT, OPR_NE, OPR_EQ, OPR_LT, OPR_LE, OPR_GT, OPR_GE, OPR_AND, OPR_OR, OPR_NOBINOPR } BinOpr; typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; #define getcode(fs,e) ((fs)->f->code[(e)->u.s.info]) #define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) #define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); LUAI_FUNC void luaK_fixline (FuncState *fs, int line); LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s); LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r); LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); LUAI_FUNC int luaK_jump (FuncState *fs); LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); LUAI_FUNC int luaK_getlabel (FuncState *fs); LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v); LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2); LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); #endif premake-3.7.orig/Src/Lua/lzio.h0000644000000000000000000000302411043456337013237 0ustar /* ** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $ ** Buffered streams ** See Copyright Notice in lua.h */ #ifndef lzio_h #define lzio_h #include "lua.h" #include "lmem.h" #define EOZ (-1) /* end of stream */ typedef struct Zio ZIO; #define char2int(c) cast(int, cast(unsigned char, (c))) #define zgetc(z) (((z)->n--)>0 ? char2int(*(z)->p++) : luaZ_fill(z)) typedef struct Mbuffer { char *buffer; size_t n; size_t buffsize; } Mbuffer; #define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) #define luaZ_buffer(buff) ((buff)->buffer) #define luaZ_sizebuffer(buff) ((buff)->buffsize) #define luaZ_bufflen(buff) ((buff)->n) #define luaZ_resetbuffer(buff) ((buff)->n = 0) #define luaZ_resizebuffer(L, buff, size) \ (luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \ (buff)->buffsize = size) #define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data); LUAI_FUNC size_t luaZ_read (ZIO* z, void* b, size_t n); /* read next n bytes */ LUAI_FUNC int luaZ_lookahead (ZIO *z); /* --------- Private Part ------------------ */ struct Zio { size_t n; /* bytes still unread */ const char *p; /* current position in buffer */ lua_Reader reader; void* data; /* additional data */ lua_State *L; /* Lua state (for reader) */ }; LUAI_FUNC int luaZ_fill (ZIO *z); #endif premake-3.7.orig/Src/Lua/lfunc.c0000644000000000000000000001101211043456337013360 0ustar /* ** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */ #include #define lfunc_c #define LUA_CORE #include "lua.h" #include "lfunc.h" #include "lgc.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) { Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); luaC_link(L, obj2gco(c), LUA_TFUNCTION); c->c.isC = 1; c->c.env = e; c->c.nupvalues = cast_byte(nelems); return c; } Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) { Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); luaC_link(L, obj2gco(c), LUA_TFUNCTION); c->l.isC = 0; c->l.env = e; c->l.nupvalues = cast_byte(nelems); while (nelems--) c->l.upvals[nelems] = NULL; return c; } UpVal *luaF_newupval (lua_State *L) { UpVal *uv = luaM_new(L, UpVal); luaC_link(L, obj2gco(uv), LUA_TUPVAL); uv->v = &uv->u.value; setnilvalue(uv->v); return uv; } UpVal *luaF_findupval (lua_State *L, StkId level) { global_State *g = G(L); GCObject **pp = &L->openupval; UpVal *p; UpVal *uv; while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) { lua_assert(p->v != &p->u.value); if (p->v == level) { /* found a corresponding upvalue? */ if (isdead(g, obj2gco(p))) /* is it dead? */ changewhite(obj2gco(p)); /* ressurect it */ return p; } pp = &p->next; } uv = luaM_new(L, UpVal); /* not found: create a new one */ uv->tt = LUA_TUPVAL; uv->marked = luaC_white(g); uv->v = level; /* current value lives in the stack */ uv->next = *pp; /* chain it in the proper position */ *pp = obj2gco(uv); uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */ uv->u.l.next = g->uvhead.u.l.next; uv->u.l.next->u.l.prev = uv; g->uvhead.u.l.next = uv; lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); return uv; } static void unlinkupval (UpVal *uv) { lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); uv->u.l.next->u.l.prev = uv->u.l.prev; /* remove from `uvhead' list */ uv->u.l.prev->u.l.next = uv->u.l.next; } void luaF_freeupval (lua_State *L, UpVal *uv) { if (uv->v != &uv->u.value) /* is it open? */ unlinkupval(uv); /* remove from open list */ luaM_free(L, uv); /* free upvalue */ } void luaF_close (lua_State *L, StkId level) { UpVal *uv; global_State *g = G(L); while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) { GCObject *o = obj2gco(uv); lua_assert(!isblack(o) && uv->v != &uv->u.value); L->openupval = uv->next; /* remove from `open' list */ if (isdead(g, o)) luaF_freeupval(L, uv); /* free upvalue */ else { unlinkupval(uv); setobj(L, &uv->u.value, uv->v); uv->v = &uv->u.value; /* now current value lives here */ luaC_linkupval(L, uv); /* link upvalue into `gcroot' list */ } } } Proto *luaF_newproto (lua_State *L) { Proto *f = luaM_new(L, Proto); luaC_link(L, obj2gco(f), LUA_TPROTO); f->k = NULL; f->sizek = 0; f->p = NULL; f->sizep = 0; f->code = NULL; f->sizecode = 0; f->sizelineinfo = 0; f->sizeupvalues = 0; f->nups = 0; f->upvalues = NULL; f->numparams = 0; f->is_vararg = 0; f->maxstacksize = 0; f->lineinfo = NULL; f->sizelocvars = 0; f->locvars = NULL; f->linedefined = 0; f->lastlinedefined = 0; f->source = NULL; return f; } void luaF_freeproto (lua_State *L, Proto *f) { luaM_freearray(L, f->code, f->sizecode, Instruction); luaM_freearray(L, f->p, f->sizep, Proto *); luaM_freearray(L, f->k, f->sizek, TValue); luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *); luaM_free(L, f); } void luaF_freeclosure (lua_State *L, Closure *c) { int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : sizeLclosure(c->l.nupvalues); luaM_freemem(L, c, size); } /* ** Look for n-th local variable at line `line' in function `func'. ** Returns NULL if not found. */ const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { int i; for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { if (pc < f->locvars[i].endpc) { /* is variable active? */ local_number--; if (local_number == 0) return getstr(f->locvars[i].varname); } } return NULL; /* not found */ } premake-3.7.orig/Src/Lua/lundump.c0000644000000000000000000001070711043456337013747 0ustar /* ** $Id: lundump.c,v 2.7.1.2 2008/01/18 16:39:11 roberto Exp $ ** load precompiled Lua chunks ** See Copyright Notice in lua.h */ #include #define lundump_c #define LUA_CORE #include "lua.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lmem.h" #include "lobject.h" #include "lstring.h" #include "lundump.h" #include "lzio.h" typedef struct { lua_State* L; ZIO* Z; Mbuffer* b; const char* name; } LoadState; #ifdef LUAC_TRUST_BINARIES #define IF(c,s) #define error(S,s) #else #define IF(c,s) if (c) error(S,s) static void error(LoadState* S, const char* why) { luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); luaD_throw(S->L,LUA_ERRSYNTAX); } #endif #define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) #define LoadByte(S) (lu_byte)LoadChar(S) #define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) #define LoadVector(S,b,n,size) LoadMem(S,b,n,size) static void LoadBlock(LoadState* S, void* b, size_t size) { size_t r=luaZ_read(S->Z,b,size); UNUSED(r); IF (r!=0, "unexpected end"); } static int LoadChar(LoadState* S) { char x; LoadVar(S,x); return x; } static int LoadInt(LoadState* S) { int x; LoadVar(S,x); IF (x<0, "bad integer"); return x; } static lua_Number LoadNumber(LoadState* S) { lua_Number x; LoadVar(S,x); return x; } static TString* LoadString(LoadState* S) { size_t size; LoadVar(S,size); if (size==0) return NULL; else { char* s=luaZ_openspace(S->L,S->b,size); LoadBlock(S,s,size); return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ } } static void LoadCode(LoadState* S, Proto* f) { int n=LoadInt(S); f->code=luaM_newvector(S->L,n,Instruction); f->sizecode=n; LoadVector(S,f->code,n,sizeof(Instruction)); } static Proto* LoadFunction(LoadState* S, TString* p); static void LoadConstants(LoadState* S, Proto* f) { int i,n; n=LoadInt(S); f->k=luaM_newvector(S->L,n,TValue); f->sizek=n; for (i=0; ik[i]); for (i=0; ik[i]; int t=LoadChar(S); switch (t) { case LUA_TNIL: setnilvalue(o); break; case LUA_TBOOLEAN: setbvalue(o,LoadChar(S)); break; case LUA_TNUMBER: setnvalue(o,LoadNumber(S)); break; case LUA_TSTRING: setsvalue2n(S->L,o,LoadString(S)); break; default: error(S,"bad constant"); break; } } n=LoadInt(S); f->p=luaM_newvector(S->L,n,Proto*); f->sizep=n; for (i=0; ip[i]=NULL; for (i=0; ip[i]=LoadFunction(S,f->source); } static void LoadDebug(LoadState* S, Proto* f) { int i,n; n=LoadInt(S); f->lineinfo=luaM_newvector(S->L,n,int); f->sizelineinfo=n; LoadVector(S,f->lineinfo,n,sizeof(int)); n=LoadInt(S); f->locvars=luaM_newvector(S->L,n,LocVar); f->sizelocvars=n; for (i=0; ilocvars[i].varname=NULL; for (i=0; ilocvars[i].varname=LoadString(S); f->locvars[i].startpc=LoadInt(S); f->locvars[i].endpc=LoadInt(S); } n=LoadInt(S); f->upvalues=luaM_newvector(S->L,n,TString*); f->sizeupvalues=n; for (i=0; iupvalues[i]=NULL; for (i=0; iupvalues[i]=LoadString(S); } static Proto* LoadFunction(LoadState* S, TString* p) { Proto* f=luaF_newproto(S->L); setptvalue2s(S->L,S->L->top,f); incr_top(S->L); f->source=LoadString(S); if (f->source==NULL) f->source=p; f->linedefined=LoadInt(S); f->lastlinedefined=LoadInt(S); f->nups=LoadByte(S); f->numparams=LoadByte(S); f->is_vararg=LoadByte(S); f->maxstacksize=LoadByte(S); LoadCode(S,f); LoadConstants(S,f); LoadDebug(S,f); IF (!luaG_checkcode(f), "bad code"); S->L->top--; return f; } static void LoadHeader(LoadState* S) { char h[LUAC_HEADERSIZE]; char s[LUAC_HEADERSIZE]; luaU_header(h); LoadBlock(S,s,LUAC_HEADERSIZE); IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); } /* ** load precompiled chunk */ Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) { LoadState S; if (*name=='@' || *name=='=') S.name=name+1; else if (*name==LUA_SIGNATURE[0]) S.name="binary string"; else S.name=name; S.L=L; S.Z=Z; S.b=buff; LoadHeader(&S); return LoadFunction(&S,luaS_newliteral(L,"=?")); } /* * make header */ void luaU_header (char* h) { int x=1; memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); h+=sizeof(LUA_SIGNATURE)-1; *h++=(char)LUAC_VERSION; *h++=(char)LUAC_FORMAT; *h++=(char)*(char*)&x; /* endianness */ *h++=(char)sizeof(int); *h++=(char)sizeof(size_t); *h++=(char)sizeof(Instruction); *h++=(char)sizeof(lua_Number); *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ } premake-3.7.orig/Src/Lua/lopcodes.h0000644000000000000000000001762611043456337014107 0ustar /* ** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $ ** Opcodes for Lua virtual machine ** See Copyright Notice in lua.h */ #ifndef lopcodes_h #define lopcodes_h #include "llimits.h" /*=========================================================================== We assume that instructions are unsigned numbers. All instructions have an opcode in the first 6 bits. Instructions can have the following fields: `A' : 8 bits `B' : 9 bits `C' : 9 bits `Bx' : 18 bits (`B' and `C' together) `sBx' : signed Bx A signed argument is represented in excess K; that is, the number value is the unsigned value minus K. K is exactly the maximum value for that argument (so that -max is represented by 0, and +max is represented by 2*max), which is half the maximum for the corresponding unsigned argument. ===========================================================================*/ enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */ /* ** size and position of opcode arguments. */ #define SIZE_C 9 #define SIZE_B 9 #define SIZE_Bx (SIZE_C + SIZE_B) #define SIZE_A 8 #define SIZE_OP 6 #define POS_OP 0 #define POS_A (POS_OP + SIZE_OP) #define POS_C (POS_A + SIZE_A) #define POS_B (POS_C + SIZE_C) #define POS_Bx POS_C /* ** limits for opcode arguments. ** we use (signed) int to manipulate most arguments, ** so they must fit in LUAI_BITSINT-1 bits (-1 for sign) */ #if SIZE_Bx < LUAI_BITSINT-1 #define MAXARG_Bx ((1<>1) /* `sBx' is signed */ #else #define MAXARG_Bx MAX_INT #define MAXARG_sBx MAX_INT #endif #define MAXARG_A ((1<>POS_OP) & MASK1(SIZE_OP,0))) #define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ ((cast(Instruction, o)<>POS_A) & MASK1(SIZE_A,0))) #define SETARG_A(i,u) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ ((cast(Instruction, u)<>POS_B) & MASK1(SIZE_B,0))) #define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ ((cast(Instruction, b)<>POS_C) & MASK1(SIZE_C,0))) #define SETARG_C(i,b) ((i) = (((i)&MASK0(SIZE_C,POS_C)) | \ ((cast(Instruction, b)<>POS_Bx) & MASK1(SIZE_Bx,0))) #define SETARG_Bx(i,b) ((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \ ((cast(Instruction, b)< C) then pc++ */ OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */ OP_FORLOOP,/* A sBx R(A)+=R(A+2); if R(A) =) R(A)*/ OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */ OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ } OpCode; #define NUM_OPCODES (cast(int, OP_VARARG) + 1) /*=========================================================================== Notes: (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1, and can be 0: OP_CALL then sets `top' to last_result+1, so next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'. (*) In OP_VARARG, if (B == 0) then use actual number of varargs and set top (like in OP_CALL with C == 0). (*) In OP_RETURN, if (B == 0) then return up to `top' (*) In OP_SETLIST, if (B == 0) then B = `top'; if (C == 0) then next `instruction' is real C (*) For comparisons, A specifies what condition the test should accept (true or false). (*) All `skips' (pc++) assume that next instruction is a jump ===========================================================================*/ /* ** masks for instruction properties. The format is: ** bits 0-1: op mode ** bits 2-3: C arg mode ** bits 4-5: B arg mode ** bit 6: instruction set register A ** bit 7: operator is a test */ enum OpArgMask { OpArgN, /* argument is not used */ OpArgU, /* argument is used */ OpArgR, /* argument is a register or a jump offset */ OpArgK /* argument is a constant or register/constant */ }; LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES]; #define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3)) #define getBMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3)) #define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) #define testAMode(m) (luaP_opmodes[m] & (1 << 6)) #define testTMode(m) (luaP_opmodes[m] & (1 << 7)) LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ /* number of list items to accumulate before a SETLIST instruction */ #define LFIELDS_PER_FLUSH 50 #endif premake-3.7.orig/Src/Lua/ltests.c0000644000000000000000000004771510504524316013604 0ustar /* ** $Id: ltests.c,v 1.158 2003/04/07 14:35:00 roberto Exp $ ** Internal Module for Debugging of the Lua Implementation ** See Copyright Notice in lua.h */ #include #include #include #include #include #define ltests_c #include "lua.h" #include "lapi.h" #include "lauxlib.h" #include "lcode.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" #include "lmem.h" #include "lopcodes.h" #include "lstate.h" #include "lstring.h" #include "ltable.h" #include "lualib.h" /* ** The whole module only makes sense with LUA_DEBUG on */ #ifdef LUA_DEBUG #define lua_pushintegral(L,i) lua_pushnumber(L, cast(lua_Number, (i))) static lua_State *lua_state = NULL; int islocked = 0; #define func_at(L,k) (L->ci->base+(k) - 1) static void setnameval (lua_State *L, const char *name, int val) { lua_pushstring(L, name); lua_pushintegral(L, val); lua_settable(L, -3); } /* ** {====================================================================== ** Controlled version for realloc. ** ======================================================================= */ #define MARK 0x55 /* 01010101 (a nice pattern) */ #ifndef EXTERNMEMCHECK /* full memory check */ #define HEADER (sizeof(L_Umaxalign)) /* ensures maximum alignment for HEADER */ #define MARKSIZE 16 /* size of marks after each block */ #define blockhead(b) (cast(char *, b) - HEADER) #define setsize(newblock, size) (*cast(size_t *, newblock) = size) #define checkblocksize(b, size) (size == (*cast(size_t *, blockhead(b)))) #define fillmem(mem,size) memset(mem, -MARK, size) #else /* external memory check: don't do it twice */ #define HEADER 0 #define MARKSIZE 0 #define blockhead(b) (b) #define setsize(newblock, size) /* empty */ #define checkblocksize(b,size) (1) #define fillmem(mem,size) /* empty */ #endif unsigned long memdebug_numblocks = 0; unsigned long memdebug_total = 0; unsigned long memdebug_maxmem = 0; unsigned long memdebug_memlimit = ULONG_MAX; static void *checkblock (void *block, size_t size) { void *b = blockhead(block); int i; for (i=0;i 0); if (size == 0) { freeblock(block, oldsize); return NULL; } else if (size > oldsize && memdebug_total+size-oldsize > memdebug_memlimit) return NULL; /* to test memory allocation errors */ else { void *newblock; int i; size_t realsize = HEADER+size+MARKSIZE; size_t commonsize = (oldsize < size) ? oldsize : size; if (realsize < size) return NULL; /* overflow! */ newblock = malloc(realsize); /* alloc a new block */ if (newblock == NULL) return NULL; if (block) { memcpy(cast(char *, newblock)+HEADER, block, commonsize); freeblock(block, oldsize); /* erase (and check) old copy */ } /* initialize new part of the block with something `weird' */ fillmem(cast(char *, newblock)+HEADER+commonsize, size-commonsize); memdebug_total += size; if (memdebug_total > memdebug_maxmem) memdebug_maxmem = memdebug_total; memdebug_numblocks++; setsize(newblock, size); for (i=0;icode[pc]; OpCode o = GET_OPCODE(i); const char *name = luaP_opnames[o]; int line = getline(p, pc); sprintf(buff, "(%4d) %4d - ", line, pc); switch (getOpMode(o)) { case iABC: sprintf(buff+strlen(buff), "%-12s%4d %4d %4d", name, GETARG_A(i), GETARG_B(i), GETARG_C(i)); break; case iABx: sprintf(buff+strlen(buff), "%-12s%4d %4d", name, GETARG_A(i), GETARG_Bx(i)); break; case iAsBx: sprintf(buff+strlen(buff), "%-12s%4d %4d", name, GETARG_A(i), GETARG_sBx(i)); break; } return buff; } #if 0 void luaI_printcode (Proto *pt, int size) { int pc; for (pc=0; pcl.p; lua_newtable(L); setnameval(L, "maxstack", p->maxstacksize); setnameval(L, "numparams", p->numparams); for (pc=0; pcsizecode; pc++) { char buff[100]; lua_pushintegral(L, pc+1); lua_pushstring(L, buildop(p, pc, buff)); lua_settable(L, -3); } return 1; } static int listk (lua_State *L) { Proto *p; int i; luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, "Lua function expected"); p = clvalue(func_at(L, 1))->l.p; lua_newtable(L); for (i=0; isizek; i++) { lua_pushintegral(L, i+1); luaA_pushobject(L, p->k+i); lua_settable(L, -3); } return 1; } static int listlocals (lua_State *L) { Proto *p; int pc = luaL_checkint(L, 2) - 1; int i = 0; const char *name; luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, "Lua function expected"); p = clvalue(func_at(L, 1))->l.p; while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) lua_pushstring(L, name); return i-1; } /* }====================================================== */ static int get_limits (lua_State *L) { lua_newtable(L); setnameval(L, "BITS_INT", BITS_INT); setnameval(L, "LFPF", LFIELDS_PER_FLUSH); setnameval(L, "MAXVARS", MAXVARS); setnameval(L, "MAXPARAMS", MAXPARAMS); setnameval(L, "MAXSTACK", MAXSTACK); setnameval(L, "MAXUPVALUES", MAXUPVALUES); return 1; } static int mem_query (lua_State *L) { if (lua_isnone(L, 1)) { lua_pushintegral(L, memdebug_total); lua_pushintegral(L, memdebug_numblocks); lua_pushintegral(L, memdebug_maxmem); return 3; } else { memdebug_memlimit = luaL_checkint(L, 1); return 0; } } static int hash_query (lua_State *L) { if (lua_isnone(L, 2)) { luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "string expected"); lua_pushintegral(L, tsvalue(func_at(L, 1))->tsv.hash); } else { TObject *o = func_at(L, 1); Table *t; luaL_checktype(L, 2, LUA_TTABLE); t = hvalue(func_at(L, 2)); lua_pushintegral(L, luaH_mainposition(t, o) - t->node); } return 1; } static int stacklevel (lua_State *L) { unsigned long a = 0; lua_pushintegral(L, (int)(L->top - L->stack)); lua_pushintegral(L, (int)(L->stack_last - L->stack)); lua_pushintegral(L, (int)(L->ci - L->base_ci)); lua_pushintegral(L, (int)(L->end_ci - L->base_ci)); lua_pushintegral(L, (unsigned long)&a); return 5; } static int table_query (lua_State *L) { const Table *t; int i = luaL_optint(L, 2, -1); luaL_checktype(L, 1, LUA_TTABLE); t = hvalue(func_at(L, 1)); if (i == -1) { lua_pushintegral(L, t->sizearray); lua_pushintegral(L, sizenode(t)); lua_pushintegral(L, t->firstfree - t->node); } else if (i < t->sizearray) { lua_pushintegral(L, i); luaA_pushobject(L, &t->array[i]); lua_pushnil(L); } else if ((i -= t->sizearray) < sizenode(t)) { if (!ttisnil(gval(gnode(t, i))) || ttisnil(gkey(gnode(t, i))) || ttisnumber(gkey(gnode(t, i)))) { luaA_pushobject(L, gkey(gnode(t, i))); } else lua_pushstring(L, ""); luaA_pushobject(L, gval(gnode(t, i))); if (t->node[i].next) lua_pushintegral(L, t->node[i].next - t->node); else lua_pushnil(L); } return 3; } static int string_query (lua_State *L) { stringtable *tb = &G(L)->strt; int s = luaL_optint(L, 2, 0) - 1; if (s==-1) { lua_pushintegral(L ,tb->nuse); lua_pushintegral(L ,tb->size); return 2; } else if (s < tb->size) { GCObject *ts; int n = 0; for (ts = tb->hash[s]; ts; ts = ts->gch.next) { setsvalue2s(L->top, gcotots(ts)); incr_top(L); n++; } return n; } return 0; } static int tref (lua_State *L) { int level = lua_gettop(L); int lock = luaL_optint(L, 2, 1); luaL_checkany(L, 1); lua_pushvalue(L, 1); lua_pushintegral(L, lua_ref(L, lock)); assert(lua_gettop(L) == level+1); /* +1 for result */ return 1; } static int getref (lua_State *L) { int level = lua_gettop(L); lua_getref(L, luaL_checkint(L, 1)); assert(lua_gettop(L) == level+1); return 1; } static int unref (lua_State *L) { int level = lua_gettop(L); lua_unref(L, luaL_checkint(L, 1)); assert(lua_gettop(L) == level); return 0; } static int metatable (lua_State *L) { luaL_checkany(L, 1); if (lua_isnone(L, 2)) { if (lua_getmetatable(L, 1) == 0) lua_pushnil(L); } else { lua_settop(L, 2); luaL_checktype(L, 2, LUA_TTABLE); lua_setmetatable(L, 1); } return 1; } static int upvalue (lua_State *L) { int n = luaL_checkint(L, 2); luaL_checktype(L, 1, LUA_TFUNCTION); if (lua_isnone(L, 3)) { const char *name = lua_getupvalue(L, 1, n); if (name == NULL) return 0; lua_pushstring(L, name); return 2; } else { const char *name = lua_setupvalue(L, 1, n); lua_pushstring(L, name); return 1; } } static int newuserdata (lua_State *L) { size_t size = luaL_checkint(L, 1); char *p = cast(char *, lua_newuserdata(L, size)); while (size--) *p++ = '\0'; return 1; } static int pushuserdata (lua_State *L) { lua_pushlightuserdata(L, cast(void *, luaL_checkint(L, 1))); return 1; } static int udataval (lua_State *L) { lua_pushintegral(L, cast(int, lua_touserdata(L, 1))); return 1; } static int doonnewstack (lua_State *L) { lua_State *L1 = lua_newthread(L); size_t l; const char *s = luaL_checklstring(L, 1, &l); int status = luaL_loadbuffer(L1, s, l, s); if (status == 0) status = lua_pcall(L1, 0, 0, 0); lua_pushintegral(L, status); return 1; } static int s2d (lua_State *L) { lua_pushnumber(L, *cast(const double *, luaL_checkstring(L, 1))); return 1; } static int d2s (lua_State *L) { double d = luaL_checknumber(L, 1); lua_pushlstring(L, cast(char *, &d), sizeof(d)); return 1; } static int newstate (lua_State *L) { lua_State *L1 = lua_open(); if (L1) { lua_userstateopen(L1); /* init lock */ lua_pushintegral(L, (unsigned long)L1); } else lua_pushnil(L); return 1; } static int loadlib (lua_State *L) { static const luaL_reg libs[] = { {"mathlibopen", luaopen_math}, {"strlibopen", luaopen_string}, {"iolibopen", luaopen_io}, {"tablibopen", luaopen_table}, {"dblibopen", luaopen_debug}, {"baselibopen", luaopen_base}, {NULL, NULL} }; lua_State *L1 = cast(lua_State *, cast(unsigned long, luaL_checknumber(L, 1))); lua_pushvalue(L1, LUA_GLOBALSINDEX); luaL_openlib(L1, NULL, libs, 0); return 0; } static int closestate (lua_State *L) { lua_State *L1 = cast(lua_State *, cast(unsigned long, luaL_checknumber(L, 1))); lua_close(L1); lua_unlock(L); /* close cannot unlock that */ return 0; } static int doremote (lua_State *L) { lua_State *L1 = cast(lua_State *,cast(unsigned long,luaL_checknumber(L, 1))); size_t lcode; const char *code = luaL_checklstring(L, 2, &lcode); int status; lua_settop(L1, 0); status = luaL_loadbuffer(L1, code, lcode, code); if (status == 0) status = lua_pcall(L1, 0, LUA_MULTRET, 0); if (status != 0) { lua_pushnil(L); lua_pushintegral(L, status); lua_pushstring(L, lua_tostring(L1, -1)); return 3; } else { int i = 0; while (!lua_isnone(L1, ++i)) lua_pushstring(L, lua_tostring(L1, i)); lua_pop(L1, i-1); return i-1; } } static int log2_aux (lua_State *L) { lua_pushintegral(L, luaO_log2(luaL_checkint(L, 1))); return 1; } static int int2fb_aux (lua_State *L) { int b = luaO_int2fb(luaL_checkint(L, 1)); lua_pushintegral(L, b); lua_pushintegral(L, fb2int(b)); return 2; } static int test_do (lua_State *L) { const char *p = luaL_checkstring(L, 1); if (*p == '@') lua_dofile(L, p+1); else lua_dostring(L, p); return lua_gettop(L); } /* ** {====================================================== ** function to test the API with C. It interprets a kind of assembler ** language with calls to the API, so the test can be driven by Lua code ** ======================================================= */ static const char *const delimits = " \t\n,;"; static void skip (const char **pc) { while (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; } static int getnum_aux (lua_State *L, const char **pc) { int res = 0; int sig = 1; skip(pc); if (**pc == '.') { res = cast(int, lua_tonumber(L, -1)); lua_pop(L, 1); (*pc)++; return res; } else if (**pc == '-') { sig = -1; (*pc)++; } while (isdigit(cast(int, **pc))) res = res*10 + (*(*pc)++) - '0'; return sig*res; } static const char *getname_aux (char *buff, const char **pc) { int i = 0; skip(pc); while (**pc != '\0' && !strchr(delimits, **pc)) buff[i++] = *(*pc)++; buff[i] = '\0'; return buff; } #define EQ(s1) (strcmp(s1, inst) == 0) #define getnum (getnum_aux(L, &pc)) #define getname (getname_aux(buff, &pc)) static int testC (lua_State *L) { char buff[30]; const char *pc = luaL_checkstring(L, 1); for (;;) { const char *inst = getname; if EQ("") return 0; else if EQ("isnumber") { lua_pushintegral(L, lua_isnumber(L, getnum)); } else if EQ("isstring") { lua_pushintegral(L, lua_isstring(L, getnum)); } else if EQ("istable") { lua_pushintegral(L, lua_istable(L, getnum)); } else if EQ("iscfunction") { lua_pushintegral(L, lua_iscfunction(L, getnum)); } else if EQ("isfunction") { lua_pushintegral(L, lua_isfunction(L, getnum)); } else if EQ("isuserdata") { lua_pushintegral(L, lua_isuserdata(L, getnum)); } else if EQ("isudataval") { lua_pushintegral(L, lua_islightuserdata(L, getnum)); } else if EQ("isnil") { lua_pushintegral(L, lua_isnil(L, getnum)); } else if EQ("isnull") { lua_pushintegral(L, lua_isnone(L, getnum)); } else if EQ("tonumber") { lua_pushnumber(L, lua_tonumber(L, getnum)); } else if EQ("tostring") { const char *s = lua_tostring(L, getnum); lua_pushstring(L, s); } else if EQ("strlen") { lua_pushintegral(L, lua_strlen(L, getnum)); } else if EQ("tocfunction") { lua_pushcfunction(L, lua_tocfunction(L, getnum)); } else if EQ("return") { return getnum; } else if EQ("gettop") { lua_pushintegral(L, lua_gettop(L)); } else if EQ("settop") { lua_settop(L, getnum); } else if EQ("pop") { lua_pop(L, getnum); } else if EQ("pushnum") { lua_pushintegral(L, getnum); } else if EQ("pushnil") { lua_pushnil(L); } else if EQ("pushbool") { lua_pushboolean(L, getnum); } else if EQ("tobool") { lua_pushintegral(L, lua_toboolean(L, getnum)); } else if EQ("pushvalue") { lua_pushvalue(L, getnum); } else if EQ("pushcclosure") { lua_pushcclosure(L, testC, getnum); } else if EQ("pushupvalues") { lua_pushupvalues(L); } else if EQ("remove") { lua_remove(L, getnum); } else if EQ("insert") { lua_insert(L, getnum); } else if EQ("replace") { lua_replace(L, getnum); } else if EQ("gettable") { lua_gettable(L, getnum); } else if EQ("settable") { lua_settable(L, getnum); } else if EQ("next") { lua_next(L, -2); } else if EQ("concat") { lua_concat(L, getnum); } else if EQ("lessthan") { int a = getnum; lua_pushboolean(L, lua_lessthan(L, a, getnum)); } else if EQ("equal") { int a = getnum; lua_pushboolean(L, lua_equal(L, a, getnum)); } else if EQ("rawcall") { int narg = getnum; int nres = getnum; lua_call(L, narg, nres); } else if EQ("call") { int narg = getnum; int nres = getnum; lua_pcall(L, narg, nres, 0); } else if EQ("loadstring") { size_t sl; const char *s = luaL_checklstring(L, getnum, &sl); luaL_loadbuffer(L, s, sl, s); } else if EQ("loadfile") { luaL_loadfile(L, luaL_checkstring(L, getnum)); } else if EQ("setmetatable") { lua_setmetatable(L, getnum); } else if EQ("getmetatable") { if (lua_getmetatable(L, getnum) == 0) lua_pushnil(L); } else if EQ("type") { lua_pushstring(L, lua_typename(L, lua_type(L, getnum))); } else if EQ("getn") { int i = getnum; lua_pushintegral(L, luaL_getn(L, i)); } else if EQ("setn") { int i = getnum; int n = cast(int, lua_tonumber(L, -1)); luaL_setn(L, i, n); lua_pop(L, 1); } else luaL_error(L, "unknown instruction %s", buff); } return 0; } /* }====================================================== */ /* ** {====================================================== ** tests for yield inside hooks ** ======================================================= */ static void yieldf (lua_State *L, lua_Debug *ar) { lua_yield(L, 0); } static int setyhook (lua_State *L) { if (lua_isnoneornil(L, 1)) lua_sethook(L, NULL, 0, 0); /* turn off hooks */ else { const char *smask = luaL_checkstring(L, 1); int count = luaL_optint(L, 2, 0); int mask = 0; if (strchr(smask, 'l')) mask |= LUA_MASKLINE; if (count > 0) mask |= LUA_MASKCOUNT; lua_sethook(L, yieldf, mask, count); } return 0; } static int coresume (lua_State *L) { int status; lua_State *co = lua_tothread(L, 1); luaL_argcheck(L, co, 1, "coroutine expected"); status = lua_resume(co, 0); if (status != 0) { lua_pushboolean(L, 0); lua_insert(L, -2); return 2; /* return false + error message */ } else { lua_pushboolean(L, 1); return 1; } } /* }====================================================== */ static const struct luaL_reg tests_funcs[] = { {"hash", hash_query}, {"limits", get_limits}, {"listcode", listcode}, {"listk", listk}, {"listlocals", listlocals}, {"loadlib", loadlib}, {"stacklevel", stacklevel}, {"querystr", string_query}, {"querytab", table_query}, {"doit", test_do}, {"testC", testC}, {"ref", tref}, {"getref", getref}, {"unref", unref}, {"d2s", d2s}, {"s2d", s2d}, {"metatable", metatable}, {"upvalue", upvalue}, {"newuserdata", newuserdata}, {"pushuserdata", pushuserdata}, {"udataval", udataval}, {"doonnewstack", doonnewstack}, {"newstate", newstate}, {"closestate", closestate}, {"doremote", doremote}, {"log2", log2_aux}, {"int2fb", int2fb_aux}, {"totalmem", mem_query}, {"resume", coresume}, {"setyhook", setyhook}, {NULL, NULL} }; static void fim (void) { if (!islocked) lua_close(lua_state); lua_assert(memdebug_numblocks == 0); lua_assert(memdebug_total == 0); } static int l_panic (lua_State *L) { UNUSED(L); fprintf(stderr, "unable to recover; exiting\n"); return 0; } int luaB_opentests (lua_State *L) { lua_atpanic(L, l_panic); lua_userstateopen(L); /* init lock */ lua_state = L; /* keep first state to be opened */ luaL_openlib(L, "T", tests_funcs, 0); atexit(fim); return 0; } #undef main int main (int argc, char *argv[]) { char *limit = getenv("MEMLIMIT"); if (limit) memdebug_memlimit = strtoul(limit, NULL, 10); l_main(argc, argv); return 0; } #endif premake-3.7.orig/Src/Lua/ltm.h0000644000000000000000000000177211043456337013066 0ustar /* ** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $ ** Tag methods ** See Copyright Notice in lua.h */ #ifndef ltm_h #define ltm_h #include "lobject.h" /* * WARNING: if you change the order of this enumeration, * grep "ORDER TM" */ typedef enum { TM_INDEX, TM_NEWINDEX, TM_GC, TM_MODE, TM_EQ, /* last tag method with `fast' access */ TM_ADD, TM_SUB, TM_MUL, TM_DIV, TM_MOD, TM_POW, TM_UNM, TM_LEN, TM_LT, TM_LE, TM_CONCAT, TM_CALL, TM_N /* number of elements in the enum */ } TMS; #define gfasttm(g,et,e) ((et) == NULL ? NULL : \ ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) #define fasttm(l,et,e) gfasttm(G(l), et, e) LUAI_DATA const char *const luaT_typenames[]; LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event); LUAI_FUNC void luaT_init (lua_State *L); #endif premake-3.7.orig/Src/Lua/loadlib.c0000644000000000000000000004517111043456337013674 0ustar /* ** $Id: loadlib.c,v 1.52.1.2 2007/12/28 14:58:43 roberto Exp $ ** Dynamic library loader for Lua ** See Copyright Notice in lua.h ** ** This module contains an implementation of loadlib for Unix systems ** that have dlfcn, an implementation for Darwin (Mac OS X), an ** implementation for Windows, and a stub for other systems. */ #include #include #define loadlib_c #define LUA_LIB #include "lua.h" #include "lauxlib.h" #include "lualib.h" /* prefix for open functions in C libraries */ #define LUA_POF "luaopen_" /* separator for open functions in C libraries */ #define LUA_OFSEP "_" #define LIBPREFIX "LOADLIB: " #define POF LUA_POF #define LIB_FAIL "open" /* error codes for ll_loadfunc */ #define ERRLIB 1 #define ERRFUNC 2 #define setprogdir(L) ((void)0) static void ll_unloadlib (void *lib); static void *ll_load (lua_State *L, const char *path); static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); #if defined(LUA_DL_DLOPEN) /* ** {======================================================================== ** This is an implementation of loadlib based on the dlfcn interface. ** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, ** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least ** as an emulation layer on top of native functions. ** ========================================================================= */ #include static void ll_unloadlib (void *lib) { dlclose(lib); } static void *ll_load (lua_State *L, const char *path) { void *lib = dlopen(path, RTLD_NOW); if (lib == NULL) lua_pushstring(L, dlerror()); return lib; } static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { lua_CFunction f = (lua_CFunction)dlsym(lib, sym); if (f == NULL) lua_pushstring(L, dlerror()); return f; } /* }====================================================== */ #elif defined(LUA_DL_DLL) /* ** {====================================================================== ** This is an implementation of loadlib for Windows using native functions. ** ======================================================================= */ #include #undef setprogdir static void setprogdir (lua_State *L) { char buff[MAX_PATH + 1]; char *lb; DWORD nsize = sizeof(buff)/sizeof(char); DWORD n = GetModuleFileNameA(NULL, buff, nsize); if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) luaL_error(L, "unable to get ModuleFileName"); else { *lb = '\0'; luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); lua_remove(L, -2); /* remove original string */ } } static void pusherror (lua_State *L) { int error = GetLastError(); char buffer[128]; if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, buffer, sizeof(buffer), NULL)) lua_pushstring(L, buffer); else lua_pushfstring(L, "system error %d\n", error); } static void ll_unloadlib (void *lib) { FreeLibrary((HINSTANCE)lib); } static void *ll_load (lua_State *L, const char *path) { HINSTANCE lib = LoadLibraryA(path); if (lib == NULL) pusherror(L); return lib; } static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym); if (f == NULL) pusherror(L); return f; } /* }====================================================== */ #elif defined(LUA_DL_DYLD) /* ** {====================================================================== ** Native Mac OS X / Darwin Implementation ** ======================================================================= */ #include /* Mac appends a `_' before C function names */ #undef POF #define POF "_" LUA_POF static void pusherror (lua_State *L) { const char *err_str; const char *err_file; NSLinkEditErrors err; int err_num; NSLinkEditError(&err, &err_num, &err_file, &err_str); lua_pushstring(L, err_str); } static const char *errorfromcode (NSObjectFileImageReturnCode ret) { switch (ret) { case NSObjectFileImageInappropriateFile: return "file is not a bundle"; case NSObjectFileImageArch: return "library is for wrong CPU type"; case NSObjectFileImageFormat: return "bad format"; case NSObjectFileImageAccess: return "cannot access file"; case NSObjectFileImageFailure: default: return "unable to load library"; } } static void ll_unloadlib (void *lib) { NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); } static void *ll_load (lua_State *L, const char *path) { NSObjectFileImage img; NSObjectFileImageReturnCode ret; /* this would be a rare case, but prevents crashing if it happens */ if(!_dyld_present()) { lua_pushliteral(L, "dyld not present"); return NULL; } ret = NSCreateObjectFileImageFromFile(path, &img); if (ret == NSObjectFileImageSuccess) { NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE | NSLINKMODULE_OPTION_RETURN_ON_ERROR); NSDestroyObjectFileImage(img); if (mod == NULL) pusherror(L); return mod; } lua_pushstring(L, errorfromcode(ret)); return NULL; } static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym); if (nss == NULL) { lua_pushfstring(L, "symbol " LUA_QS " not found", sym); return NULL; } return (lua_CFunction)NSAddressOfSymbol(nss); } /* }====================================================== */ #else /* ** {====================================================== ** Fallback for other systems ** ======================================================= */ #undef LIB_FAIL #define LIB_FAIL "absent" #define DLMSG "dynamic libraries not enabled; check your Lua installation" static void ll_unloadlib (void *lib) { (void)lib; /* to avoid warnings */ } static void *ll_load (lua_State *L, const char *path) { (void)path; /* to avoid warnings */ lua_pushliteral(L, DLMSG); return NULL; } static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { (void)lib; (void)sym; /* to avoid warnings */ lua_pushliteral(L, DLMSG); return NULL; } /* }====================================================== */ #endif static void **ll_register (lua_State *L, const char *path) { void **plib; lua_pushfstring(L, "%s%s", LIBPREFIX, path); lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */ if (!lua_isnil(L, -1)) /* is there an entry? */ plib = (void **)lua_touserdata(L, -1); else { /* no entry yet; create one */ lua_pop(L, 1); plib = (void **)lua_newuserdata(L, sizeof(const void *)); *plib = NULL; luaL_getmetatable(L, "_LOADLIB"); lua_setmetatable(L, -2); lua_pushfstring(L, "%s%s", LIBPREFIX, path); lua_pushvalue(L, -2); lua_settable(L, LUA_REGISTRYINDEX); } return plib; } /* ** __gc tag method: calls library's `ll_unloadlib' function with the lib ** handle */ static int gctm (lua_State *L) { void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); if (*lib) ll_unloadlib(*lib); *lib = NULL; /* mark library as closed */ return 0; } static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { void **reg = ll_register(L, path); if (*reg == NULL) *reg = ll_load(L, path); if (*reg == NULL) return ERRLIB; /* unable to load library */ else { lua_CFunction f = ll_sym(L, *reg, sym); if (f == NULL) return ERRFUNC; /* unable to find function */ lua_pushcfunction(L, f); return 0; /* return function */ } } static int ll_loadlib (lua_State *L) { const char *path = luaL_checkstring(L, 1); const char *init = luaL_checkstring(L, 2); int stat = ll_loadfunc(L, path, init); if (stat == 0) /* no errors? */ return 1; /* return the loaded function */ else { /* error; error message is on stack top */ lua_pushnil(L); lua_insert(L, -2); lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); return 3; /* return nil, error message, and where */ } } /* ** {====================================================== ** 'require' function ** ======================================================= */ static int readable (const char *filename) { FILE *f = fopen(filename, "r"); /* try to open file */ if (f == NULL) return 0; /* open failed */ fclose(f); return 1; } static const char *pushnexttemplate (lua_State *L, const char *path) { const char *l; while (*path == *LUA_PATHSEP) path++; /* skip separators */ if (*path == '\0') return NULL; /* no more templates */ l = strchr(path, *LUA_PATHSEP); /* find next separator */ if (l == NULL) l = path + strlen(path); lua_pushlstring(L, path, l - path); /* template */ return l; } static const char *findfile (lua_State *L, const char *name, const char *pname) { const char *path; name = luaL_gsub(L, name, ".", LUA_DIRSEP); lua_getfield(L, LUA_ENVIRONINDEX, pname); path = lua_tostring(L, -1); if (path == NULL) luaL_error(L, LUA_QL("package.%s") " must be a string", pname); lua_pushliteral(L, ""); /* error accumulator */ while ((path = pushnexttemplate(L, path)) != NULL) { const char *filename; filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name); lua_remove(L, -2); /* remove path template */ if (readable(filename)) /* does file exist and is readable? */ return filename; /* return that file name */ lua_pushfstring(L, "\n\tno file " LUA_QS, filename); lua_remove(L, -2); /* remove file name */ lua_concat(L, 2); /* add entry to possible error message */ } return NULL; /* not found */ } static void loaderror (lua_State *L, const char *filename) { luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", lua_tostring(L, 1), filename, lua_tostring(L, -1)); } static int loader_Lua (lua_State *L) { const char *filename; const char *name = luaL_checkstring(L, 1); filename = findfile(L, name, "path"); if (filename == NULL) return 1; /* library not found in this path */ if (luaL_loadfile(L, filename) != 0) loaderror(L, filename); return 1; /* library loaded successfully */ } static const char *mkfuncname (lua_State *L, const char *modname) { const char *funcname; const char *mark = strchr(modname, *LUA_IGMARK); if (mark) modname = mark + 1; funcname = luaL_gsub(L, modname, ".", LUA_OFSEP); funcname = lua_pushfstring(L, POF"%s", funcname); lua_remove(L, -2); /* remove 'gsub' result */ return funcname; } static int loader_C (lua_State *L) { const char *funcname; const char *name = luaL_checkstring(L, 1); const char *filename = findfile(L, name, "cpath"); if (filename == NULL) return 1; /* library not found in this path */ funcname = mkfuncname(L, name); if (ll_loadfunc(L, filename, funcname) != 0) loaderror(L, filename); return 1; /* library loaded successfully */ } static int loader_Croot (lua_State *L) { const char *funcname; const char *filename; const char *name = luaL_checkstring(L, 1); const char *p = strchr(name, '.'); int stat; if (p == NULL) return 0; /* is root */ lua_pushlstring(L, name, p - name); filename = findfile(L, lua_tostring(L, -1), "cpath"); if (filename == NULL) return 1; /* root not found */ funcname = mkfuncname(L, name); if ((stat = ll_loadfunc(L, filename, funcname)) != 0) { if (stat != ERRFUNC) loaderror(L, filename); /* real error */ lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, name, filename); return 1; /* function not found */ } return 1; } static int loader_preload (lua_State *L) { const char *name = luaL_checkstring(L, 1); lua_getfield(L, LUA_ENVIRONINDEX, "preload"); if (!lua_istable(L, -1)) luaL_error(L, LUA_QL("package.preload") " must be a table"); lua_getfield(L, -1, name); if (lua_isnil(L, -1)) /* not found? */ lua_pushfstring(L, "\n\tno field package.preload['%s']", name); return 1; } static const int sentinel_ = 0; #define sentinel ((void *)&sentinel_) static int ll_require (lua_State *L) { const char *name = luaL_checkstring(L, 1); int i; lua_settop(L, 1); /* _LOADED table will be at index 2 */ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); lua_getfield(L, 2, name); if (lua_toboolean(L, -1)) { /* is it there? */ if (lua_touserdata(L, -1) == sentinel) /* check loops */ luaL_error(L, "loop or previous error loading module " LUA_QS, name); return 1; /* package is already loaded */ } /* else must load it; iterate over available loaders */ lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); if (!lua_istable(L, -1)) luaL_error(L, LUA_QL("package.loaders") " must be a table"); lua_pushliteral(L, ""); /* error message accumulator */ for (i=1; ; i++) { lua_rawgeti(L, -2, i); /* get a loader */ if (lua_isnil(L, -1)) luaL_error(L, "module " LUA_QS " not found:%s", name, lua_tostring(L, -2)); lua_pushstring(L, name); lua_call(L, 1, 1); /* call it */ if (lua_isfunction(L, -1)) /* did it find module? */ break; /* module loaded successfully */ else if (lua_isstring(L, -1)) /* loader returned error message? */ lua_concat(L, 2); /* accumulate it */ else lua_pop(L, 1); } lua_pushlightuserdata(L, sentinel); lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */ lua_pushstring(L, name); /* pass name as argument to module */ lua_call(L, 1, 1); /* run loaded module */ if (!lua_isnil(L, -1)) /* non-nil return? */ lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ lua_getfield(L, 2, name); if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */ lua_pushboolean(L, 1); /* use true as result */ lua_pushvalue(L, -1); /* extra copy to be returned */ lua_setfield(L, 2, name); /* _LOADED[name] = true */ } return 1; } /* }====================================================== */ /* ** {====================================================== ** 'module' function ** ======================================================= */ static void setfenv (lua_State *L) { lua_Debug ar; lua_getstack(L, 1, &ar); lua_getinfo(L, "f", &ar); lua_pushvalue(L, -2); lua_setfenv(L, -2); lua_pop(L, 1); } static void dooptions (lua_State *L, int n) { int i; for (i = 2; i <= n; i++) { lua_pushvalue(L, i); /* get option (a function) */ lua_pushvalue(L, -2); /* module */ lua_call(L, 1, 0); } } static void modinit (lua_State *L, const char *modname) { const char *dot; lua_pushvalue(L, -1); lua_setfield(L, -2, "_M"); /* module._M = module */ lua_pushstring(L, modname); lua_setfield(L, -2, "_NAME"); dot = strrchr(modname, '.'); /* look for last dot in module name */ if (dot == NULL) dot = modname; else dot++; /* set _PACKAGE as package name (full module name minus last part) */ lua_pushlstring(L, modname, dot - modname); lua_setfield(L, -2, "_PACKAGE"); } static int ll_module (lua_State *L) { const char *modname = luaL_checkstring(L, 1); int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); lua_getfield(L, loaded, modname); /* get _LOADED[modname] */ if (!lua_istable(L, -1)) { /* not found? */ lua_pop(L, 1); /* remove previous result */ /* try global variable (and create one if it does not exist) */ if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL) return luaL_error(L, "name conflict for module " LUA_QS, modname); lua_pushvalue(L, -1); lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */ } /* check whether table already has a _NAME field */ lua_getfield(L, -1, "_NAME"); if (!lua_isnil(L, -1)) /* is table an initialized module? */ lua_pop(L, 1); else { /* no; initialize it */ lua_pop(L, 1); modinit(L, modname); } lua_pushvalue(L, -1); setfenv(L); dooptions(L, loaded - 1); return 0; } static int ll_seeall (lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); if (!lua_getmetatable(L, 1)) { lua_createtable(L, 0, 1); /* create new metatable */ lua_pushvalue(L, -1); lua_setmetatable(L, 1); } lua_pushvalue(L, LUA_GLOBALSINDEX); lua_setfield(L, -2, "__index"); /* mt.__index = _G */ return 0; } /* }====================================================== */ /* auxiliary mark (for internal use) */ #define AUXMARK "\1" static void setpath (lua_State *L, const char *fieldname, const char *envname, const char *def) { const char *path = getenv(envname); if (path == NULL) /* no environment variable? */ lua_pushstring(L, def); /* use default */ else { /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP, LUA_PATHSEP AUXMARK LUA_PATHSEP); luaL_gsub(L, path, AUXMARK, def); lua_remove(L, -2); } setprogdir(L); lua_setfield(L, -2, fieldname); } static const luaL_Reg pk_funcs[] = { {"loadlib", ll_loadlib}, {"seeall", ll_seeall}, {NULL, NULL} }; static const luaL_Reg ll_funcs[] = { {"module", ll_module}, {"require", ll_require}, {NULL, NULL} }; static const lua_CFunction loaders[] = {loader_preload, loader_Lua, loader_C, loader_Croot, NULL}; LUALIB_API int luaopen_package (lua_State *L) { int i; /* create new type _LOADLIB */ luaL_newmetatable(L, "_LOADLIB"); lua_pushcfunction(L, gctm); lua_setfield(L, -2, "__gc"); /* create `package' table */ luaL_register(L, LUA_LOADLIBNAME, pk_funcs); #if defined(LUA_COMPAT_LOADLIB) lua_getfield(L, -1, "loadlib"); lua_setfield(L, LUA_GLOBALSINDEX, "loadlib"); #endif lua_pushvalue(L, -1); lua_replace(L, LUA_ENVIRONINDEX); /* create `loaders' table */ lua_createtable(L, 0, sizeof(loaders)/sizeof(loaders[0]) - 1); /* fill it with pre-defined loaders */ for (i=0; loaders[i] != NULL; i++) { lua_pushcfunction(L, loaders[i]); lua_rawseti(L, -2, i+1); } lua_setfield(L, -2, "loaders"); /* put it in field `loaders' */ setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */ setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */ /* store config information */ lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" LUA_EXECDIR "\n" LUA_IGMARK); lua_setfield(L, -2, "config"); /* set field `loaded' */ luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2); lua_setfield(L, -2, "loaded"); /* set field `preload' */ lua_newtable(L); lua_setfield(L, -2, "preload"); lua_pushvalue(L, LUA_GLOBALSINDEX); luaL_register(L, NULL, ll_funcs); /* open lib into global table */ lua_pop(L, 1); return 1; /* return 'package' table */ } premake-3.7.orig/Src/Lua/lobject.c0000644000000000000000000001257211043456337013707 0ustar /* ** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */ #include #include #include #include #include #define lobject_c #define LUA_CORE #include "lua.h" #include "ldo.h" #include "lmem.h" #include "lobject.h" #include "lstate.h" #include "lstring.h" #include "lvm.h" const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL}; /* ** converts an integer to a "floating point byte", represented as ** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if ** eeeee != 0 and (xxx) otherwise. */ int luaO_int2fb (unsigned int x) { int e = 0; /* expoent */ while (x >= 16) { x = (x+1) >> 1; e++; } if (x < 8) return x; else return ((e+1) << 3) | (cast_int(x) - 8); } /* converts back */ int luaO_fb2int (int x) { int e = (x >> 3) & 31; if (e == 0) return x; else return ((x & 7)+8) << (e - 1); } int luaO_log2 (unsigned int x) { static const lu_byte log_2[256] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 }; int l = -1; while (x >= 256) { l += 8; x >>= 8; } return l + log_2[x]; } int luaO_rawequalObj (const TValue *t1, const TValue *t2) { if (ttype(t1) != ttype(t2)) return 0; else switch (ttype(t1)) { case LUA_TNIL: return 1; case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */ case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); default: lua_assert(iscollectable(t1)); return gcvalue(t1) == gcvalue(t2); } } int luaO_str2d (const char *s, lua_Number *result) { char *endptr; *result = lua_str2number(s, &endptr); if (endptr == s) return 0; /* conversion failed */ if (*endptr == 'x' || *endptr == 'X') /* maybe an hexadecimal constant? */ *result = cast_num(strtoul(s, &endptr, 16)); if (*endptr == '\0') return 1; /* most common case */ while (isspace(cast(unsigned char, *endptr))) endptr++; if (*endptr != '\0') return 0; /* invalid trailing characters? */ return 1; } static void pushstr (lua_State *L, const char *str) { setsvalue2s(L, L->top, luaS_new(L, str)); incr_top(L); } /* this function handles only `%d', `%c', %f, %p, and `%s' formats */ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { int n = 1; pushstr(L, ""); for (;;) { const char *e = strchr(fmt, '%'); if (e == NULL) break; setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt)); incr_top(L); switch (*(e+1)) { case 's': { const char *s = va_arg(argp, char *); if (s == NULL) s = "(null)"; pushstr(L, s); break; } case 'c': { char buff[2]; buff[0] = cast(char, va_arg(argp, int)); buff[1] = '\0'; pushstr(L, buff); break; } case 'd': { setnvalue(L->top, cast_num(va_arg(argp, int))); incr_top(L); break; } case 'f': { setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber))); incr_top(L); break; } case 'p': { char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */ sprintf(buff, "%p", va_arg(argp, void *)); pushstr(L, buff); break; } case '%': { pushstr(L, "%"); break; } default: { char buff[3]; buff[0] = '%'; buff[1] = *(e+1); buff[2] = '\0'; pushstr(L, buff); break; } } n += 2; fmt = e+2; } pushstr(L, fmt); luaV_concat(L, n+1, cast_int(L->top - L->base) - 1); L->top -= n; return svalue(L->top - 1); } const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { const char *msg; va_list argp; va_start(argp, fmt); msg = luaO_pushvfstring(L, fmt, argp); va_end(argp); return msg; } void luaO_chunkid (char *out, const char *source, size_t bufflen) { if (*source == '=') { strncpy(out, source+1, bufflen); /* remove first char */ out[bufflen-1] = '\0'; /* ensures null termination */ } else { /* out = "source", or "...source" */ if (*source == '@') { size_t l; source++; /* skip the `@' */ bufflen -= sizeof(" '...' "); l = strlen(source); strcpy(out, ""); if (l > bufflen) { source += (l-bufflen); /* get last part of file name */ strcat(out, "..."); } strcat(out, source); } else { /* out = [string "string"] */ size_t len = strcspn(source, "\n\r"); /* stop at first newline */ bufflen -= sizeof(" [string \"...\"] "); if (len > bufflen) len = bufflen; strcpy(out, "[string \""); if (source[len] != '\0') { /* must truncate? */ strncat(out, source, len); strcat(out, "..."); } else strcat(out, source); strcat(out, "\"]"); } } } premake-3.7.orig/Src/gnu_cpp.c0000644000000000000000000004204311062460411013160 0ustar /********************************************************************** * Premake - gnu_cpp.c * The GNU C/C++ makefile target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "gnu.h" #include "os.h" static const char* filterLinks(const char* name); static const char* listCppSources(const char* name); static const char* listRcSources(const char* name); static const char* listCppTargets(const char* name); static const char* listRcTargets(const char* name); static const char* listLinkerDeps(const char* name); int gnu_cpp() { int i; const char* prefix = (g_verbose) ? "" : "@"; /* Open package makefile and write the header */ if (gnu_pkgOwnsPath()) strcpy(g_buffer, path_join(prj_get_pkgpath(), "Makefile", "")); else strcpy(g_buffer, path_join(prj_get_pkgpath(), prj_get_pkgname(), DOT_MAKE)); io_openfile(g_buffer); io_print("# %s ", prj_is_lang("c++") ? "C++" : "C"); if (prj_is_kind("exe")) io_print("Console Executable"); else if (prj_is_kind("winexe")) io_print("Windowed Executable"); else if (prj_is_kind("dll")) io_print("Shared Library"); else if (prj_is_kind("lib")) io_print("Static Library"); io_print(" Makefile autogenerated by premake\n"); io_print("# Don't edit this file! Instead edit `premake.lua` then rerun `make`\n\n"); /* Set a default configuration */ prj_select_config(0); io_print("ifndef CONFIG\n"); io_print(" CONFIG=%s\n", prj_get_cfgname()); io_print("endif\n\n"); /* fake support for universal binaries */ io_print("# if multiple archs are defined turn off automated dependency generation\n"); io_print("DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)\n\n"); /* Process the build configurations */ for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print("ifeq ($(CONFIG),%s)\n", prj_get_cfgname()); io_print(" BINDIR := %s\n", gnu_escapePath(prj_get_bindir())); io_print(" LIBDIR := %s\n", gnu_escapePath(prj_get_libdir())); io_print(" OBJDIR := %s\n", gnu_escapePath(prj_get_objdir())); io_print(" OUTDIR := %s\n", gnu_escapePath(prj_get_outdir())); /* Write preprocessor flags - how to generate dependencies for DMC? */ io_print(" CPPFLAGS :="); if (!matches(g_cc, "dmc")) io_print(" $(DEPFLAGS)"); print_list(prj_get_defines(), " -D \"", "\"", "", NULL); print_list(prj_get_incpaths(), " -I \"", "\"", "", NULL); io_print("\n"); /* Write C flags */ io_print(" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH)"); if (prj_is_kind("dll") && !os_is("windows")) io_print(" -fPIC"); if (!prj_has_flag("no-symbols")) io_print(" -g"); if (prj_has_flag("optimize-size")) io_print(" -Os"); if (prj_has_flag("optimize-speed")) io_print(" -O3"); if (prj_has_flag("optimize") && !prj_has_flag("optimize-size") && !prj_has_flag("optimize-speed")) io_print(" -O2"); if (prj_has_flag("extra-warnings")) io_print(" -Wall"); if (prj_has_flag("fatal-warnings")) io_print(" -Werror"); if (prj_has_flag("no-frame-pointer")) io_print(" -fomit-frame-pointer"); print_list(prj_get_buildoptions(), " ", "", "", NULL); io_print("\n"); /* Write C++ flags */ io_print(" CXXFLAGS += $(CFLAGS)"); if (prj_has_flag("no-exceptions")) io_print(" --no-exceptions"); if (prj_has_flag("no-rtti")) io_print(" --no-rtti"); io_print("\n"); /* Write linker flags */ io_print(" LDFLAGS += -L$(BINDIR) -L$(LIBDIR)"); if (prj_is_kind("dll") && (g_cc == NULL || matches(g_cc, "gcc"))) { if (!os_is("macosx")) io_print(" -shared"); /* Create import libraries for DLLs if we're using Cygwin or MinGW. * This seems fragile to me, but I'm going to let it sit and see * if anyone complains about it. */ if (!prj_has_flag("no-import-lib") && os_is("windows")) { const char* str; io_print(" -Wl,--out-implib=\"%s", prj_get_libdir()); if (prj_get_prefix() == NULL) str = "lib"; else str = prj_get_prefix(); if (prj_has_importlibname()) io_print("/%s%s.a\"", str, prj_get_importlibname()); else io_print("/%s%s.a\"", str, path_getbasename(prj_get_target())); } } if (prj_is_kind("winexe")) io_print(" -mwindows"); /* OS X has a bug, see http://lists.apple.com/archives/Darwin-dev/2006/Sep/msg00084.html */ if (prj_has_flag("no-symbols")) { if (os_is("macosx")) io_print(" -Wl,-x"); else io_print(" -s"); } if (os_is("macosx") && prj_has_flag("dylib")) io_print(" -dynamiclib -flat_namespace"); print_list(prj_get_linkoptions(), " ", "", "", NULL); print_list(prj_get_libpaths(), " -L\"", "\"", "", NULL); print_list(prj_get_links(), " ", "", "", filterLinks); io_print("\n"); /* Build a list of libraries this target depends on */ io_print(" LDDEPS :="); print_list(prj_get_links(), " ", "", "", listLinkerDeps); io_print("\n"); /* Build a list of flags for the resource compiler */ io_print(" RESFLAGS :="); print_list(prj_get_resdefines(), " -D \"", "\"", "", NULL); print_list(prj_get_respaths(), " -I \"", "\"", "", NULL); print_list(prj_get_resoptions(), " ", "", "", NULL); io_print("\n"); /* Build the target name */ io_print(" TARGET := %s\n", gnu_escapePath(path_getname(prj_get_target()))); if (os_is("macosx") && prj_is_kind("winexe")) io_print(" MACAPP := %s.app/Contents\n", gnu_escapePath(path_getname(prj_get_target()))); /* Build command */ io_print(" BLDCMD = "); if (prj_is_kind("lib")) { io_print("ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH)"); } else if (prj_is_kind("winexe") && os_is("macosx")) { io_print("$(%s) -o $(OUTDIR)/$(MACAPP)/MacOS/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)", prj_is_lang("c") ? "CC" : "CXX"); } else { io_print("$(%s) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)", prj_is_lang("c") ? "CC" : "CXX"); } io_print("\n"); /* Pre-build commands */ if (prj_get_numprebuildcommands() > 0) { io_print("\n define prebuildcmd\n"); io_print("\t@echo Running pre-build commands...\n"); print_list(prj_get_prebuildcommands(), "\t", "\n", "", NULL); io_print(" endef\n"); } /* Pre-link commands */ if (prj_get_numprelinkcommands() > 0) { io_print("\n define prelinkcmd\n"); io_print("\t@echo Running pre-link commands...\n"); print_list(prj_get_prelinkcommands(), "\t", "\n", "", NULL); io_print(" endef\n"); } /* Post-build commands */ if (prj_get_numpostbuildcommands() > 0) { io_print("\n define postbuildcmd\n"); io_print("\t@echo Running post-build commands...\n"); print_list(prj_get_postbuildcommands(), "\t", "\n", "", NULL); io_print(" endef\n"); } io_print("endif\n\n"); } /* Write out the list of object file targets for all C/C++ sources */ io_print("OBJECTS := \\\n"); print_list(prj_get_files(), "\t$(OBJDIR)/", " \\\n", "", listCppSources); io_print("\n"); /* Write out the list of resource files for windows targets */ if (os_is("windows")) { io_print("RESOURCES := \\\n"); print_list(prj_get_files(), "\t$(OBJDIR)/", " \\\n", "", listRcSources); io_print("\n"); } /* Try to figure out how to safely create a directory */ io_print("MKDIR_TYPE := msdos\n"); io_print("CMD := $(subst \\,\\\\,$(ComSpec)$(COMSPEC))\n"); io_print("ifeq (,$(CMD))\n"); io_print(" MKDIR_TYPE := posix\n"); io_print("endif\n"); io_print("ifeq (/bin,$(findstring /bin,$(SHELL)))\n"); io_print(" MKDIR_TYPE := posix\n"); io_print("endif\n"); io_print("ifeq ($(MKDIR_TYPE),posix)\n"); io_print(" CMD_MKBINDIR := mkdir -p $(BINDIR)\n"); io_print(" CMD_MKLIBDIR := mkdir -p $(LIBDIR)\n"); io_print(" CMD_MKOUTDIR := mkdir -p $(OUTDIR)\n"); io_print(" CMD_MKOBJDIR := mkdir -p $(OBJDIR)\n"); io_print("else\n"); io_print(" CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\\\,$(BINDIR)) mkdir $(subst /,\\\\,$(BINDIR))\n"); io_print(" CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\\\,$(LIBDIR)) mkdir $(subst /,\\\\,$(LIBDIR))\n"); io_print(" CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\\\,$(OUTDIR)) mkdir $(subst /,\\\\,$(OUTDIR))\n"); io_print(" CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\\\,$(OBJDIR)) mkdir $(subst /,\\\\,$(OBJDIR))\n"); io_print("endif\n"); io_print("\n"); io_print(".PHONY: clean"); if (prj_get_numprebuildcommands() > 0) io_print(" prebuild"); if (prj_get_numprelinkcommands() > 0) io_print(" prelink"); io_print("\n\n"); /* Write the main build target */ if (os_is("macosx") && prj_is_kind("winexe")) { io_print("all: $(OUTDIR)/$(MACAPP)/PkgInfo $(OUTDIR)/$(MACAPP)/Info.plist $(OUTDIR)/$(MACAPP)/MacOS/$(TARGET)\n\n"); io_print("$(OUTDIR)/$(MACAPP)/MacOS/$(TARGET)"); } else { io_print("$(OUTDIR)/$(TARGET)"); } io_print(": "); if (prj_get_numprebuildcommands() > 0) io_print("prebuild "); io_print("$(OBJECTS) $(LDDEPS) $(RESOURCES)"); if (prj_get_numprelinkcommands() > 0) io_print(" prelink"); io_print("\n"); if (!g_verbose) io_print("\t@echo Linking %s\n", prj_get_pkgname()); io_print("\t-%s$(CMD_MKBINDIR)\n", prefix); io_print("\t-%s$(CMD_MKLIBDIR)\n", prefix); io_print("\t-%s$(CMD_MKOUTDIR)\n", prefix); if (os_is("macosx") && prj_is_kind("winexe")) io_print("\t-%sif [ ! -d $(OUTDIR)/$(MACAPP)/MacOS ]; then mkdir -p $(OUTDIR)/$(MACAPP)/MacOS; fi\n", prefix); io_print("\t%s$(BLDCMD)\n", prefix); if (prj_get_numpostbuildcommands() > 0) io_print("\t$(postbuildcmd)\n"); io_print("\n"); if (prj_get_numprebuildcommands() > 0) { io_print("prebuild:\n"); io_print("\t$(prebuildcmd)\n\n"); } if (prj_get_numprelinkcommands() > 0) { io_print("prelink:\n"); io_print("\t$(prelinkcmd)\n\n"); } if (os_is("macosx") && prj_is_kind("winexe")) { io_print("$(OUTDIR)/$(MACAPP)/PkgInfo:\n\n"); io_print("$(OUTDIR)/$(MACAPP)/Info.plist:\n\n"); } /* Write the "clean" target */ io_print("clean:\n"); io_print("\t@echo Cleaning %s\n", prj_get_pkgname()); io_print("ifeq ($(MKDIR_TYPE),posix)\n"); if (os_is("macosx") && prj_is_kind("winexe")) io_print("\t-%srm -rf $(OUTDIR)/$(TARGET).app\n", prefix); else io_print("\t-%srm -f $(OUTDIR)/$(TARGET)\n", prefix); io_print("\t-%srm -rf $(OBJDIR)\n", prefix); io_print("else\n"); io_print("\t-%sif exist $(subst /,\\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\\,$(OUTDIR)/$(TARGET))\n", prefix); io_print("\t-%sif exist $(subst /,\\,$(OBJDIR)) del /q $(subst /,\\,$(OBJDIR))\n", prefix); io_print("\t-%sif exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR))\n", prefix); io_print("endif\n\n"); /* Write static patterns for each source file. Note that in earlier * versions I used pattern rules instead of listing each file. It worked * fine but made it more difficult to test and also required the use of * VPATH which I didn't like. This new approach of listing each file * helps testing and opens the way for per-file configurations */ print_list(prj_get_files(), "", "\n", "", listCppTargets); if (os_is("windows")) print_list(prj_get_files(), "", "", "", listRcTargets); /* Include the automatically generated dependency lists */ io_print("-include $(OBJECTS:%%.o=%%.d)\n\n"); io_closefile(); return 1; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* filterLinks(const char* name) { int i = prj_find_package(name); if (i >= 0) { /* is a sibling */ const char* kind = prj_get_kind_for(i); const char* lang = prj_get_language_for(i); if ((matches(lang, "c++") || matches(lang, "c")) && (matches(kind, "dll") || matches(kind, "lib"))) { const char* dir; const char* target; target = prj_get_target_for(i); strcpy(g_buffer, ""); /* Add -L if path to sibling libraries, so they don't get * encoded in this linking binary (see bug #1729227) */ dir = path_getdir(target); if (!prj_has_libpath(dir)) { strcat(g_buffer, "-L"); strcat(g_buffer, dir); strcat(g_buffer, " "); } strcat(g_buffer, "-l"); strcat(g_buffer, prj_get_targetname_for(i)); return g_buffer; } else { return NULL; } } else { /* is not a sibling, just output directly */ strcpy(g_buffer, "-l"); strcat(g_buffer, name); return g_buffer; } } /************************************************************************ * Checks each source code file and filters out everything that is * not a C or C++ file ***********************************************************************/ static const char* listCppSources(const char* name) { if (is_cpp(name)) { strcpy(g_buffer, gnu_escapePath(path_getbasename(name))); strcat(g_buffer, ".o"); return g_buffer; } return NULL; } /************************************************************************ * Checks each source code file and filters out everything that is * not a windows resource file ***********************************************************************/ static const char* listRcSources(const char* name) { const char* ext = path_getextension(name); if (matches(ext, ".rc")) { strcpy(g_buffer, gnu_escapePath(path_getbasename(name))); strcat(g_buffer, ".res"); return g_buffer; } return NULL; } /************************************************************************ * Creates the makefile build rules for all source code files ***********************************************************************/ static const char* listCppTargets(const char* name) { if (is_cpp(name)) { const char* ext = path_getextension(name); sprintf(g_buffer, "$(OBJDIR)/%s.o: ", gnu_escapePath(path_getbasename(name))); strcat(g_buffer, gnu_escapePath(name)); strcat(g_buffer, "\n\t-"); if (!g_verbose) strcat(g_buffer, "@"); strcat(g_buffer, "$(CMD_MKOBJDIR)\n"); if (!g_verbose) strcat(g_buffer, "\t@echo $(notdir $<)\n"); strcat(g_buffer, "\t"); if (!g_verbose) strcat(g_buffer, "@"); if (matches(g_cc, "dmc")) { /* Digital Mars compiler build step */ /* FIXME: How to handle assembly files with DMC? */ if (matches(ext, ".c")) strcat(g_buffer, "dmc $(CFLAGS) -o \"$@\" -c \"$<\"\n"); else if (!matches(ext, ".s")) strcat(g_buffer, "dmc -cpp -Ae -Ar -mn $(CXXFLAGS) -o \"$@\" -c \"$<\"\n"); } else { /* GNU GCC compiler build step */ if (matches(ext, ".s")) strcat(g_buffer, "$(CC) -x assembler-with-cpp $(CPPFLAGS) -o \"$@\" -c \"$<\"\n"); else if (matches(ext, ".c")) strcat(g_buffer, "$(CC) $(CFLAGS) -o \"$@\" -c \"$<\"\n"); else strcat(g_buffer, "$(CXX) $(CXXFLAGS) -o \"$@\" -c \"$<\"\n"); } return g_buffer; } else { return NULL; } } /************************************************************************ * Creates the makefile build rules for windows resource files ***********************************************************************/ static const char* listRcTargets(const char* name) { const char* prefix = (g_verbose) ? "" : "@"; name = gnu_escapePath(name); if (matches(path_getextension(name), ".rc")) { const char* base = path_getbasename(name); io_print("$(OBJDIR)/%s.res: %s\n", base, name); io_print("\t-%s$(CMD_MKOBJDIR)\n", prefix); if (!g_verbose) io_print("\t@echo $(notdir $<)\n"); if (matches(g_cc, "dmc")) io_print("\t%srcc $< -o \"$@\" $(RESFLAGS)\n", prefix); else io_print("\t%swindres $< -O coff -o \"$@\" $(RESFLAGS)\n", prefix); io_print("\n"); } return NULL; } /************************************************************************ * This is called by the code that builds the list of dependencies for * the link step. It looks for sibling projects, and then returns the * full path to that target's output. So if an executable package * depends on a library package, the library filename will be listed * as a dependency ***********************************************************************/ static const char* listLinkerDeps(const char* name) { int i = prj_find_package(name); if (i >= 0) { return prj_get_target_for(i); } return NULL; } premake-3.7.orig/Src/project.h0000644000000000000000000001326411062460411013203 0ustar /********************************************************************** * Premake - project.h * An interface around the project data. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ typedef struct tagOption { const char* flag; const char* desc; } Option; typedef struct tagPrjConfig { const char* name; const char* bindir; const char* libdir; } PrjConfig; typedef struct tagFileConfig { const char* buildaction; } FileConfig; typedef struct tagPkgConfig { PrjConfig* prjConfig; const char** buildopts; const char** prebuildcmds; const char** prelinkcmds; const char** postbuildcmds; const char** defines; const char** resdefines; const char* extension; const char** files; const char** flags; const char** incpaths; const char** respaths; const char** libpaths; const char** linkopts; const char** resopts; const char** links; const char* bindir; const char* libdir; const char* objdir; const char* prefix; const char* target; const char* kind; const char* pchHeader; const char* pchSource; const char* implibname; FileConfig** fileconfigs; } PkgConfig; typedef struct tagPackage { int index; const char* name; const char* path; const char* script; const char* lang; const char* objdir; const char* url; const char* guid; PkgConfig** configs; void* data; } Package; typedef struct tagProject { const char* name; const char* path; const char* script; Option** options; PrjConfig** configs; Package** packages; } Project; extern Project* project; void prj_open(); void prj_close(); const char* prj_find_filetype(const char* extension); int prj_find_package(const char* name); const char* prj_get_bindir(); const char* prj_get_buildaction(); const char** prj_get_buildoptions(); const char** prj_get_prebuildcommands(); const char** prj_get_prelinkcommands(); const char** prj_get_postbuildcommands(); const char* prj_get_cfgname(); PkgConfig* prj_get_config_for(int i); void* prj_get_data(); void* prj_get_data_for(int i); const char** prj_get_defines(); const char* prj_get_extension(); const char** prj_get_files(); const char* prj_get_kind(); const char* prj_get_kind_for(int i); const char** prj_get_incpaths(); const char* prj_get_language(); const char* prj_get_language_for(int i); const char* prj_get_libdir(); const char* prj_get_libdir_for(int i); const char** prj_get_libpaths(); const char** prj_get_linkoptions(); const char** prj_get_links(); const char* prj_get_name(); int prj_get_numbuildoptions(); int prj_get_numprebuildcommands(); int prj_get_numprelinkcommands(); int prj_get_numpostbuildcommands(); int prj_get_numconfigs(); int prj_get_numdefines(); int prj_get_numincpaths(); int prj_get_numlinkoptions(); int prj_get_numlinks(); int prj_get_numoptions(); int prj_get_numpackages(); int prj_get_numresdefines(); int prj_get_numresoptions(); int prj_get_numrespaths(); const char* prj_get_objdir(); const char* prj_get_optdesc(); const char* prj_get_optname(); const char* prj_get_outdir(); const char* prj_get_outdir_for(int i); Package* prj_get_package(); Package* prj_get_package_for(int i); const char* prj_get_path(); const char* prj_get_pch_header(); const char* prj_get_pch_source(); const char* prj_get_pkgfilename(const char* extension); const char* prj_get_pkgfilename_for(int i, const char* extension); const char* prj_get_pkgname(); const char* prj_get_pkgname_for(int i); const char* prj_get_pkgobjdir(); const char* prj_get_pkgpath(); const char* prj_get_pkgpath_for(int i); const char* prj_get_pkgscript(); const char* prj_get_prefix(); const char** prj_get_resdefines(); const char** prj_get_resoptions(); const char** prj_get_respaths(); const char* prj_get_script(); const char* prj_get_target(); const char* prj_get_target_for(int i); const char* prj_get_relativetarget_for(int i); const char* prj_get_target_raw(); const char* prj_get_targetname_for(int i); const char* prj_get_url(); int prj_has_file(const char* name); int prj_has_flag(const char* flag); int prj_has_flag_for(int i, const char* flag); int prj_has_libpath(const char* path); int prj_has_pch(); int prj_is_buildaction(const char* action); int prj_is_kind(const char* kind); int prj_is_lang(const char* lang); void prj_select_config(int i); void prj_select_file(const char* name); void prj_select_option(int i); void prj_select_package(int i); void prj_set_buildaction(const char* action); void prj_set_data(void* data); void** prj_newlist(int len); void prj_freelist(void** list); int prj_getlistsize(void** list); int prj_has_guid(); const char* prj_get_guid(); int prj_has_importlibname(); const char* prj_get_importlibname(); premake-3.7.orig/Src/vs2008.h0000644000000000000000000000152711003166564012505 0ustar /********************************************************************** * Premake - vs2008.h * The Visual Studio 2008 target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ int vs2008_generate(); int vs2008_cs(); premake-3.7.orig/Src/gnu.h0000644000000000000000000000171511043442605012330 0ustar /********************************************************************** * Premake - gnu.h * The GNU makefile target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #define DOT_MAKE "make" int gnu_generate(); int gnu_cpp(); int gnu_cs(); /* Helpers */ int gnu_pkgOwnsPath(); const char* gnu_escapePath(const char* path); premake-3.7.orig/Src/vs2008.c0000644000000000000000000001615111003166564012477 0ustar /********************************************************************** * Premake - vs2008.c * The Visual Studio 2008 target * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "premake.h" #include "vs.h" #include "vs2008.h" static int vs2008_write_solution(); static const char* list_aspnet_refs(const char* name); int vs2008_generate() { int p; vs_setversion(VS2008); printf("Generating Visual Studio 2008 solution and project files:\n"); /* Assign GUIDs to packages */ vs_assign_guids(); /* Generate the project files */ for (p = 0; p < prj_get_numpackages(); ++p) { prj_select_package(p); prj_select_config(0); printf("...%s\n", prj_get_pkgname()); if (prj_is_kind("aspnet")) { /* No project files?! */ } else if (prj_is_lang("c++") || prj_is_lang("c")) { if (!vs_write_cpp()) return 0; } else if (prj_is_lang("c#")) { if (!vs2008_cs()) return 0; } else { printf("** Warning: %s packages are not supported by this generator\n", prj_get_language()); } } return vs2008_write_solution(); } /************************************************************************ * Write out the solution file ***********************************************************************/ static int vs2008_write_solution() { VsPkgData* data; int hasDotNet, hasCpp; int i, j; int numAspNet, port; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "sln"))) return 0; /* Format identification string */ io_print("Microsoft Visual Studio Solution File, Format Version 10.00\n"); io_print("# Visual Studio 2008\n"); /* List packages */ numAspNet = 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); prj_select_config(0); data = (VsPkgData*)prj_get_data(); if (prj_is_kind("aspnet")) { const char* path = prj_get_pkgpath(); if (strlen(path) == 0) path = "."; io_print("Project(\"{%s}\") = \"%s\", \"%s\\\", \"{%s}\"\n", data->toolGuid, prj_get_pkgname(), path, data->projGuid); io_print("\tProjectSection(WebsiteProperties) = preProject\n"); if (prj_get_numlinks() > 0) print_list(prj_get_links(), "\t\tProjectReferences = \"", ";\"\n", ";", list_aspnet_refs); for (j = 0; j < prj_get_numconfigs(); ++j) { prj_select_config(j); io_print("\t\t%s.AspNetCompiler.VirtualPath = \"/%s\"\n", prj_get_cfgname(), prj_get_pkgname()); io_print("\t\t%s.AspNetCompiler.PhysicalPath = \"%s\\\"\n", prj_get_cfgname(), path); io_print("\t\t%s.AspNetCompiler.TargetPath = \"PrecompiledWeb\\%s\\\"\n", prj_get_cfgname(), prj_get_pkgname()); io_print("\t\t%s.AspNetCompiler.Updateable = \"true\"\n", prj_get_cfgname()); io_print("\t\t%s.AspNetCompiler.ForceOverwrite = \"true\"\n", prj_get_cfgname()); io_print("\t\t%s.AspNetCompiler.FixedNames = \"false\"\n", prj_get_cfgname()); io_print("\t\t%s.AspNetCompiler.Debug = \"%s\"\n", prj_get_cfgname(), prj_has_flag("no-symbols") ? "False" : "True"); } if (numAspNet == 0) port = 1106; else if (numAspNet == 1) port = 1231; else port = 1251 + 2 * (numAspNet - 2); io_print("\t\tVWDPort = \"%d\"\n", port); numAspNet++; if (prj_is_lang("c#")) io_print("\t\tDefaultWebSiteLanguage = \"Visual C#\"\n"); io_print("\tEndProjectSection\n"); } else { io_print("Project(\"{%s}\") = \"%s\", \"%s\", \"{%s}\"\n", data->toolGuid, prj_get_pkgname(), prj_get_pkgfilename(data->projExt), data->projGuid); /* Write dependencies */ prj_select_config(0); io_print("\tProjectSection(ProjectDependencies) = postProject\n"); print_list(prj_get_links(), "\t\t", "\n", "", vs_list_pkgdeps); io_print("\tEndProjectSection\n"); } io_print("EndProject\n"); } /* List configurations */ io_print("Global\n"); io_print("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"); hasDotNet = 0; hasCpp = 0; for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); if (prj_is_lang("c") || prj_is_lang("c++")) hasCpp = 1; else hasDotNet = 1; } prj_select_package(0); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); if (hasDotNet) io_print("\t\t%s|Any CPU = %s|Any CPU\n", prj_get_cfgname(), prj_get_cfgname()); if (hasDotNet && hasCpp) io_print("\t\t%s|Mixed Platforms = %s|Mixed Platforms\n", prj_get_cfgname(), prj_get_cfgname()); if (hasCpp) io_print("\t\t%s|Win32 = %s|Win32\n", prj_get_cfgname(), prj_get_cfgname()); } io_print("\tEndGlobalSection\n"); /* Write configuration for each package */ io_print("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); for (j = 0; j < prj_get_numconfigs(); ++j) { const char* arch; prj_select_config(j); data = (VsPkgData*)prj_get_data(); if (prj_is_lang("c") || prj_is_lang("c++")) arch = "Win32"; else arch = "Any CPU"; if (hasDotNet) { io_print("\t\t{%s}.%s|Any CPU.ActiveCfg = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); if (!prj_is_lang("c") && !prj_is_lang("c++")) io_print("\t\t{%s}.%s|Any CPU.Build.0 = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); } if (hasDotNet && hasCpp) { io_print("\t\t{%s}.%s|Mixed Platforms.ActiveCfg = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); io_print("\t\t{%s}.%s|Mixed Platforms.Build.0 = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); } if (hasCpp) { io_print("\t\t{%s}.%s|Win32.ActiveCfg = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); if (prj_is_lang("c") || prj_is_lang("c++")) io_print("\t\t{%s}.%s|Win32.Build.0 = %s|%s\n", data->projGuid, prj_get_cfgname(), prj_get_cfgname(), arch); } } } io_print("\tEndGlobalSection\n"); /* Finish */ io_print("\tGlobalSection(SolutionProperties) = preSolution\n"); io_print("\t\tHideSolutionNode = FALSE\n"); io_print("\tEndGlobalSection\n"); io_print("EndGlobal\n"); io_closefile(); return 1; } static const char* list_aspnet_refs(const char* name) { int i = prj_find_package(name); if (i >= 0) { VsPkgData* data = (VsPkgData*)prj_get_data_for(i); sprintf(g_buffer, "{%s}|%s.dll", data->projGuid, prj_get_pkgname_for(i)); return g_buffer; } return NULL; } premake-3.7.orig/Src/platform_windows.c0000644000000000000000000001061610611151102015115 0ustar /********************************************************************** * Premake - platform_windows.h * Windows-specific functions. * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include "os.h" #if defined(PLATFORM_WINDOWS) #include #include "io.h" #include "path.h" #include "util.h" #include "platform.h" #define WIN32_LEAN_AND_MEAN #include static char buffer[8192]; struct PlatformMaskData { char* maskPath; HANDLE handle; WIN32_FIND_DATA entry; int isFirst; }; static int (__stdcall *CoCreateGuid)(char*) = NULL; int platform_chdir(const char* path) { return SetCurrentDirectory(path); } int platform_copyfile(const char* src, const char* dest) { return CopyFile(src, dest, FALSE); } int platform_findlib(const char* name, char* buffer, int len) { HMODULE hDll = LoadLibrary(name); if (hDll != NULL) { GetModuleFileName(hDll, buffer, len); strcpy(buffer, path_getdir(buffer)); FreeLibrary(hDll); return 1; } else { return 0; } } int platform_getcwd(char* buffer, int len) { GetCurrentDirectory(len, buffer); return 1; } void platform_getuuid(char* uuid) { if (CoCreateGuid == NULL) { HMODULE hOleDll = LoadLibrary("OLE32.DLL"); CoCreateGuid = (int(__stdcall*)(char*))GetProcAddress(hOleDll, "CoCreateGuid"); } CoCreateGuid((char*)uuid); } int platform_isAbsolutePath(const char* path) { return (path[0] == '/' || path[0] == '\\' || (strlen(path) > 1 && path[1] == ':')); } int platform_mask_close(MaskHandle data) { if (data->handle != INVALID_HANDLE_VALUE) FindClose(data->handle); free(data->maskPath); free(data); return 1; } const char* platform_mask_getname(MaskHandle data) { strcpy(buffer, data->maskPath); if (strlen(buffer) > 0) strcat(buffer, "/"); strcat(buffer, data->entry.cFileName); return buffer; } int platform_mask_getnext(MaskHandle data) { if (data->handle == INVALID_HANDLE_VALUE) return 0; if (data->isFirst) { data->isFirst = 0; return 1; } else { return FindNextFile(data->handle, &data->entry); } } int platform_mask_isfile(MaskHandle data) { return (data->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0; } MaskHandle platform_mask_open(const char* mask) { const char* path = path_getdir(mask); MaskHandle data = ALLOCT(struct PlatformMaskData); data->handle = FindFirstFile(mask, &data->entry); data->maskPath = (char*)malloc(strlen(path) + 1); strcpy(data->maskPath, path); data->isFirst = 1; return data; } int platform_mkdir(const char* path) { return CreateDirectory(path, NULL); } int platform_remove(const char* path) { DeleteFile(path); return 1; } int platform_rmdir(const char* path) { WIN32_FIND_DATA data; HANDLE hDir; char* buffer = (char*)malloc(strlen(path) + 6); strcpy(buffer, path); strcat(buffer, "\\*.*"); hDir = FindFirstFile(buffer, &data); if (hDir == INVALID_HANDLE_VALUE) return 0; free(buffer); do { if (strcmp(data.cFileName, ".") == 0) continue; if (strcmp(data.cFileName, "..") == 0) continue; buffer = (char*)malloc(strlen(path) + strlen(data.cFileName) + 2); strcpy(buffer, path); strcat(buffer, "\\"); strcat(buffer, data.cFileName); if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { platform_rmdir(buffer); } else { /* In order to delete not-checked-out version controlled files I need * to clear the read-only flag first */ if (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) SetFileAttributes(buffer, data.dwFileAttributes & !FILE_ATTRIBUTE_READONLY); DeleteFile(buffer); } free(buffer); } while (FindNextFile(hDir, &data)); FindClose(hDir); RemoveDirectory(path); return 1; } #endif premake-3.7.orig/Src/Premake.dsp0000644000000000000000000002306411065435041013463 0ustar # Microsoft Developer Studio Project File - Name="Premake" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=Premake - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "Premake.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "Premake.mak" CFG="Premake - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Premake - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "Premake - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "Premake - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "../bin" # PROP BASE Intermediate_Dir "obj/Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../bin" # PROP Intermediate_Dir "obj/Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W4 /GR /GX /O1 /D "_CRT_SECURE_NO_DEPRECATE" /YX /FD /c # ADD CPP /nologo /MT /W4 /GR /GX /O1 /D "_CRT_SECURE_NO_DEPRECATE" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_CRT_SECURE_NO_DEPRECATE" # ADD RSC /l 0x409 /d "NDEBUG" /d "_CRT_SECURE_NO_DEPRECATE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /entry:"mainCRTStartup" /subsystem:console /machine:I386 /out:"../bin/premake.exe" /libpath:".." # ADD LINK32 /nologo /entry:"mainCRTStartup" /subsystem:console /machine:I386 /out:"../bin/premake.exe" /libpath:".." !ELSEIF "$(CFG)" == "Premake - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "../bin" # PROP BASE Intermediate_Dir "obj/Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../bin" # PROP Intermediate_Dir "obj/Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W4 /Gm /GR /GX /ZI /Od /D "_CRT_SECURE_NO_DEPRECATE" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W4 /Gm /GR /GX /ZI /Od /D "_CRT_SECURE_NO_DEPRECATE" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_CRT_SECURE_NO_DEPRECATE" # ADD RSC /l 0x409 /d "_DEBUG" /d "_CRT_SECURE_NO_DEPRECATE" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /entry:"mainCRTStartup" /subsystem:console /incremental:yes /debug /machine:I386 /out:"../bin/premake.exe" /pdbtype:sept /libpath:".." # ADD LINK32 /nologo /entry:"mainCRTStartup" /subsystem:console /incremental:yes /debug /machine:I386 /out:"../bin/premake.exe" /pdbtype:sept /libpath:".." !ENDIF # Begin Target # Name "Premake - Win32 Release" # Name "Premake - Win32 Debug" # Begin Group "Lua" # PROP Default_Filter "" # Begin Source File SOURCE=Lua/lfunc.h # End Source File # Begin Source File SOURCE=Lua/lapi.h # End Source File # Begin Source File SOURCE=Lua/lcode.h # End Source File # Begin Source File SOURCE=Lua/lopcodes.h # End Source File # Begin Source File SOURCE=Lua/lstate.h # End Source File # Begin Source File SOURCE=Lua/lparser.h # End Source File # Begin Source File SOURCE=Lua/lmem.h # End Source File # Begin Source File SOURCE=Lua/ltable.h # End Source File # Begin Source File SOURCE=Lua/llimits.h # End Source File # Begin Source File SOURCE=Lua/llex.h # End Source File # Begin Source File SOURCE=Lua/lua.h # End Source File # Begin Source File SOURCE=Lua/lgc.h # End Source File # Begin Source File SOURCE=Lua/lobject.h # End Source File # Begin Source File SOURCE=Lua/lvm.h # End Source File # Begin Source File SOURCE=Lua/ltm.h # End Source File # Begin Source File SOURCE=Lua/lundump.h # End Source File # Begin Source File SOURCE=Lua/luaconf.h # End Source File # Begin Source File SOURCE=Lua/lzio.h # End Source File # Begin Source File SOURCE=Lua/ldo.h # End Source File # Begin Source File SOURCE=Lua/lualib.h # End Source File # Begin Source File SOURCE=Lua/lstring.h # End Source File # Begin Source File SOURCE=Lua/ldebug.h # End Source File # Begin Source File SOURCE=Lua/lauxlib.h # End Source File # Begin Source File SOURCE=Lua/lapi.c # End Source File # Begin Source File SOURCE=Lua/lstate.c # End Source File # Begin Source File SOURCE=Lua/lvm.c # End Source File # Begin Source File SOURCE=Lua/liolib.c # End Source File # Begin Source File SOURCE=Lua/ldblib.c # End Source File # Begin Source File SOURCE=Lua/ltablib.c # End Source File # Begin Source File SOURCE=Lua/lstring.c # End Source File # Begin Source File SOURCE=Lua/ldebug.c # End Source File # Begin Source File SOURCE=Lua/lstrlib.c # End Source File # Begin Source File SOURCE=Lua/lfunc.c # End Source File # Begin Source File SOURCE=Lua/lauxlib.c # End Source File # Begin Source File SOURCE=Lua/lgc.c # End Source File # Begin Source File SOURCE=Lua/ldo.c # End Source File # Begin Source File SOURCE=Lua/ltests.c # End Source File # Begin Source File SOURCE=Lua/ltm.c # End Source File # Begin Source File SOURCE=Lua/lundump.c # End Source File # Begin Source File SOURCE=Lua/ldump.c # End Source File # Begin Source File SOURCE=Lua/lmem.c # End Source File # Begin Source File SOURCE=Lua/lbaselib.c # End Source File # Begin Source File SOURCE=Lua/loadlib.c # End Source File # Begin Source File SOURCE=Lua/ltable.c # End Source File # Begin Source File SOURCE=Lua/lparser.c # End Source File # Begin Source File SOURCE=Lua/lzio.c # End Source File # Begin Source File SOURCE=Lua/llex.c # End Source File # Begin Source File SOURCE=Lua/loslib.c # End Source File # Begin Source File SOURCE=Lua/lcode.c # End Source File # Begin Source File SOURCE=Lua/lopcodes.c # End Source File # Begin Source File SOURCE=Lua/lmathlib.c # End Source File # Begin Source File SOURCE=Lua/lobject.c # End Source File # Begin Source File SOURCE=Lua/linit.c # End Source File # End Group # Begin Group "open_watcom" # PROP Default_Filter "" # Begin Source File SOURCE=open_watcom/ow.h # End Source File # Begin Source File SOURCE=open_watcom/ow.c # End Source File # End Group # Begin Source File SOURCE=vs6.h # End Source File # Begin Source File SOURCE=monodev.h # End Source File # Begin Source File SOURCE=platform.h # End Source File # Begin Source File SOURCE=path.h # End Source File # Begin Source File SOURCE=premake.h # End Source File # Begin Source File SOURCE=os.h # End Source File # Begin Source File SOURCE=gnu.h # End Source File # Begin Source File SOURCE=script.h # End Source File # Begin Source File SOURCE=codelite.h # End Source File # Begin Source File SOURCE=sharpdev.h # End Source File # Begin Source File SOURCE=util.h # End Source File # Begin Source File SOURCE=arg.h # End Source File # Begin Source File SOURCE=cb.h # End Source File # Begin Source File SOURCE=vs2008.h # End Source File # Begin Source File SOURCE=vs2002.h # End Source File # Begin Source File SOURCE=io.h # End Source File # Begin Source File SOURCE=vs2005.h # End Source File # Begin Source File SOURCE=project.h # End Source File # Begin Source File SOURCE=vs.h # End Source File # Begin Source File SOURCE=platform_windows.c # End Source File # Begin Source File SOURCE=os.c # End Source File # Begin Source File SOURCE=gnu.c # End Source File # Begin Source File SOURCE=premake.c # End Source File # Begin Source File SOURCE=gnu_cpp.c # End Source File # Begin Source File SOURCE=gnu_cs.c # End Source File # Begin Source File SOURCE=util.c # End Source File # Begin Source File SOURCE=vs2008.c # End Source File # Begin Source File SOURCE=sharpdev_cs.c # End Source File # Begin Source File SOURCE=platform_posix.c # End Source File # Begin Source File SOURCE=clean.c # End Source File # Begin Source File SOURCE=sharpdev.c # End Source File # Begin Source File SOURCE=vs2002.c # End Source File # Begin Source File SOURCE=vs2002_cs.c # End Source File # Begin Source File SOURCE=path.c # End Source File # Begin Source File SOURCE=vs2008_cs.c # End Source File # Begin Source File SOURCE=vs6.c # End Source File # Begin Source File SOURCE=io.c # End Source File # Begin Source File SOURCE=arg.c # End Source File # Begin Source File SOURCE=codelite_cpp.c # End Source File # Begin Source File SOURCE=vs6_cpp.c # End Source File # Begin Source File SOURCE=vs2005_cs.c # End Source File # Begin Source File SOURCE=cb.c # End Source File # Begin Source File SOURCE=monodev.c # End Source File # Begin Source File SOURCE=cb_cpp.c # End Source File # Begin Source File SOURCE=project.c # End Source File # Begin Source File SOURCE=vs.c # End Source File # Begin Source File SOURCE=monodev_cs.c # End Source File # Begin Source File SOURCE=gnu_helpers.c # End Source File # Begin Source File SOURCE=script.c # End Source File # Begin Source File SOURCE=vs2005.c # End Source File # Begin Source File SOURCE=codelite.c # End Source File # End Target # End Project premake-3.7.orig/Src/premake.lua0000644000000000000000000000135010703501577013516 0ustar package.name = "Premake" package.language = "c" package.kind = "exe" package.target = "premake" -- Build Flags package.buildflags = { "no-64bit-checks", "static-runtime", "extra-warnings" } package.config["Release"].buildflags = { "no-symbols", "optimize-size", "no-frame-pointers" } -- Defines package.defines = { "_CRT_SECURE_NO_DEPRECATE", -- to avoid VS2005 stdlib warnings } if (target == "gnu") then -- to get Lua popen support under OS X table.insert(package.defines, "USE_POPEN=1") end -- Libraries if (OS == "linux") then package.links = { "m" } end -- Files package.files = { matchrecursive("*.h", "*.c") } premake-3.7.orig/Src/script.c0000644000000000000000000010501711065433457013047 0ustar /********************************************************************** * Premake - script.c * Interface to the Lua scripting engine. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "script.h" #include "arg.h" #include "os.h" #include "Lua/lua.h" #include "Lua/lualib.h" #include "Lua/lauxlib.h" #include "Lua/ldebug.h" static lua_State* L; static char projectDirectory[8192]; static const char* currentScript = NULL; static int in_command = 0; static int tbl_get(int from, const char* name); static int tbl_geti(int from, int i); static int tbl_getlen(int tbl); static int tbl_getlen_deep(int tbl); static const char* tbl_getstring(int from, const char* name); static const char* tbl_getstringi(int from, int i); static int lf_addoption(lua_State* L); static int lf_alert(lua_State* L); static int lf_appendfile(lua_State* L); static int lf_chdir(lua_State* L); static int lf_copyfile(lua_State* L); static int lf_docommand(lua_State* L); static int lf_dopackage(lua_State* L); static int lf_direxists(lua_State* L); static int lf_fileexists(lua_State* L); static int lf_findlib(lua_State* L); static int lf_getbasename(lua_State* L); static int lf_getconfigs(lua_State* L); static int lf_getcwd(lua_State* L); static int lf_getdir(lua_State* L); static int lf_getextension(lua_State* L); static int lf_getglobal(lua_State* L); static int lf_getname(lua_State* L); static int lf_matchdirs(lua_State* L); static int lf_matchfiles(lua_State* L); static int lf_matchrecursive(lua_State* L); static int lf_mkdir(lua_State* L); static int lf_newfileconfig(lua_State* L); static int lf_newpackage(lua_State* L); static int lf_panic(lua_State* L); static int lf_rmdir(lua_State* L); static int lf_setconfigs(lua_State* L); static void buildOptionsTable(); static void buildNewProject(); /********************************************************************** * Initialize the Lua environment **********************************************************************/ int script_init() { /* Create a script environment and install the standard libraries */ L = lua_open(); luaL_openlibs(L); lua_atpanic(L, lf_panic); /* Register my extensions to the Lua environment */ lua_register(L, "addoption", lf_addoption); lua_register(L, "_ALERT", lf_alert); lua_register(L, "copyfile", lf_copyfile); lua_register(L, "docommand", lf_docommand); lua_register(L, "dopackage", lf_dopackage); lua_register(L, "direxists", lf_direxists); lua_register(L, "fileexists", lf_fileexists); lua_register(L, "findlib", lf_findlib); lua_register(L, "matchdirs", lf_matchdirs); lua_register(L, "matchfiles", lf_matchfiles); lua_register(L, "matchrecursive", lf_matchrecursive); lua_register(L, "newpackage", lf_newpackage); /* Add some extensions to the built-in "os" table */ lua_getglobal(L, "os"); lua_pushstring(L, "appendfile"); lua_pushcfunction(L, lf_appendfile); lua_settable(L, -3); lua_pushstring(L, "chdir"); lua_pushcfunction(L, lf_chdir); lua_settable(L, -3); lua_pushstring(L, "copyfile"); lua_pushcfunction(L, lf_copyfile); lua_settable(L, -3); lua_pushstring(L, "direxists"); lua_pushcfunction(L, lf_direxists); lua_settable(L, -3); lua_pushstring(L, "fileexists"); lua_pushcfunction(L, lf_fileexists); lua_settable(L, -3); lua_pushstring(L, "findlib"); lua_pushcfunction(L, lf_findlib); lua_settable(L, -3); lua_pushstring(L, "getcwd"); lua_pushcfunction(L, lf_getcwd); lua_settable(L, -3); lua_pushstring(L, "mkdir"); lua_pushcfunction(L, lf_mkdir); lua_settable(L, -3); lua_pushstring(L, "rmdir"); lua_pushcfunction(L, lf_rmdir); lua_settable(L, -3); lua_pop(L, 1); /* Add path handling functions */ lua_newtable(L); lua_pushstring(L, "getbasename"); lua_pushcfunction(L, lf_getbasename); lua_settable(L, -3); lua_pushstring(L, "getdir"); lua_pushcfunction(L, lf_getdir); lua_settable(L, -3); lua_pushstring(L, "getextension"); lua_pushcfunction(L, lf_getextension); lua_settable(L, -3); lua_pushstring(L, "getname"); lua_pushcfunction(L, lf_getname); lua_settable(L, -3); lua_setglobal(L, "path"); /* Register some commonly used Lua4 functions */ lua_register(L, "rmdir", lf_rmdir); lua_getglobal(L, "table"); lua_pushstring(L, "insert"); lua_gettable(L, -2); lua_setglobal(L, "tinsert"); lua_pop(L, 1); lua_getglobal(L, "os"); lua_pushstring(L, "remove"); lua_gettable(L, -2); lua_setglobal(L, "remove"); lua_pop(L, 1); /* Set the global OS identifiers */ lua_pushstring(L, os_get()); lua_setglobal(L, "OS"); lua_pushnumber(L, 1); lua_setglobal(L, os_get()); /* Create a list of option descriptions for addoption() */ lua_getregistry(L); lua_pushstring(L, "options"); lua_newtable(L); lua_settable(L, -3); lua_pop(L, 1); /* Create and populate a global "options" table */ buildOptionsTable(); /* Create an empty list of packages */ lua_newtable(L); lua_setglobal(L, "_PACKAGES"); /* Create a default project object */ buildNewProject(); /* Set hook to intercept creation of globals, used to create packages */ lua_pushvalue(L, LUA_GLOBALSINDEX); lua_newtable(L); lua_pushstring(L, "__index"); lua_pushcfunction(L, lf_getglobal); lua_settable(L, -3); lua_setmetatable(L, -2); lua_pop(L, 1); /* Clear the current global so included script can create a new one */ lua_pushnil(L); lua_setglobal(L, "package"); return 1; } /********************************************************************** * Execute the specified premake script. Contains some logic for * locating the script file if an exact match isn't found **********************************************************************/ int script_run(const char* filename) { char scriptname[8192]; int result; /* remember where I started; I'll need this for matchfiles() later */ strcpy(projectDirectory, io_getcwd()); strcpy(scriptname, filename); if (!io_fileexists(scriptname)) { strcat(scriptname, ".lua"); } if (!io_fileexists(scriptname)) { return 0; } currentScript = scriptname; if (!script_init()) return -1; result = luaL_dofile(L, scriptname); if (result) { printf("** %s: %s\n", scriptname, lua_tostring(L,-1)); } return (result == 0) ? 1 : -1; } /********************************************************************** * After the script has run, these functions pull the project data * out into local objects **********************************************************************/ static int export_list(int parent, int object, const char* name, const char*** list) { int i; int parArr = tbl_get(parent, name); int parLen = tbl_getlen_deep(parArr); int objArr = tbl_get(object, name); int objLen = tbl_getlen_deep(objArr); *list = (const char**)prj_newlist(parLen + objLen); for (i = 0; i < parLen; ++i) (*list)[i] = tbl_getstringi(parArr, i + 1); for (i = 0; i < objLen; ++i) (*list)[parLen + i] = tbl_getstringi(objArr, i + 1); return (parLen + objLen); } static int export_append_list(int parent, int object, const char* name, const char*** list) { int i; int oldLen = prj_getlistsize((void**)(*list)); const char** toAppendList; int toAppendLen = export_list(parent, object, name, &toAppendList); const char** newlist = (const char**)prj_newlist(oldLen + toAppendLen); for (i = 0; i < oldLen; ++i) newlist[i] = (*list)[i]; for (i = 0; i < toAppendLen; ++i) newlist[oldLen + i] = toAppendList[i]; free((void*)*list); free((void*)toAppendList); *list = newlist; return (oldLen + toAppendLen); } static const char* export_value(int parent, int object, const char* name) { const char* value; value = tbl_getstring(object, name); if (value == NULL) value = tbl_getstring(parent, name); return value; } static const char** export_files(int tbl, int obj) { const char** files; const char** excludes; const char** result; int numFiles, numExcludes; int i, j, k; export_list(tbl, obj, "files", &files); export_list(tbl, obj, "excludes", &excludes); numFiles = prj_getlistsize((void**)files); numExcludes = prj_getlistsize((void**)excludes); result = (const char**)prj_newlist(numFiles); k = 0; for (i = 0; i < numFiles; ++i) { int exclude = 0; for (j = 0; j < numExcludes; ++j) { if (matches(files[i], excludes[j])) exclude = 1; } if (!exclude) result[k++] = files[i]; } free((void*)files); free((void*)excludes); result[k] = NULL; return result; } static int export_fileconfig(PkgConfig* config, int arr) { int obj, count, i; count = prj_getlistsize((void**)config->files); config->fileconfigs = (FileConfig**)prj_newlist(count); for (i = 0; i < count; ++i) { FileConfig* fconfig = ALLOCT(FileConfig); config->fileconfigs[i] = fconfig; obj = tbl_get(arr, config->files[i]); if (obj > 0) { fconfig->buildaction = tbl_getstring(obj, "buildaction"); } else { fconfig->buildaction = NULL; } } return 1; } static int export_pkgconfig(Package* package, int tbl) { int arr, obj; int len, i; arr = tbl_get(tbl, "config"); len = tbl_getlen(arr); package->configs = (PkgConfig**)prj_newlist(len); for (i = 0; i < len; ++i) { PkgConfig* config = ALLOCT(PkgConfig); package->configs[i] = config; config->prjConfig = project->configs[i]; obj = tbl_geti(arr, i + 1); /* Pull out the non-list values */ config->bindir = export_value(tbl, obj, "bindir"); config->libdir = export_value(tbl, obj, "libdir"); config->extension = export_value(tbl, obj, "targetextension"); config->prefix = export_value(tbl, obj, "targetprefix"); config->target = export_value(tbl, obj, "target"); config->kind = export_value(tbl, obj, "kind"); config->pchHeader = export_value(tbl, obj, "pchheader"); config->pchSource = export_value(tbl, obj, "pchsource"); config->implibname = export_value(tbl, obj, "importlibname"); /* objdir automatically uses config name as subdir, should not be * specified per configuration */ config->objdir = tbl_getstring(obj, "objdir"); /* Assign a default target, if none specified */ if (config->target == NULL) config->target = package->name; /* Pull out the value lists */ export_list(tbl, obj, "buildflags", &config->flags); export_list(tbl, obj, "buildoptions", &config->buildopts); export_list(tbl, obj, "defines", &config->defines); export_list(tbl, obj, "includepaths", &config->incpaths); export_list(tbl, obj, "libpaths", &config->libpaths); export_list(tbl, obj, "linkoptions", &config->linkopts); export_list(tbl, obj, "resoptions", &config->resopts); export_list(tbl, obj, "links", &config->links); export_list(tbl, obj, "prebuildcommands", &config->prebuildcmds); export_list(tbl, obj, "prelinkcommands", &config->prelinkcmds); export_list(tbl, obj, "postbuildcommands", &config->postbuildcmds); /* Resource lists are really two combined */ export_list(tbl, obj, "defines", &config->resdefines); export_append_list(tbl, obj, "resdefines", &config->resdefines); export_list(tbl, obj, "includepaths", &config->respaths); export_append_list(tbl, obj, "respaths", &config->respaths); /* Build the file list */ config->files = export_files(tbl, obj); /* Build a list of file configurations */ export_fileconfig(config, arr); } return 1; } int script_export() { int tbl, arr, obj; int len, i; prj_open(); /* Copy out the list of available options */ tbl = tbl_get(LUA_REGISTRYINDEX, "options"); len = tbl_getlen(tbl); project->options = (Option**)prj_newlist(len); for (i = 0; i < len; ++i) { Option* option = ALLOCT(Option); project->options[i] = option; obj = tbl_geti(tbl, i + 1); option->flag = tbl_getstringi(obj, 1); option->desc = tbl_getstringi(obj, 2); } /* Copy out the project settings */ tbl = tbl_get(LUA_GLOBALSINDEX, "project"); project->name = tbl_getstring(tbl, "name"); project->path = tbl_getstring(tbl, "path"); project->script = tbl_getstring(tbl, "script"); /* Copy out the project configurations */ arr = tbl_get(tbl, "config"); len = tbl_getlen(arr); project->configs = (PrjConfig**)prj_newlist(len); for (i = 0; i < len; ++i) { PrjConfig* config = ALLOCT(PrjConfig); project->configs[i] = config; obj = tbl_geti(arr, i + 1); config->name = tbl_getstring(obj, "name"); config->bindir = export_value(tbl, obj, "bindir"); config->libdir = export_value(tbl, obj, "libdir"); } /* Copy out the packages */ tbl = tbl_get(LUA_GLOBALSINDEX, "_PACKAGES"); len = tbl_getlen(tbl); project->packages = (Package**)prj_newlist(len); for (i = 0; i < len; ++i) { Package* package = ALLOCT(Package); package->index = i; project->packages[i] = package; obj = tbl_geti(tbl, i + 1); package->name = tbl_getstring(obj, "name"); package->path = tbl_getstring(obj, "path"); package->script = tbl_getstring(obj, "script"); package->lang = tbl_getstring(obj, "language"); package->objdir = tbl_getstring(obj, "objdir"); package->url = tbl_getstring(obj, "url"); package->guid = tbl_getstring(obj, "guid"); package->data = NULL; export_pkgconfig(package, obj); } return 1; } /********************************************************************** * Callback for commands pulled from the program arguments **********************************************************************/ int script_docommand(const char* cmd) { char buffer[512]; const char* arg; /* Trim off the leading '--' */ if (strncmp(cmd, "--", 2) == 0) cmd += 2; /* Look for a handler */ strcpy(buffer, "do"); strcat(buffer, cmd); lua_getglobal(L, buffer); if (!lua_isfunction(L, -1)) { /* Fall back to the default handler */ lua_getglobal(L, "docommand"); if (!lua_isfunction(L, -1)) { lua_pop(L, 1); return 0; } } /* Push the command and arguments onto the stack */ lua_pushstring(L, cmd); arg = arg_getflagarg(); if (arg != NULL) lua_pushstring(L, arg); else lua_pushnil(L); in_command = 1; lua_call(L, 2, 0); in_command = 0; return 1; } int script_close() { lua_close(L); return 1; } /********************************************************************** * These function assist with setup of the script environment **********************************************************************/ static void buildOptionsTable() { const char* flag; const char* arg; lua_newtable(L); arg_reset(); flag = arg_getflag(); while (flag != NULL) { if (strncmp(flag, "--", 2) == 0) flag += 2; lua_pushstring(L, flag); /* If the flag has an argument, push that too */ arg = arg_getflagarg(); if (arg != NULL) lua_pushstring(L, arg); else lua_pushboolean(L, 1); lua_settable(L, -3); /* special handling - set a "target" global variable */ if (matches(flag, "target")) { // Use the canonical target name if (matches(arg, "vs7")) arg = "vs2002"; else if (matches(arg, "md")) arg = "monodev"; else if (matches(arg, "sd")) arg = "sharpdev"; lua_pushstring(L, arg); lua_setglobal(L, "target"); } flag = arg_getflag(); } lua_setglobal(L, "options"); } static void buildNewProject() { lua_newtable(L); lua_pushstring(L, "name"); lua_pushstring(L, "MyProject"); lua_settable(L, -3); lua_pushstring(L, "path"); lua_pushstring(L, path_getdir(currentScript)); lua_settable(L, -3); lua_pushstring(L, "bindir"); lua_pushstring(L, ""); lua_settable(L, -3); lua_pushstring(L, "libdir"); lua_pushstring(L, ""); lua_settable(L, -3); /* Hook "index" metamethod so I can tell when the config list changes */ lua_newtable(L); lua_pushstring(L, "__newindex"); lua_pushcfunction(L, lf_setconfigs); lua_settable(L, -3); lua_pushstring(L, "__index"); lua_pushcfunction(L, lf_getconfigs); lua_settable(L, -3); lua_setmetatable(L, -2); /* Set default values */ lua_pushstring(L, "script"); lua_pushstring(L, path_getname(currentScript)); lua_settable(L, -3); lua_pushstring(L, "configs"); lua_newtable(L); lua_pushstring(L, "Debug"); lua_rawseti(L, -2, 1); lua_pushstring(L, "Release"); lua_rawseti(L, -2, 2); lua_settable(L, -3); lua_setglobal(L, "project"); } static void buildNewConfig(const char* name) { /* Store the config name */ if (name != NULL) { lua_pushstring(L, "name"); lua_pushstring(L, name); lua_settable(L, -3); } /* Set defaults */ lua_pushstring(L, "buildflags"); lua_newtable(L); if (matches(name, "Release")) { lua_pushstring(L, "no-symbols"); lua_rawseti(L, -2, 1); lua_pushstring(L, "optimize"); lua_rawseti(L, -2, 2); } lua_settable(L, -3); lua_pushstring(L, "buildoptions"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "prebuildcommands"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "prelinkcommands"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "postbuildcommands"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "defines"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "files"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "excludes"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "includepaths"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "libpaths"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "linkoptions"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "links"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "resdefines"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "resoptions"); lua_newtable(L); lua_settable(L, -3); lua_pushstring(L, "respaths"); lua_newtable(L); lua_settable(L, -3); } /********************************************************************** * These function help get data out of the Lua tables **********************************************************************/ static int tbl_matchkey(const char* name, int index) { int result, i, n; if (lua_isnumber(L, index)) return 0; if (!lua_istable(L, index)) { const char* key = lua_tostring(L, index); return matches(key, name); } /* If key is a table, scan for value */ n = luaL_getn(L, index); for (i = 1; i <= n; ++i) { lua_rawgeti(L, index, i); result = tbl_matchkey(name, -1); lua_pop(L, 1); if (result) return 1; } return 0; } static int tbl_get(int from, const char* name) { int ref; /* Retrieve the `from` object */ if (from == LUA_REGISTRYINDEX || from == LUA_GLOBALSINDEX) { lua_pushvalue(L, from); } else { lua_getref(L, from); } /* Do a deep key search for the requested object */ lua_pushnil(L); while (lua_next(L, -2)) { if (tbl_matchkey(name, -2)) { /* Validate result */ if (!lua_istable(L, -1)) { char msg[512]; sprintf(msg, "'%s' should be a table.\nPlace value between brackets like: { values }", name); lua_pushstring(L, msg); lua_error(L); } /* Reference and return */ ref = lua_ref(L, -1); lua_pop(L, 2); return ref; } lua_pop(L, 1); } /* Not found */ lua_pop(L, 1); return 0; /* lua_pushstring(L, name); lua_gettable(L, -2); if (lua_isnil(L, -1)) return 0; if (!lua_istable(L, -1)) { char msg[512]; sprintf(msg, "'%s' should be a table.\nPlace value between brackets like: { values }", name); lua_pushstring(L, msg); lua_error(L); } ref = lua_ref(L, -1); lua_pop(L, 1); return ref; */ } static int tbl_geti(int from, int i) { int ref; lua_getref(L, from); lua_rawgeti(L, -1, i); ref = lua_ref(L, -1); lua_pop(L, 1); return ref; } static int tbl_getlen(int tbl) { int size; lua_getref(L, tbl); size = luaL_getn(L, -1); lua_pop(L, 1); return size; } static int tbl_getlen_deep(int tbl) { int size, i, n; lua_getref(L, tbl); size = 0; n = luaL_getn(L, -1); for (i = 1; i <= n; ++i) { lua_rawgeti(L, -1, i); if (lua_istable(L, -1)) { size += tbl_getlen_deep(lua_ref(L, -1)); } else { lua_pop(L, 1); size++; } } lua_pop(L, 1); return size; } static const char* tbl_getstring(int from, const char* name) { const char* str; lua_getref(L, from); lua_pushstring(L, name); lua_gettable(L, -2); str = lua_tostring(L, -1); lua_pop(L, 2); return str; } static const char* tbl_getstringi_worker(int arr, int* index) { int i, n; const char* result = NULL; lua_getref(L, arr); n = luaL_getn(L, -1); for (i = 1; i <= n && *index > 0; ++i) { lua_rawgeti(L, -1, i); if (lua_istable(L, -1)) { int ref = lua_ref(L, -1); result = tbl_getstringi_worker(ref, index); } else if (*index == 1) { result = lua_tostring(L, -1); lua_pop(L, 1); (*index)--; } else { lua_pop(L, 1); (*index)--; } } lua_pop(L, 1); return result; } static const char* tbl_getstringi(int from, int i) { int index = i; const char* result = tbl_getstringi_worker(from, &index); return result; } /********************************************************************** * These are new functions for the Lua environment **********************************************************************/ static int lf_addoption(lua_State* L) { const char* name = luaL_checkstring(L, 1); const char* desc = luaL_checkstring(L, 2); /* Retrieve the options list from the registry */ lua_getregistry(L); lua_pushstring(L, "options"); lua_gettable(L, -2); /* Create a new table for this new option */ lua_newtable(L); lua_pushstring(L, name); lua_rawseti(L, -2, 1); lua_pushstring(L, desc); lua_rawseti(L, -2, 2); /* Add the option to the end of the registry list */ lua_rawseti(L, -2, luaL_getn(L, -2) + 1); lua_pop(L, 2); return 0; } static int lf_alert(lua_State* L) { /* Get the error message */ const char* msg = lua_tostring(L, -1); /* Swap out the file name so I can see the whole path */ msg = strchr(msg, ':'); printf("%s%s\n", currentScript, msg); exit(1); } static int lf_appendfile(lua_State* L) { FILE* fSrc; FILE* fDst; int count; const char* src = luaL_checkstring(L, 1); const char* dst = luaL_checkstring(L, 2); fSrc = fopen(src, "rb"); if (fSrc == NULL) luaL_error(L, "Unable to open file for reading '%s'\n", src); fDst = fopen(dst, "ab"); if (fDst == NULL) luaL_error(L, "Unable to open file for appending '%s'\n", dst); count = fread(g_buffer, 1, 8192, fSrc); while (count > 0) { fwrite(g_buffer, 1, count, fDst); count = fread(g_buffer, 1, 8192, fSrc); } fclose(fSrc); fclose(fDst); return 0; } static int lf_docommand(lua_State* L) { const char* cmd = luaL_checkstring(L, 1); const char* arg = (!lua_isnil(L,2)) ? luaL_checkstring(L, 2) : NULL; if (!onCommand(cmd, arg)) exit(1); return 0; } static int lf_chdir(lua_State* L) { const char* path = luaL_checkstring(L, 1); if (io_chdir(path)) lua_pushnumber(L, 1); else lua_pushnil(L); return 1; } static int lf_copyfile(lua_State* L) { const char* src = luaL_checkstring(L, 1); const char* dest = luaL_checkstring(L, 2); if (io_copyfile(src, dest)) lua_pushnumber(L, 1); else lua_pushnil(L); return 1; } static int lf_dopackage(lua_State* L) { const char* oldScript; char oldcwd[8192]; char filename[8192]; int result; /* Clear the current global so included script can create a new one */ lua_pushnil(L); lua_setglobal(L, "package"); /* Remember the current state of things so I can restore after script runs */ oldScript = currentScript; strcpy(oldcwd, io_getcwd()); /* Try to locate the script file */ strcpy(filename, lua_tostring(L, 1)); if (!io_fileexists(filename)) { strcpy(filename, path_join("", lua_tostring(L, 1), "lua")); } if (!io_fileexists(filename)) { strcpy(filename, path_join(lua_tostring(L, 1), "premake.lua", "")); } if (!io_fileexists(filename)) { printf("** No such package: %s\n", filename); lua_error(L); } currentScript = filename; io_chdir(path_getdir(filename)); result = luaL_dofile(L, path_getname(filename)); if (result) { printf("** %s: %s\n", filename, lua_tostring(L,-1)); } /* Restore the previous state */ currentScript = oldScript; io_chdir(oldcwd); return 0; } static int lf_direxists(lua_State* L) { const char* path = luaL_checkstring(L, 1); int result = io_direxists(path); lua_pushboolean(L, result); return 1; } static int lf_fileexists(lua_State* L) { const char* path = luaL_checkstring(L, 1); int result = io_fileexists(path); lua_pushboolean(L, result); return 1; } static int lf_findlib(lua_State* L) { const char* libname = luaL_checkstring(L, 1); const char* result = io_findlib(libname); if (result) lua_pushstring(L, result); else lua_pushnil(L); return 1; } static int lf_getbasename(lua_State* L) { const char* path = luaL_checkstring(L, 1); const char* result = path_getbasename(path); lua_pushstring(L, result); return 1; } static int lf_getcwd(lua_State* L) { const char* cwd = io_getcwd(); lua_pushstring(L, cwd); return 1; } static int lf_getdir(lua_State* L) { const char* path = luaL_checkstring(L, 1); const char* result = path_getdir(path); lua_pushstring(L, result); return 1; } static int lf_getextension(lua_State* L) { const char* path = luaL_checkstring(L, 1); const char* result = path_getextension(path); lua_pushstring(L, result); return 1; } static int lf_getglobal(lua_State* L) { const char* name = luaL_checkstring(L, 2); if (matches(name, "package")) { lf_newpackage(L); lua_pushvalue(L, -1); lua_setglobal(L, "package"); return 1; } return 0; } static int lf_getname(lua_State* L) { const char* path = luaL_checkstring(L, 1); const char* result = path_getname(path); lua_pushstring(L, result); return 1; } // static int lf_isdir(lua_State* L) // { // const char* dir = luaL_checkstring(L, 1); // io_mkdir(dir); // return 0; // } static int debugging = 0; static void doFileScan(lua_State* L, char* path, int recursive, int findFiles) { MaskHandle handle = io_mask_open(path); if (debugging) { printf("Debug: file mask is %s (%s)\n", path, handle != NULL ? "ok" : "NOT FOUND"); } while (io_mask_getnext(handle)) { const char* name = io_mask_getname(handle); int isfile = io_mask_isfile(handle); if (debugging) { printf("Debug: matched %s (%s)\n", name, isfile ? "file" : "directory"); } if ((findFiles && isfile) || (!findFiles && !isfile)) { if (debugging) { printf("Debug: adding %s\n", name); } lua_pushstring(L, name); lua_rawseti(L, -2, luaL_getn(L, -2) + 1); } } io_mask_close(handle); /* If recursive, scan subdirectories */ if (recursive) { char mask[128]; int len; /* Split the mask from the path */ strcpy(mask, path_getname(path)); strcpy(path, path_getdir(path)); /* Scan for subdirs */ len = strlen(path); handle = io_mask_open(path_combine(path, "*")); while (io_mask_getnext(handle)) { if (!io_mask_isfile(handle)) { const char* name = io_mask_getname(handle); if (!matches(name, ".") && !matches(name, "..") && !endsWith(name, "/.") && !endsWith(name, "/..")) { strcpy(path, path_combine(name, mask)); doFileScan(L, path, recursive, findFiles); path[len] = '\0'; } } } io_mask_close(handle); } } static int doFileMatching(lua_State* L, int recursive, int findFiles) { char path[8192]; char prjPath[4096]; const char* pkgPath; const char* filename; int pathlen, i, n; /* Get the current package path */ pkgPath = ""; if (!in_command) { lua_getglobal(L, "package"); lua_pushstring(L, "path"); lua_gettable(L, -2); pkgPath = lua_tostring(L, -1); if (pkgPath == NULL) pkgPath = ""; lua_pop(L, 2); /* If path is same as current, ignore it. Otherwise, adjust it to * account for the fact that the package script directory is now * current, and not the main project script directory. */ if (path_compare(path_getdir(currentScript), pkgPath)) { prjPath[0] = '\0'; pkgPath = ""; } else { strcpy(prjPath, path_build(".", projectDirectory)); } } /* Create a table to hold the results */ lua_newtable(L); /* Scan each mask */ for (i = 1; i < lua_gettop(L); ++i) { const char* maskWithPath; const char* mask = luaL_checkstring(L, i); strcpy(path, path_combine(prjPath, pkgPath)); maskWithPath = path_combine(path, mask); strcpy(path, maskWithPath); doFileScan(L, path, recursive, findFiles); } /* Remove the base package path from all files */ strcpy(path, path_combine(prjPath, pkgPath)); pathlen = strlen(path); if (pathlen > 0) pathlen++; n = luaL_getn(L, -1); for (i = 1; i <= n; ++i) { lua_rawgeti(L, -1, i); filename = lua_tostring(L, -1); lua_pushstring(L, filename + pathlen); lua_rawseti(L, -3, i); lua_pop(L, 1); } debugging = 0; return 1; } static int lf_matchdirs(lua_State* L) { return doFileMatching(L, 1, 0); } static int lf_matchfiles(lua_State* L) { return doFileMatching(L, 0, 1); } static int lf_matchrecursive(lua_State* L) { return doFileMatching(L, 1, 1); } static int lf_newfileconfig(lua_State* L) { lua_newtable(L); lua_pushvalue(L, 1); lua_pushvalue(L, 2); lua_pushvalue(L, 3); lua_rawset(L, -3); lua_pop(L, 1); return 1; } static int lf_newpackage(lua_State* L) { int count, i; lua_newtable(L); /* Add this package to the master list */ lua_getglobal(L, "_PACKAGES"); count = luaL_getn(L, -1); lua_pushvalue(L, -2); lua_rawseti(L, -2, count + 1); lua_pop(L, 1); /* Set default values */ if (count == 0) { lua_getglobal(L, "project"); lua_pushstring(L, "name"); lua_pushstring(L, "name"); lua_gettable(L, -3); lua_settable(L, -4); lua_pop(L, 1); } else { lua_pushstring(L, "name"); lua_pushstring(L, "Package"); lua_pushnumber(L, count); lua_concat(L, 2); lua_settable(L, -3); } lua_pushstring(L, "script"); lua_pushstring(L, currentScript); lua_settable(L, -3); lua_pushstring(L, "path"); lua_pushstring(L, path_getdir(currentScript)); lua_settable(L, -3); lua_pushstring(L, "language"); lua_pushstring(L, "c++"); lua_settable(L, -3); lua_pushstring(L, "kind"); lua_pushstring(L, "exe"); lua_settable(L, -3); lua_pushstring(L, "objdir"); lua_pushstring(L, "obj"); lua_settable(L, -3); buildNewConfig(NULL); /* Build list of configurations matching what is in the project, and * which can be indexed by name or number */ lua_pushstring(L, "config"); lua_newtable(L); lua_getglobal(L, "project"); lua_pushstring(L, "configs"); lua_gettable(L, -2); count = luaL_getn(L, -1); for (i = 1; i <= count; ++i) { lua_rawgeti(L, -1, i); lua_newtable(L); buildNewConfig(lua_tostring(L, -2)); lua_pushvalue(L, -1); lua_rawseti(L, -6, i); lua_settable(L, -5); } lua_pop(L, 2); /* Hook the index metamethod so I can dynamically add file configs */ lua_newtable(L); lua_pushstring(L, "__index"); lua_pushcfunction(L, lf_newfileconfig); lua_settable(L, -3); lua_setmetatable(L, -2); /* Set the 'package' global to point to it */ lua_pushvalue(L, -1); lua_setglobal(L, "package"); lua_settable(L, -3); return 1; } static int lf_panic(lua_State* L) { lua_Debug ar; int stack; int top = lua_gettop(L); const char* msg = lua_tostring(L, top); printf("\n** Error: %s\n", msg); for (stack = 0; lua_getstack(L, stack, &ar); ++stack) { lua_getinfo(L, "S1", &ar); if (ar.source && ar.currentline > 0) { printf("<%.70s: line %d>\n\n", ar.short_src, ar.currentline); break; } } return 0; } static int lf_mkdir(lua_State* L) { const char* dir = luaL_checkstring(L, 1); io_mkdir(dir); return 0; } static int lf_rmdir(lua_State* L) { const char* dir = luaL_checkstring(L, 1); io_rmdir(".", dir); return 0; } static int lf_getconfigs(lua_State* L) { const char* name = luaL_checkstring(L, 2); if (matches(name, "configs")) lua_pushstring(L, "__configs"); lua_rawget(L, 1); return 1; } static int lf_setconfigs(lua_State* L) { int i, n; const char* name = luaL_checkstring(L, 2); if (matches(name, "configs")) { if (!lua_istable(L, 3)) { lua_pushstring(L, "Project configs must be a table of config names"); lua_error(L); } lua_pushstring(L, "config"); lua_newtable(L); n = luaL_getn(L, 3); for (i = 1; i <= n; ++i) { /* Set up the new config table to be added by name */ lua_rawgeti(L, 3, i); /* Create the config and set the defaults */ lua_newtable(L); lua_pushstring(L, "name"); lua_pushvalue(L, -3); lua_rawset(L, -3); /* Add the config by index */ lua_pushvalue(L, -1); lua_rawseti(L, -4, i); /* Add the config by name */ lua_rawset(L, -3); } /* Add the new config table to the project */ lua_rawset(L, 1); /* Add the initially requested item to the list, but under a different * name so __newindex will be called if it is set again */ lua_pushstring(L, "__configs"); lua_pushvalue(L, 3); lua_rawset(L, 1); } else { /* Not setting "configs", just write to the table */ lua_rawset(L, 1); } return 0; } premake-3.7.orig/Src/path.c0000644000000000000000000001655211003163674012475 0ustar /********************************************************************** * Premake - path.c * Path handling routines. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "os.h" #include "platform.h" static char working[8192]; static char forpart[8192]; /************************************************************************ * Return the full path from a relative path. Contains some extra * logic to handle the case where the directory doesn't exist ***********************************************************************/ const char* path_absolute(const char* path) { char relative[8192]; char* ptr; strcpy(relative, path ? path : "."); if (strlen(relative) == 0) strcpy(relative, "."); path_translateInPlace(relative, "posix"); /* If the directory is already absolute I don't have to do anything */ if (platform_isAbsolutePath(relative)) return path; /* Figure out where I am currently */ platform_getcwd(working, 8192); path_translateInPlace(working, "posix"); /* Split the target path and add it in piece by piece */ ptr = relative; while (ptr != NULL) { char* end = strchr(ptr, '/'); if (end != NULL) *end = '\0'; if (matches(ptr, "..")) { char* sep = strrchr(working, '/'); if (sep != NULL) *sep = '\0'; } else if (!matches(ptr, ".")) { strcat(working, "/"); strcat(working, ptr); } ptr = (end != NULL) ? end + 1 : NULL; } return working; } /************************************************************************ * Build a path to get from `from` to `to` ***********************************************************************/ #include const char* path_build(const char* from, const char* to) { char fromFull[8192]; char toFull[8192]; int start, i; /* Retrieve the full path to both locations */ strcpy(fromFull, path_translate(path_absolute(from), "unix")); strcpy(toFull, path_translate(path_absolute(to), "unix")); /* Append a separator to both */ strcat(fromFull, "/"); strcat(toFull, "/"); /* Trim off the common directories from the front */ start = 0; i = 0; while (fromFull[i] != '\0' && toFull[i] != '\0' && fromFull[i] == toFull[i]) { if (fromFull[i] == '/') start = i + 1; i++; } if (fromFull[i] == '\0' && toFull[i] == '\0') return "."; /* Build the connecting path */ if (strlen(fromFull) - start > 0) { strcpy(working, "../"); for (i = start; fromFull[i] != '\0'; ++i) { if (fromFull[i] == '/' && fromFull[i + 1] != '\0') strcat(working, "../"); } } else { strcpy(working, ""); } if (strlen(toFull) - start > 0) { strcat(working, toFull + start); } /* Remove the trailing slash */ working[strlen(working) - 1] = '\0'; /* Make sure I return something */ if (strlen(working) == 0) strcpy(working, "."); return working; } /************************************************************************ * Merges two paths ***********************************************************************/ const char* path_combine(const char* path0, const char* path1) { strcpy(working, ""); if (!matches(path0, ".") && !matches(path0, "./")) strcat(working, path0); path_translateInPlace(working, "posix"); if (!matches(path1, "") && !matches(path1, ".") && !matches(path1, "./")) { if (strlen(working) > 0 && working[strlen(working) - 1] != '/') strcat(working, "/"); strcat(working, path1); } path_translateInPlace(working, "posix"); return working; } /************************************************************************ * Compare two paths for equality, regardless of path structure. ***********************************************************************/ int path_compare(const char* path0, const char* path1) { char abs0[8192]; char abs1[8192]; strcpy(abs0, path_absolute(path0)); strcpy(abs1, path_absolute(path1)); return matches(abs0, abs1); } /************************************************************************ * Retrieve the portions of a path ***********************************************************************/ char path_getseparator(const char* type) { if (type == NULL) type = os_get(); if (matches(type, "windows")) return '\\'; else return '/'; } const char* path_getbasename(const char* path) { const char* name = path_getname(path); char* ptr = strrchr(name, '.'); if (ptr != NULL) *ptr = '\0'; return name; } const char* path_getextension(const char* path) { const char* ptr = strrchr(path, '.'); return ptr; } const char* path_getdir(const char* path) { char* ptr; if (path != NULL) { /* Convert path to neutral separators */ strcpy(forpart, path); path_translateInPlace(forpart, "posix"); /* Now split at last separator */ ptr = strrchr(forpart, '/'); if (ptr != NULL) { *ptr = '\0'; return forpart; } } return ""; } const char* path_getname(const char* path) { char* ptr; if (path == NULL) return NULL; strcpy(forpart, path); path_translateInPlace(forpart, "posix"); ptr = strrchr(forpart, '/'); return (ptr) ? ++ptr : forpart; } /************************************************************************ * Build a path from a directory, a file name, and a file extension ***********************************************************************/ const char* path_join(const char* dir, const char* name, const char* ext) { if (dir != NULL) strcpy(working, dir); else strcpy(working, ""); if (strlen(working) > 0) strcat(working, "/"); strcat(working, name); if (ext != NULL && strlen(ext) > 0) { strcat(working, "."); strcat(working, ext); } return working; } /************************************************************************ * Swap one file extension for another ***********************************************************************/ const char* path_swapextension(const char* path, const char* from, const char* to) { strcpy(working, path); working[strlen(path) - strlen(from)] = '\0'; strcat(working, to); return working; } /************************************************************************ * Translate the separators used in a path ***********************************************************************/ const char* path_translate(const char* path, const char* type) { if (working != path) strcpy(working, path); path_translateInPlace(working, type); return working; } void path_translateInPlace(char* buffer, const char* type) { char* ptr; for (ptr = buffer; *ptr != '\0'; ++ptr) { if (*ptr == '\\' || *ptr == '/') *ptr = path_getseparator(type); } } premake-3.7.orig/Src/vs2002_cs.c0000644000000000000000000002666710644156034013174 0ustar /********************************************************************** * Premake - vs2002_cs.c * The Visual Studio 2002 and 2003 C# target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include "premake.h" #include "vs.h" #include "vs2002.h" static const char* listReferences(const char* name); static const char* listFiles(const char* name); int vs2002_cs() { const char* outputType; int i; VsPkgData* data = (VsPkgData*)prj_get_data(); /* Figure out what I'm building */ prj_select_config(0); if (prj_is_kind("winexe")) outputType = "WinExe"; else if (prj_is_kind("exe")) outputType = "Exe"; else if (prj_is_kind("dll") || prj_is_kind("aspnet")) outputType = "Library"; else { printf("** Error: unknown package kind '%s'\n", prj_get_kind()); return 0; } /* Open the file and write the header */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj"))) return 0; io_print("\n"); io_print("\tprojGuid); io_print("\t>\n"); io_print("\t\t\n"); io_print("\t\t\t\n"); for (i = 0; i < prj_get_numconfigs(); ++i) { int optimize; prj_select_config(i); optimize = prj_has_flag("optimize") || prj_has_flag("optimize-size") || prj_has_flag("optimize-speed"); io_print("\t\t\t\t\n"); } io_print("\t\t\t\n"); /* VS7 requires same references for all configurations */ prj_select_config(0); io_print("\t\t\t\n"); print_list(prj_get_links(), "\t\t\t\t\n", "", listReferences); io_print("\t\t\t\n"); io_print("\t\t\n"); io_print("\t\t\n"); io_print("\t\t\t\n"); print_list(prj_get_files(), "\t\t\t\t\n", "", listFiles); io_print("\t\t\t\n"); io_print("\t\t\n"); io_print("\t\n"); io_print("\n"); io_closefile(); /* Now write the .csproj.user file for non-web applications or * .csproj.webinfo for web applications */ if (!prj_is_kind("aspnet")) { if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj.user"))) return 0; io_print("\n"); io_print("\t\n"); io_print("\t\t\n"); io_print("\t\t\t\n"); for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); io_print("\t\t\t\t\n"); } io_print("\t\t\t\n"); io_print("\t\t\n"); io_print("\t\t\n"); io_print("\t\n"); io_print("\n"); } else { if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "csproj.webinfo"))) return 0; io_print("\n"); io_print("\t\n", prj_get_pkgname()); io_print("\n"); } io_closefile(); return 1; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ static const char* listReferences(const char* name) { char assembly[8192]; char* comma; int i; /* Pull out the file name, the comma check is for full assembly names */ strcpy(assembly, name); comma = strchr(name, ','); if (comma != NULL) *comma = '\0'; strcpy(g_buffer, "\t\t\t\t\tName = \""); strcat(g_buffer, assembly); strcat(g_buffer, "\"\n"); /* Is this a sibling package? */ i = prj_find_package(name); if (i >= 0) { VsPkgData* data = (VsPkgData*)prj_get_data_for(i); strcat(g_buffer, "\t\t\t\t\tProject = \"{"); strcat(g_buffer, data->projGuid); strcat(g_buffer, "}\"\n"); strcat(g_buffer, "\t\t\t\t\tPackage = \"{"); strcat(g_buffer, data->toolGuid); strcat(g_buffer, "}\"\n"); return g_buffer; } strcat(g_buffer, "\t\t\t\t\tAssemblyName = \""); strcat(g_buffer, path_getname(assembly)); strcat(g_buffer, "\"\n"); if (!matches(assembly, path_getname(assembly))) { strcat(g_buffer, "\t\t\t\t\tHintPath = \""); strcat(g_buffer, assembly); strcat(g_buffer, ".dll\"\n"); } /* Tack on any extra information about the assembly */ while (comma != NULL) { char* start; for (start = comma + 1; *start == ' '; ++start); comma = strchr(start, '='); *comma = '\0'; strcat(g_buffer, "\t\t\t\t\t"); strcat(g_buffer, start); strcat(g_buffer, " = \""); start = comma + 1; comma = strchr(start, ','); if (comma != NULL) *comma = '\0'; strcat(g_buffer, start); strcat(g_buffer, "\"\n"); } return g_buffer; } /************************************************************************ * Builds an entry for each file in the project ***********************************************************************/ static const char* listFiles(const char* name) { io_print("\t\t\t\t\n"); return NULL; } premake-3.7.orig/Src/arg.h0000644000000000000000000000165410446776604012331 0ustar /********************************************************************** * Premake - arg.h * Command-line argument handling. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ const char* arg_getflag(); const char* arg_getflagarg(); void arg_reset(); void arg_set(int argc, char** argv); premake-3.7.orig/Src/os.h0000644000000000000000000000250010573143347012161 0ustar /********************************************************************** * Premake - os.h * Manage the list of supported OSes. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ /* Determine the current OS. I'm not sure how to reliably detect Windows * but since it is the most common I use is as the default */ #if defined(__linux__) #define PLATFORM_POSIX 1 #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) #define PLATFORM_POSIX 1 #elif defined(__APPLE__) && defined(__MACH__) #define PLATFORM_POSIX 1 #else #define PLATFORM_WINDOWS 1 #endif void os_detect(); const char* os_get(); int os_is(const char* name); int os_set(const char* name); premake-3.7.orig/Src/vs6.c0000644000000000000000000000706010446776604012266 0ustar /********************************************************************** * Premake - vs6.c * The Visual C++ 6 target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "vs6.h" static int writeWorkspace(); static const char* listPackageDeps(const char* name); int vs6_generate() { int i; puts("Generating Visual Studio 6 workspace and project files:"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); printf("...%s\n", prj_get_pkgname()); if (prj_is_lang("c++") || prj_is_lang("c")) { vs6_cpp(); } else if (prj_is_lang("c#")) { puts("** Error: C# projects are not supported by Visual Studio 6"); return 0; } else { printf("** Error: unrecognized language '%s'\n", prj_get_language()); return 0; } } return writeWorkspace(); } static int writeWorkspace() { int i; if (!io_openfile(path_join(prj_get_path(), prj_get_name(), "dsw"))) return 0; io_print("Microsoft Developer Studio Workspace File, Format Version 6.00\n"); io_print("# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n"); io_print("\n"); io_print("###############################################################################\n"); io_print("\n"); for (i = 0; i < prj_get_numpackages(); ++i) { prj_select_package(i); io_print("Project: \"%s\"=%s - Package Owner=<4>\n", prj_get_pkgname(), prj_get_pkgfilename("dsp")); io_print("\n"); io_print("Package=<5>\n"); io_print("{{{\n"); io_print("}}}\n"); io_print("\n"); io_print("Package=<4>\n"); io_print("{{{\n"); /* Write package dependencies */ prj_select_config(0); print_list(prj_get_links(), "", "", "", listPackageDeps); io_print("}}}\n"); io_print("\n"); io_print("###############################################################################\n"); io_print("\n"); } io_print("Global:\n"); io_print("\n"); io_print("Package=<5>\n"); io_print("{{{\n"); io_print("}}}\n"); io_print("\n"); io_print("Package=<3>\n"); io_print("{{{\n"); io_print("}}}\n"); io_print("\n"); io_print("###############################################################################\n"); io_print("\n"); io_closefile(); return 1; } /************************************************************************ * Checks if a package link matches the name of a sibling package. If * so, generate a dependency on that sibling ***********************************************************************/ static const char* listPackageDeps(const char* name) { int i = prj_find_package(name); if (i >= 0) { strcpy(g_buffer, " Begin Project Dependency\n"); strcat(g_buffer, " Project_Dep_Name "); strcat(g_buffer, prj_get_pkgname_for(i)); strcat(g_buffer, "\n"); strcat(g_buffer, " End Project Dependency\n"); return g_buffer; } else { return NULL; } } premake-3.7.orig/Src/os.c0000644000000000000000000000344510446776604012174 0ustar /********************************************************************** * Premake - os.c * Manage the list of supported OSes. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include "util.h" #include "os.h" static const char* os; /* Determine the current operating system. I'm not sure how to * consistently detect the Windows platform, but since that is the * most common I use it as a default */ void os_detect() { #if defined(__linux__) os = "linux"; #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) os = "bsd"; #elif defined(__APPLE__) && defined(__MACH__) os = "macosx"; #else os = "windows"; #endif } /* Retrieve the identification string */ const char* os_get() { return os; } /* Does this identifier match the selected OS? */ int os_is(const char* name) { return matches(name, os); } /* Does this symbol represent a valid OS identifier string? */ int os_set(const char* name) { if (matches(name, "bsd") || matches(name, "linux") || matches(name, "macosx") || matches(name, "windows")) { os = name; return 1; } else { return 0; } } premake-3.7.orig/Src/premake.h0000644000000000000000000000220510505774167013173 0ustar /********************************************************************** * Premake - premake.h * Application globals and functions. * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include "io.h" #include "path.h" #include "project.h" #include "util.h" extern const char* VERSION; extern const char* COPYRIGHT; extern const char* HELP_MSG; extern const char* g_cc; extern const char* g_dotnet; extern int g_verbose; extern const char* g_target; int onCommand(const char* cmd, const char* arg); premake-3.7.orig/Src/vs.c0000644000000000000000000005225011062460411012156 0ustar /********************************************************************** * Premake - vs.c * Common code for Visual Studio 2002-2008 targets. * * Copyright (c) 2002-2006 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include #include #include "premake.h" #include "vs.h" static int version; #define S_TRUE (version < VS2005 ? "TRUE" : "true") #define S_FALSE (version < VS2005 ? "FALSE" : "false") enum Blocks { BlocksEnd, VCCLCompilerTool, VCCustomBuildTool, VCLinkerTool, VCMIDLTool, VCPostBuildEventTool, VCPreBuildEventTool, VCPreLinkEventTool, VCResourceCompilerTool, VCWebServiceProxyGeneratorTool, VCXMLDataGeneratorTool, VCWebDeploymentTool, VCManagedWrapperGeneratorTool, VCAuxiliaryManagedWrapperGeneratorTool, VCManagedResourceCompilerTool, VCALinkTool, VCManifestTool, VCXDCMakeTool, VCBscMakeTool, VCFxCopTool, VCAppVerifierTool }; static int blocks_2002[] = { VCCLCompilerTool, VCCustomBuildTool, VCLinkerTool, VCMIDLTool, VCPostBuildEventTool, VCPreBuildEventTool, VCPreLinkEventTool, VCResourceCompilerTool, VCWebServiceProxyGeneratorTool, VCWebDeploymentTool, BlocksEnd }; static int blocks_2003[] = { VCCLCompilerTool, VCCustomBuildTool, VCLinkerTool, VCMIDLTool, VCPostBuildEventTool, VCPreBuildEventTool, VCPreLinkEventTool, VCResourceCompilerTool, VCWebServiceProxyGeneratorTool, VCXMLDataGeneratorTool, VCWebDeploymentTool, VCManagedWrapperGeneratorTool, VCAuxiliaryManagedWrapperGeneratorTool, BlocksEnd }; static int blocks_2005[] = { VCPreBuildEventTool, VCCustomBuildTool, VCXMLDataGeneratorTool, VCWebServiceProxyGeneratorTool, VCMIDLTool, VCCLCompilerTool, VCManagedResourceCompilerTool, VCResourceCompilerTool, VCPreLinkEventTool, VCLinkerTool, VCALinkTool, VCManifestTool, VCXDCMakeTool, VCBscMakeTool, VCFxCopTool, VCAppVerifierTool, VCWebDeploymentTool, VCPostBuildEventTool, BlocksEnd }; static int blocks_2008[] = { VCPreBuildEventTool, VCCustomBuildTool, VCXMLDataGeneratorTool, VCWebServiceProxyGeneratorTool, VCMIDLTool, VCCLCompilerTool, VCManagedResourceCompilerTool, VCResourceCompilerTool, VCPreLinkEventTool, VCLinkerTool, VCALinkTool, VCManifestTool, VCXDCMakeTool, VCBscMakeTool, VCFxCopTool, VCAppVerifierTool, VCWebDeploymentTool, VCPostBuildEventTool, BlocksEnd }; static int* blocks[] = { blocks_2002, blocks_2003, blocks_2005, blocks_2008 }; /************************************************************************ * Helpers to hide XML formatting style differences ***********************************************************************/ static int indent = 0; static int opened = 0; static int attrib = 0; static void tag_indent() { int i; for (i = 0; i < indent; ++i) io_print("\t"); } static void tag_open(const char* name) { if (opened) { if (version >= VS2005 && attrib > 0) { io_print("\n"); tag_indent(); } io_print(">\n"); } tag_indent(); io_print("<"); io_print(name); indent++; opened = 1; attrib = 0; } static void tag_attr(const char* attr, ...) { va_list args; va_start(args, attr); vsprintf(g_buffer, attr, args); va_end(args); io_print("\n"); tag_indent(); io_print(g_buffer); attrib++; } static void tag_attr_open(const char* name) { io_print("\n"); tag_indent(); io_print(name); io_print("=\""); } static void tag_attr_close() { io_print("\""); attrib++; } static void tag_close(const char* name, int form) { indent--; if (form == 1) { if (opened) { if (version == VS2008 && attrib > 0) { io_print("\n"); tag_indent(); io_print("\t>\n"); } else io_print(">\n"); } tag_indent(); io_print("\n"); } else { if (version >= VS2005) { io_print("\n"); tag_indent(); } io_print("/>\n"); } opened = 0; } /************************************************************************ * Store the current version of VS.NET being targeted ***********************************************************************/ void vs_setversion(int ver) { version = ver; } int vs_getversion() { return version; } /************************************************************************ * Assign GUIDs to each package by type ***********************************************************************/ void vs_assign_guids() { int p; for (p = 0; p < prj_get_numpackages(); ++p) { VsPkgData* data = ALLOCT(VsPkgData); prj_select_package(p); prj_set_data(data); if (prj_has_guid()) { strncpy(data->projGuid, prj_get_guid(), 37); data->projGuid[37] = '\0'; } else { generateUUID(data->projGuid); } prj_select_config(0); if (version >= VS2005 && prj_is_kind("aspnet")) { strcpy(data->toolGuid, "E24C65DC-7377-472B-9ABA-BC803B73C61A"); strcpy(data->projExt, ""); strcpy(data->projType, ""); } else if (prj_is_lang("c++") || prj_is_lang("c")) { strcpy(data->toolGuid, "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942"); strcpy(data->projExt, "vcproj"); strcpy(data->projType, "Win32"); } else if (prj_is_lang("c#")) { strcpy(data->toolGuid, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"); strcpy(data->projExt, "csproj"); if (version < VS2005) strcpy(data->projType, ".NET"); else strcpy(data->projType, "Any CPU"); } data->numDependencies = 0; } } /************************************************************************ * Write out a C++ project file ***********************************************************************/ int vs_write_cpp() { int i, b; const char* str = NULL; VsPkgData* data = (VsPkgData*)prj_get_data(); /* Open the file and write the header */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "vcproj"))) return 0; prj_select_config(0); io_print("\n"); tag_open("VisualStudioProject"); tag_attr("ProjectType=\"Visual C++\""); switch (version) { case VS2002: str = "7.00"; break; case VS2003: str = "7.10"; break; case VS2005: str = "8.00"; break; case VS2008: str = "9.00"; break; } tag_attr("Version=\"%s\"", str); tag_attr("Name=\"%s\"", prj_get_pkgname()); tag_attr("ProjectGUID=\"{%s}\"", data->projGuid); if (version >= VS2005) tag_attr("RootNamespace=\"%s\"", prj_get_pkgname()); tag_attr("Keyword=\"%s\"", prj_has_flag("managed") ? "ManagedCProj" : "Win32Proj"); tag_open("Platforms"); tag_open("Platform"); tag_attr("Name=\"Win32\""); tag_close("Platform", 0); tag_close("Platforms", 1); if (version >= VS2005) { tag_open("ToolFiles"); tag_close("ToolFiles", 1); } /* Write configurations */ tag_open("Configurations"); for (i = 0; i < prj_get_numconfigs(); ++i) { int optimization, debug, runtime, symbols, configTypeId; prj_select_config(i); if (prj_is_kind("winexe") || prj_is_kind("exe")) { configTypeId = 1; } else if (prj_is_kind("dll")) { configTypeId = 2; } else if (prj_is_kind("lib")) { configTypeId = 4; } else if (prj_is_kind("aspnet")) { puts("** Error: C++ ASP.NET projects are not supported"); return 0; } else { printf("** Error: unknown package kind '%s'\n", prj_get_kind()); return 0; } if (prj_has_flag("optimize-speed")) optimization = 2; else if (prj_has_flag("optimize-size")) optimization = 1; else if (prj_has_flag("optimize")) optimization = 3; else optimization = 0; debug = (optimization ==0); if (prj_has_flag("static-runtime")) runtime = (debug) ? 1 : 0; else runtime = (debug) ? 3 : 2; if (prj_has_flag("no-symbols")) { symbols = 0; } else { /* Edit-and-continue does not work if optimizations are enabled, or * for managed C++ projects */ if (prj_has_flag("no-edit-and-continue") || optimization != 0 || prj_has_flag("managed")) symbols = 3; else symbols = 4; } tag_open("Configuration"); tag_attr("Name=\"%s|Win32\"", xmlEscape(prj_get_cfgname())); tag_attr("OutputDirectory=\"%s\"", prj_get_outdir()); tag_attr("IntermediateDirectory=\"%s\"", prj_get_objdir()); tag_attr("ConfigurationType=\"%d\"", configTypeId); tag_attr("CharacterSet=\"%d\"", prj_has_flag("unicode") ? 1 : 2); if (prj_has_flag("managed")) tag_attr("ManagedExtensions=\"%s\"", S_TRUE); /* Write out tool blocks */ for (b = 0; blocks[version][b] != BlocksEnd; ++b) { tag_open("Tool"); switch (blocks[version][b]) { case VCPreBuildEventTool: tag_attr("Name=\"VCPreBuildEventTool\""); if (prj_get_numprebuildcommands() > 0) { tag_attr_open("CommandLine"); print_list(prj_get_prebuildcommands(), "", "", " ", xmlEscape); tag_attr_close(); } break; case VCCustomBuildTool: tag_attr("Name=\"VCCustomBuildTool\""); break; case VCXMLDataGeneratorTool: tag_attr("Name=\"VCXMLDataGeneratorTool\""); break; case VCManagedWrapperGeneratorTool: tag_attr("Name=\"VCManagedWrapperGeneratorTool\""); break; case VCAuxiliaryManagedWrapperGeneratorTool: tag_attr("Name=\"VCAuxiliaryManagedWrapperGeneratorTool\""); break; case VCWebServiceProxyGeneratorTool: tag_attr("Name=\"VCWebServiceProxyGeneratorTool\""); break; case VCMIDLTool: tag_attr("Name=\"VCMIDLTool\""); break; case VCManagedResourceCompilerTool: tag_attr("Name=\"VCManagedResourceCompilerTool\""); break; case VCResourceCompilerTool: tag_attr("Name=\"VCResourceCompilerTool\""); if (prj_get_numresoptions() > 0) { tag_attr_open("AdditionalOptions"); print_list(prj_get_resoptions(), "", "", " ", xmlEscape); tag_attr_close(); } if (prj_get_numdefines() > 0 || prj_get_numresdefines() > 0) { tag_attr_open("PreprocessorDefinitions"); print_list(prj_get_resdefines(), "", "", ";", xmlEscape); tag_attr_close(); } if (prj_get_numincpaths() > 0 || prj_get_numrespaths() > 0) { tag_attr_open("AdditionalIncludeDirectories"); print_list(prj_get_respaths(), "", "", ";", NULL); tag_attr_close(); } break; case VCPreLinkEventTool: tag_attr("Name=\"VCPreLinkEventTool\""); if (prj_get_numprelinkcommands() > 0) { tag_attr_open("CommandLine"); print_list(prj_get_prelinkcommands(), "", "", " ", xmlEscape); tag_attr_close(); } break; case VCALinkTool: tag_attr("Name=\"VCALinkTool\""); break; case VCManifestTool: tag_attr("Name=\"VCManifestTool\""); break; case VCXDCMakeTool: tag_attr("Name=\"VCXDCMakeTool\""); break; case VCBscMakeTool: tag_attr("Name=\"VCBscMakeTool\""); break; case VCFxCopTool: tag_attr("Name=\"VCFxCopTool\""); break; case VCAppVerifierTool: tag_attr("Name=\"VCAppVerifierTool\""); break; case VCWebDeploymentTool: tag_attr("Name=\"VCWebDeploymentTool\""); break; case VCPostBuildEventTool: tag_attr("Name=\"VCPostBuildEventTool\""); if (prj_get_numpostbuildcommands() > 0) { tag_attr_open("CommandLine"); print_list(prj_get_postbuildcommands(), "", "", " ", xmlEscape); tag_attr_close(); } break; case VCCLCompilerTool: tag_attr("Name=\"VCCLCompilerTool\""); if (prj_get_numbuildoptions() > 0) { tag_attr_open("AdditionalOptions"); print_list(prj_get_buildoptions(), "", "", " ", xmlEscape); tag_attr_close(); } tag_attr("Optimization=\"%d\"", optimization); if (prj_has_flag("no-frame-pointer")) tag_attr("OmitFramePointers=\"%s\"", S_TRUE); if (prj_get_numincpaths() > 0) { tag_attr_open("AdditionalIncludeDirectories"); print_list(prj_get_incpaths(), "", "", ";", NULL); tag_attr_close(); } if (prj_has_flag("managed")) tag_attr("AdditionalUsingDirectories=\"%s\"", prj_get_bindir()); if (prj_get_numdefines() > 0) { tag_attr_open("PreprocessorDefinitions"); print_list(prj_get_defines(), "", "", ";", xmlEscape); tag_attr_close(); } if (debug && !prj_has_flag("managed")) tag_attr("MinimalRebuild=\"%s\"", S_TRUE); if (prj_has_flag("no-exceptions")) { if (version < VS2005) tag_attr("ExceptionHandling=\"%s\"", S_FALSE); else tag_attr("ExceptionHandling=\"0\""); } if (prj_has_flag("seh-exceptions") && version > VS2003) tag_attr("ExceptionHandling=\"2\""); if (debug && !prj_has_flag("managed")) tag_attr("BasicRuntimeChecks=\"3\""); if (!debug) tag_attr("StringPooling=\"%s\"", S_TRUE); tag_attr("RuntimeLibrary=\"%d\"", runtime); tag_attr("EnableFunctionLevelLinking=\"%s\"", S_TRUE); if (version < VS2005 && !prj_has_flag("no-rtti")) tag_attr("RuntimeTypeInfo=\"%s\"", S_TRUE); if (version >= VS2005 && prj_has_flag("no-rtti")) tag_attr("RuntimeTypeInfo=\"%s\"", S_FALSE); if (prj_has_flag("native-wchar")) tag_attr("TreatWChar_tAsBuiltInType=\"%s\"", S_TRUE); else if (prj_has_flag("no-native-wchar")) tag_attr("TreatWChar_tAsBuiltInType=\"%s\"", S_FALSE); if (prj_has_pch()) { tag_attr("UsePrecompiledHeader=\"%d\"", version < VS2005 ? 3 : 2); tag_attr("PrecompiledHeaderThrough=\"%s\"", prj_get_pch_header()); } else { int value = version < VS2005 ? 2 : 0; if (prj_has_flag("no-pch")) value = 0; tag_attr("UsePrecompiledHeader=\"%d\"", value); } tag_attr("WarningLevel=\"%d\"", prj_has_flag("extra-warnings") ? 4 : 3); if (prj_has_flag("fatal-warnings")) tag_attr("WarnAsError=\"%s\"", S_TRUE); if (version != VS2008 && !prj_has_flag("managed")) tag_attr("Detect64BitPortabilityProblems=\"%s\"", prj_has_flag("no-64bit-checks") ? S_FALSE : S_TRUE); tag_attr("DebugInformationFormat=\"%d\"", symbols); break; case VCLinkerTool: if (!prj_is_kind("lib")) { tag_attr("Name=\"VCLinkerTool\""); if (prj_has_flag("no-import-lib")) tag_attr("IgnoreImportLibrary=\"%s\"", S_TRUE); if (prj_get_numlinkoptions() > 0) { tag_attr_open("AdditionalOptions"); print_list(prj_get_linkoptions(), " ", "", "", NULL); tag_attr_close(); } if (prj_get_numlinks() > 0) { tag_attr_open("AdditionalDependencies"); print_list(prj_get_links(), "", ".lib", " ", vs_filter_links); tag_attr_close(); } tag_attr("OutputFile=\"$(OutDir)/%s\"", path_getname(prj_get_target())); tag_attr("LinkIncremental=\"%d\"", debug ? 2 : 1); tag_attr_open("AdditionalLibraryDirectories"); io_print(prj_get_libdir()); print_list(prj_get_libpaths(), ";", "", "", NULL); tag_attr_close(); /* Look for a .def file for DLLs */ if (prj_find_filetype(".def") != NULL) tag_attr("ModuleDefinitionFile=\"%s\"", prj_find_filetype(".def")); if (prj_has_flag("no-manifest")) tag_attr("GenerateManifest=\"%s\"", S_FALSE); tag_attr("GenerateDebugInformation=\"%s\"", symbols ? S_TRUE : S_FALSE); if (symbols) tag_attr("ProgramDatabaseFile=\"$(OutDir)/%s.pdb\"", path_getbasename(prj_get_target())); tag_attr("SubSystem=\"%d\"", prj_is_kind("exe") ? 1 : 2); if (!debug) tag_attr("OptimizeReferences=\"2\""); if (!debug) tag_attr("EnableCOMDATFolding=\"2\""); if ((prj_is_kind("exe") || prj_is_kind("winexe")) && !prj_has_flag("no-main")) { tag_attr("EntryPointSymbol=\"mainCRTStartup\""); } else if (prj_is_kind("dll")) { tag_attr_open("ImportLibrary"); if (prj_has_flag("no-import-lib")) { io_print(prj_get_objdir()); } else { io_print(prj_get_libdir()); str = path_getdir(prj_get_target_raw()); if (strlen(str) > 0) io_print("/%s", str); } if (prj_has_importlibname()) io_print("/%s.lib", prj_get_importlibname()); else io_print("/%s.lib", path_getbasename(prj_get_target())); tag_attr_close(); } tag_attr("TargetMachine=\"1\""); } else { tag_attr("Name=\"VCLibrarianTool\""); tag_attr("OutputFile=\"$(OutDir)/%s.lib\"", path_getbasename(prj_get_target())); } break; } tag_close("", 0); } tag_close("Configuration", 1); } tag_close("Configurations", 1); if (version > VS2002) { tag_open("References"); tag_close("References", 1); } tag_open("Files"); print_source_tree("", vs_list_files); tag_close("Files", 1); tag_open("Globals"); tag_close("Globals", 1); tag_close("VisualStudioProject", 1); io_closefile(); return 1; } /************************************************************************ * Checks each entry in the list of package links. If the entry refers * to a sibling package, returns the path to that package's output ***********************************************************************/ const char* vs_filter_links(const char* name) { int i = prj_find_package(name); if (i >= 0) { const char* kind = prj_get_kind_for(i); const char* lang = prj_get_language_for(i); if ((matches(lang, "c") || matches(lang, "c++")) && (matches(kind, "dll") || matches(kind, "lib"))) { strcpy(g_buffer, prj_get_libdir_for(i)); return path_combine(g_buffer, prj_get_targetname_for(i)); } else return NULL; } else { return name; } } /************************************************************************ * Callback for print_source_tree() ***********************************************************************/ void vs_list_files(const char* path, int stage) { const char* pchSource = prj_has_pch() ? prj_get_pch_source() : NULL; const char* ptr = path; while (strncmp(ptr, "../", 3) == 0) ptr += 3; ptr = strchr(ptr, '/'); while (ptr != NULL) ptr = strchr(ptr + 1, '/'); ptr = strrchr(path, '/'); ptr = (ptr == NULL) ? (char*)path : ptr + 1; switch (stage) { case WST_OPENGROUP: if (strlen(path) > 0 && !matches(ptr, "..")) { tag_open("Filter"); tag_attr("Name=\"%s\"", ptr); tag_attr("Filter=\"\""); } break; case WST_CLOSEGROUP: if (strlen(path) > 0 && !matches(ptr, "..")) tag_close("Filter", 1); break; case WST_SOURCEFILE: tag_open("File"); tag_attr_open("RelativePath"); if (path[0] != '.') io_print(".\\"); io_print(path_translate(path, "windows")); tag_attr_close(); /* Add FileConfiguration section as needed */ if (matches(path_getname(path), pchSource)) { int i; for (i = 0; i < prj_get_numconfigs(); ++i) { prj_select_config(i); tag_open("FileConfiguration"); tag_attr("Name=\"%s|Win32\"", prj_get_cfgname()); tag_open("Tool"); tag_attr("Name=\"VCCLCompilerTool\""); tag_attr("UsePrecompiledHeader=\"1\""); tag_close("Tool", 0); tag_close("FileConfiguration", 1); } } tag_close("File", 1); break; } } /************************************************************************ * List callback: scans the list of links for a package. If a link is * found to a sibling package, return a dependency string for the * solution file. ***********************************************************************/ const char* vs_list_pkgdeps(const char* name) { int i; for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(prj_get_pkgname_for(i), name)) { VsPkgData* data = (VsPkgData*)prj_get_data_for(i); if (version > VS2002) { sprintf(g_buffer, "{%s} = {%s}", data->projGuid, data->projGuid); } else { VsPkgData* src = (VsPkgData*)prj_get_data(); sprintf(g_buffer, "{%s}.%d = {%s}", src->projGuid, src->numDependencies, data->projGuid); ++(src->numDependencies); } return g_buffer; } } return NULL; } /************************************************************************ * VS.NET requires that all reference search paths be absolute ***********************************************************************/ const char* vs_list_refpaths(const char* name) { char* path = (char*)path_absolute(name); path_translateInPlace(path, "windows"); return path; } premake-3.7.orig/Src/Makefile0000644000000000000000000002451311065434775013044 0ustar # C Console Executable Makefile autogenerated by premake # Don't edit this file! Instead edit `premake.lua` then rerun `make` ifndef CONFIG CONFIG=Debug endif # if multiple archs are defined turn off automated dependency generation DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD) ifeq ($(CONFIG),Debug) BINDIR := ../bin LIBDIR := .. OBJDIR := obj/Debug OUTDIR := ../bin CPPFLAGS := $(DEPFLAGS) -D "_CRT_SECURE_NO_DEPRECATE" -D "USE_POPEN=1" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -Wall CXXFLAGS += $(CFLAGS) LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -lm LDDEPS := RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "USE_POPEN=1" TARGET := premake BLDCMD = $(CC) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) endif ifeq ($(CONFIG),Release) BINDIR := ../bin LIBDIR := .. OBJDIR := obj/Release OUTDIR := ../bin CPPFLAGS := $(DEPFLAGS) -D "_CRT_SECURE_NO_DEPRECATE" -D "USE_POPEN=1" CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -Os -Wall CXXFLAGS += $(CFLAGS) LDFLAGS += -L$(BINDIR) -L$(LIBDIR) -s -lm LDDEPS := RESFLAGS := -D "_CRT_SECURE_NO_DEPRECATE" -D "USE_POPEN=1" TARGET := premake BLDCMD = $(CC) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) endif OBJECTS := \ $(OBJDIR)/platform_windows.o \ $(OBJDIR)/os.o \ $(OBJDIR)/gnu.o \ $(OBJDIR)/premake.o \ $(OBJDIR)/gnu_cpp.o \ $(OBJDIR)/gnu_cs.o \ $(OBJDIR)/util.o \ $(OBJDIR)/vs2008.o \ $(OBJDIR)/sharpdev_cs.o \ $(OBJDIR)/platform_posix.o \ $(OBJDIR)/clean.o \ $(OBJDIR)/sharpdev.o \ $(OBJDIR)/vs2002.o \ $(OBJDIR)/vs2002_cs.o \ $(OBJDIR)/path.o \ $(OBJDIR)/vs2008_cs.o \ $(OBJDIR)/vs6.o \ $(OBJDIR)/io.o \ $(OBJDIR)/arg.o \ $(OBJDIR)/codelite_cpp.o \ $(OBJDIR)/vs6_cpp.o \ $(OBJDIR)/vs2005_cs.o \ $(OBJDIR)/cb.o \ $(OBJDIR)/monodev.o \ $(OBJDIR)/cb_cpp.o \ $(OBJDIR)/project.o \ $(OBJDIR)/vs.o \ $(OBJDIR)/monodev_cs.o \ $(OBJDIR)/gnu_helpers.o \ $(OBJDIR)/script.o \ $(OBJDIR)/vs2005.o \ $(OBJDIR)/codelite.o \ $(OBJDIR)/lapi.o \ $(OBJDIR)/lstate.o \ $(OBJDIR)/lvm.o \ $(OBJDIR)/liolib.o \ $(OBJDIR)/ldblib.o \ $(OBJDIR)/ltablib.o \ $(OBJDIR)/lstring.o \ $(OBJDIR)/ldebug.o \ $(OBJDIR)/lstrlib.o \ $(OBJDIR)/lfunc.o \ $(OBJDIR)/lauxlib.o \ $(OBJDIR)/lgc.o \ $(OBJDIR)/ldo.o \ $(OBJDIR)/ltests.o \ $(OBJDIR)/ltm.o \ $(OBJDIR)/lundump.o \ $(OBJDIR)/ldump.o \ $(OBJDIR)/lmem.o \ $(OBJDIR)/lbaselib.o \ $(OBJDIR)/loadlib.o \ $(OBJDIR)/ltable.o \ $(OBJDIR)/lparser.o \ $(OBJDIR)/lzio.o \ $(OBJDIR)/llex.o \ $(OBJDIR)/loslib.o \ $(OBJDIR)/lcode.o \ $(OBJDIR)/lopcodes.o \ $(OBJDIR)/lmathlib.o \ $(OBJDIR)/lobject.o \ $(OBJDIR)/linit.o \ $(OBJDIR)/ow.o \ MKDIR_TYPE := msdos CMD := $(subst \,\\,$(ComSpec)$(COMSPEC)) ifeq (,$(CMD)) MKDIR_TYPE := posix endif ifeq (/bin,$(findstring /bin,$(SHELL))) MKDIR_TYPE := posix endif ifeq ($(MKDIR_TYPE),posix) CMD_MKBINDIR := mkdir -p $(BINDIR) CMD_MKLIBDIR := mkdir -p $(LIBDIR) CMD_MKOUTDIR := mkdir -p $(OUTDIR) CMD_MKOBJDIR := mkdir -p $(OBJDIR) else CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\,$(BINDIR)) mkdir $(subst /,\\,$(BINDIR)) CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\,$(LIBDIR)) mkdir $(subst /,\\,$(LIBDIR)) CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\,$(OUTDIR)) mkdir $(subst /,\\,$(OUTDIR)) CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\,$(OBJDIR)) mkdir $(subst /,\\,$(OBJDIR)) endif .PHONY: clean $(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) @echo Linking Premake -@$(CMD_MKBINDIR) -@$(CMD_MKLIBDIR) -@$(CMD_MKOUTDIR) @$(BLDCMD) clean: @echo Cleaning Premake ifeq ($(MKDIR_TYPE),posix) -@rm -f $(OUTDIR)/$(TARGET) -@rm -rf $(OBJDIR) else -@if exist $(subst /,\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\,$(OUTDIR)/$(TARGET)) -@if exist $(subst /,\,$(OBJDIR)) del /q $(subst /,\,$(OBJDIR)) -@if exist $(subst /,\,$(OBJDIR)) rmdir /s /q $(subst /,\,$(OBJDIR)) endif $(OBJDIR)/platform_windows.o: platform_windows.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/os.o: os.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/gnu.o: gnu.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/premake.o: premake.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/gnu_cpp.o: gnu_cpp.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/gnu_cs.o: gnu_cs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/util.o: util.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs2008.o: vs2008.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/sharpdev_cs.o: sharpdev_cs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/platform_posix.o: platform_posix.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/clean.o: clean.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/sharpdev.o: sharpdev.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs2002.o: vs2002.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs2002_cs.o: vs2002_cs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/path.o: path.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs2008_cs.o: vs2008_cs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs6.o: vs6.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/io.o: io.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/arg.o: arg.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/codelite_cpp.o: codelite_cpp.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs6_cpp.o: vs6_cpp.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs2005_cs.o: vs2005_cs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/cb.o: cb.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/monodev.o: monodev.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/cb_cpp.o: cb_cpp.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/project.o: project.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs.o: vs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/monodev_cs.o: monodev_cs.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/gnu_helpers.o: gnu_helpers.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/script.o: script.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/vs2005.o: vs2005.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/codelite.o: codelite.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lapi.o: Lua/lapi.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lstate.o: Lua/lstate.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lvm.o: Lua/lvm.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/liolib.o: Lua/liolib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ldblib.o: Lua/ldblib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ltablib.o: Lua/ltablib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lstring.o: Lua/lstring.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ldebug.o: Lua/ldebug.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lstrlib.o: Lua/lstrlib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lfunc.o: Lua/lfunc.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lauxlib.o: Lua/lauxlib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lgc.o: Lua/lgc.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ldo.o: Lua/ldo.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ltests.o: Lua/ltests.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ltm.o: Lua/ltm.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lundump.o: Lua/lundump.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ldump.o: Lua/ldump.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lmem.o: Lua/lmem.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lbaselib.o: Lua/lbaselib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/loadlib.o: Lua/loadlib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ltable.o: Lua/ltable.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lparser.o: Lua/lparser.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lzio.o: Lua/lzio.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/llex.o: Lua/llex.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/loslib.o: Lua/loslib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lcode.o: Lua/lcode.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lopcodes.o: Lua/lopcodes.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lmathlib.o: Lua/lmathlib.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/lobject.o: Lua/lobject.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/linit.o: Lua/linit.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" $(OBJDIR)/ow.o: open_watcom/ow.c -@$(CMD_MKOBJDIR) @echo $(notdir $<) @$(CC) $(CFLAGS) -o "$@" -c "$<" -include $(OBJECTS:%.o=%.d) premake-3.7.orig/Src/monodev_cs.c0000644000000000000000000002072310644156034013672 0ustar /********************************************************************** * Premake - monodev_cs.c * The MonoDevelop C# target * * Copyright (c) 2002-2005 Jason Perkins and the Premake project * * 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 in the file LICENSE.txt for details. **********************************************************************/ #include #include #include "premake.h" #include "monodev.h" #include "os.h" static char buffer[8192]; static void listFiles(const char* path, int stage); static void printFile(const char* file); static const char* listReferences(const char* name); int monodev_cs() { const char* kind; // const char* runtime; // const char* csc; int i; /* Figure out what I'm building */ prj_select_config(0); if (prj_is_kind("winexe")) kind = "WinExe"; else if (prj_is_kind("exe")) kind = "Exe"; else if (prj_is_kind("dll") || prj_is_kind("aspnet")) kind = "Library"; else { printf("** Error: unknown package kind '%s'\n", prj_get_kind()); return 0; } /* Figure out what .NET environment I'm using */ /* if (g_dotnet == NULL) g_dotnet = "mono"; if (strcmp(g_dotnet, "ms") == 0) { runtime = "MsNet"; csc = "Csc"; } else if (strcmp(g_dotnet, "mono") == 0) { runtime = "Mono"; csc = "Mcs"; } else if (strcmp(g_dotnet, "pnet") == 0) { printf("** Error: MonoDevelop does not yet support Portable.NET\n"); return 0; } else { printf("** Error: unknown .NET runtime '%s'\n", g_dotnet); return 0; } */ /* Write the file */ if (!io_openfile(path_join(prj_get_pkgpath(), prj_get_pkgname(), "mdp"))) return 0; io_print("\n", prj_get_pkgname()); prj_select_config(0); io_print(" \n", xmlEscape(prj_get_cfgname())); for (i = 0; i < prj_get_numconfigs(); ++i) { int optimized; prj_select_config(i); optimized = prj_has_flag("optimize") || prj_has_flag("optimize-size") || prj_has_flag("optimize-speed"); io_print(" \n", xmlEscape(prj_get_cfgname())); io_print(" \n", path_getbasename(prj_get_target())); prj_select_config(i); io_print(" 0) { io_print(" executeBeforeBuild=\""); print_list(prj_get_prebuildcommands(), "", "", " && ", xmlEscape); io_print("\""); } if (prj_get_numpostbuildcommands() > 0) { io_print(" executeAfterBuild=\""); print_list(prj_get_postbuildcommands(), "", "", " && ", xmlEscape); io_print("\""); } io_print(" debugmode=\"%s\" target=\"%s\" />\n", prj_has_flag("no-symbols") ? "False" : "True", kind); io_print(" \n", prj_has_flag("fatal-warnings") ? "False" : "True"); io_print(" \n"); io_print(" \n"); } io_print(" \n"); io_print(" \n"); io_print(" \n"); io_print(" \n"); /* File List */ io_print(" \n"); print_source_tree("", listFiles); io_print(" \n"); /* References - all configuration will use the same set */ prj_select_config(0); io_print(" \n"); print_list(prj_get_links(), " \n", "", listReferences); io_print(" \n"); io_print("\n"); io_closefile(); return 1; } /************************************************************************ * Callback for print_source_tree() ***********************************************************************/ static void listFiles(const char* path, int stage) { switch (stage) { case WST_OPENGROUP: if (strlen(path) > 0) { io_print(" \n"); } break; case WST_CLOSEGROUP: break; case WST_SOURCEFILE: printFile(path); break; } } static void printFile(const char* file) { const char* ext; const char* prefix = ""; const char* subtype = ""; const char* action = "Nothing"; const char* depends = ""; if (file[0] != '.') prefix = "./"; ext = path_getextension(file); /* If a build action was specified, use it */ prj_select_file(file); if (prj_get_buildaction() != NULL) { action = prj_get_buildaction(); if (matches(action, "EmbeddedResource")) action = "EmbedAsResource"; if (matches(action, "None")) action = "Nothing"; if (matches(action, "Content")) { puts("** Warning: MonoDevelop does not support the 'Content' build action"); action = "Nothing"; } subtype = "Code"; } else if (matches(ext, ".cs")) { subtype = "Code"; action = "Compile"; } else if (matches(ext, ".resx")) { /* If a matching .cs file exists, link it */ strcpy(buffer, file); strcpy(buffer + strlen(file) - 5, ".cs"); if (prj_has_file(buffer)) { /* Path is relative to .resx file, I assume both are in same * directory and cut off path information */ depends = path_getname(buffer); } subtype = "Code"; action = "EmbedAsResource"; } else { prj_select_file(file); subtype = "Code"; action = prj_get_buildaction(); if (action == NULL || matches(action, "Content")) { monodev_warncontent = 1; action = "Nothing"; } } io_print(" \n", prefix, file, subtype, action); } /************************************************************************ * Prints entry for each reference listed in the package ***********************************************************************/ static const char* listReferences(const char* name) { int i; int isSibling = 0; const char* fileName = path_getname(name); strcpy(buffer," type=\""); /* A bit of craziness here...#dev wants to know if an assembly is local * (type == "Assembly") or in the GAC (type == "GAC"). I would prefer * to not have to specify this in the premake script if I can get away * with it. So for each reference I check to see if it is a sibling * project, and if so I consider it local. If not, I check all of the * reference paths to see if I can find the DLL and if so I consider * it local. If not, I consider it in the GAC. Seems to work so far */ for (i = 0; i < prj_get_numpackages(); ++i) { if (matches(prj_get_pkgname_for(i), name)) { isSibling = 1; break; } } if(isSibling) { strcat(buffer, "Project\" localcopy=\"True\""); strcat(buffer, " refto=\""); strcat(buffer, fileName); strcat(buffer, "\""); } else { const char* ext = strchr(name,',') ? "" : ".dll"; /* See if this assembly exists on one of the link paths */ if (io_fileexists(path_join(prj_get_bindir(), name, ext))) { strcat(buffer, "Assembly\" localcopy=\"False\" refto=\""); strcat(buffer, path_build(prj_get_pkgpath(), prj_get_bindir())); strcat(buffer, "/"); strcat(buffer, name); strcat(buffer, ".dll\""); } else { strcat(buffer, "Gac\" localcopy=\"False\" refto=\""); strcat(buffer, name); strcat(buffer, ext); strcat(buffer, "\""); } } return buffer; } premake-3.7.orig/Src/Premake.vcproj0000644000000000000000000002120111065435041014167 0ustar premake-3.7.orig/Premake.sln0000644000000000000000000000162611065435041012742 0ustar Microsoft Visual Studio Solution File, Format Version 7.00 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Premake", "Src/Premake.vcproj", "{2FACBF65-640E-C284-0D02-FBF111FEA364}" EndProject Global GlobalSection(SolutionConfiguration) = preSolution ConfigName.0 = Debug ConfigName.1 = Release EndGlobalSection GlobalSection(ProjectDependencies) = postSolution EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {2FACBF65-640E-C284-0D02-FBF111FEA364}.Debug.ActiveCfg = Debug|Win32 {2FACBF65-640E-C284-0D02-FBF111FEA364}.Debug.Build.0 = Debug|Win32 {2FACBF65-640E-C284-0D02-FBF111FEA364}.Release.ActiveCfg = Release|Win32 {2FACBF65-640E-C284-0D02-FBF111FEA364}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection GlobalSection(ExtensibilityAddIns) = postSolution EndGlobalSection EndGlobal premake-3.7.orig/CHANGES.txt0000644000000000000000000002353111065433457012461 0ustar Premake Changelog ----------------- 3.7 * Updated Lua to 5.1.3 * Added new CodeLite support target (Ryan Pusztai) * Added new cb-ow (Code::Blocks Open Watcom) target (Tim Channon) * Place OSX winexe's into Content/MacOS folder (William Burnson) * Sibling executables may now be listed in package.links * Bug 1520012: Improper Makefiles when filenames have spaces (Diaa Sami) * Bug 2045506: "no-exceptions" flag ignored for VS200x (Benoit Miller) * Bug 2034470: Error in cmd line error handler * Bug 2114152: package or config table isn't generated automatically 3.6 * Patch 1946122: Add support for VS2008 (Ryan Pusztai) * Patch 1913448: Win32 crash when using '--clean --usetargetpath' (David Walters) * Patch 1771168: luaL_getn speed optimization (Richard O'Grady) * Bug 1939089: Premake segfault on Linux/PPC (Fabio Till) * Fixed "bad argument #2 to 'chdir'" error * Disable -MMD on multiple -arch flags (poor man's Universal binary support) 3.5 * Prevent creation of import libraries on OS X * Improved handling of dylibs on OS X * Patch 1771977: Ability to compile C source as C++ in Code::Blocks (Ryan Pusztai) * Bug 1804810: out-implib not present in linux gnu compler toolchain * Bug 1806949: .Net reference paths are broken when bindir is specified * Bug 1806960: Make clean does not remove .mdb files * Bug 1831389: Makefiles stored in subdirs contain no targets on first run 3.4 * Added `no-pch` flag to suppress precompiled headers * Added App.config support to GNU makefiles * Add os.mkdir() to script environment * Makefile now creates target directory before copying .NET references * Feature 1520182: Enhanced file-handling functions * Bug 531878: Problems with relative paths * Bug 1723867: Config-specific post-build on GNU target (Benoit Miller) * Bug 1596826: XML targets doesn't escape xml entities * Bug 1600155: Core dump due to newpackage() and matchfiles() * Bug 1608895: resgen command shown * Bug 1639730: Output filename is not set * Bug 1729227: non-portable executable with relative library path * Bug 1559951: default clean rule removes package dir * Patch 1733674: PCH support for Code::Block targets (Ryan Pusztai) * Patch 1746563: Ability to specify GUID for VS targets (Ryan Pusztai) * Patch 1754867: Creating import lib of different name (Ryan Pusztai) 3.3 * Added support for prebuild, prelink, and postbuild commands * Added `target` global variable to script environment * Added build flag `no-edit-and-continue` * Added build flags `native-wchar` and `no-native-wchar` * Added build flag `no-manifest` * Added build flag `seh-exceptions` (VS2005 only) * Added `resdefines`, `respaths`, and `resoptions` * Added `prebuildcommands`, `prelinkcommands`, and `postbuildcommands` * Added `pchheader` and `pchsource` (Visual Studio only) * Feature 1337547: Package-level bindir and libdir * Bug 1565755: Generated makefiles do not work with MSYS * Bug 1587955: Target path ignored for libs * Bug 1574725: Static library extension for "gnu" target * Bug 1522861: Fixed by using "ar -rcs" instead of "ar -cr && ranlib" * Bug 1656816: Mkdir set wrong directory rights * Bug 1655595: Compile/build problem on FreeBSD * Bug: "gnu" clean rule doesn't work in cmd.exe * Improved behavior of Linux findlib() * Updated Code::Blocks support to latest project version (major="1" minor="6") * Patch 1681666: GNU targets always show the console if kind = 'winexe' 3.2 * Added support for Code::Blocks * Updated MonoDevelop support * Upgraded Lua to 5.0.3 * Added new matchdirs() to Lua script environment * Expose list of packages as _PACKAGES global in Lua * Turn off edit-and-continue in release builds with symbols * Bug 1559873: libpaths inserts extra space after -L 3.1 * Added support for Visual Studio 2005 * Added support for Windows resources to GNU make target * Added path handling functions to Lua environment * Added matchrecursive() for recursive file searches * Added os.fileexists() function to Lua environment * Added os.appendfile() function to Lua environment * Changed `monoresgen` to `resgen` to keep up with Mono project * Added `mono2` .NET compiler set for Mono .NET 2.0 support * Feature 1096677: exclude files from matchfiles (package.excludes) * Bug 1439463: VS2003 RTTI problem * Bug 1439446: GNU Makefile problem under Mingw32 * Bug 1422068: package.path="." causes bad makefiles * Bug 1431530: makefile target fails when project path specified 3.0 * Upgraded Lua interpreter to version 5.0.1 * The options table now stores simple values, rather than tables * Completed MonoDevelop support * Improved .NET resource handling for GNU generator * Added unit test suite * Merged Scott Graham unicode build flag patch * Removed package.warninglevel in favor of extra-warnings flag * Added package.targetprefix * Overhauled structure of generated GNU makefiles * Added --os command line option * Fixed bug 1268588: Use gcc to link C packages * Fixed bug 1363306: GNU C# should copy referenced DLLs 2.4 * Added chdir() to Lua script environment * Merged Thomas Harning's patch for .NET resources on GNU * Fixed bug 1194702: Can't put multiple packages in same directory * Fixed bug in GNU shared library builds (doh!) * Added target 'vs2002' to replace 'vs7' 2.3 * Added 'project.config[]' with 'bindir' and 'libdir' * Merged Scott Graham's "warninglevel" patch. * Fixed bug 1153484: Import lib in wrong directory. * Fixed bug 1013352: Stack overflow with large projects. * Fixed bug 945406: package.files, bad value = crash 2.2 * Worked around VS.NET bug for .NET assemblies > 64K. * Added --very-verbose flag to GNU generator. * GNU generator now supports assembly sources. 2.1 * File extension of generated binaries can now be set with config.targetextension. * Windows targets now handle .def files for DLLs. 2.0 * Can now specify build actions per file * Include paths are now passed to VC7 resource compiler * Removed _WIN32 define from Cygwin makefiles * Added package.objdir to set intermediates directory * Added rmdir() to Lua script environment * A big bag of bug fixes 1.9 * Made verbose mode even more verbose. * posix.c now builds properly as C. * Fixed package dependency generation for GNU and VS2003. * Display Lua version number in usage text. * Fixed VS link between *.aspx and *.aspx.cs files. * Fixed VS link between *.resx and *.cs files. * Fixed *.d file generation for gcc 2.9x. * Unified various help options under '--help'. * Bin and Lib paths can now be arbitrarily long. * linkoptions are now applied in VC6 and VC7 projects. 1.8 * Added support for ASP.NET projects. * Fixed a bug in VC6 support for static libraries. * matchfiles() now uses package path instead of script path. * Added --verbose option. * No longer apply no-rtti and no-exceptions to *.c files. 1.7 * Location of generated project files can now be specified with the project.path variable. * Inter-package dependencies are fixed for GNU makefiles. * No longer need to execute in same directory as project script. * Added "c" language specifier. * Added support for .resx and .config files to C# projects. * Added support for full assembly names in .NET references. * Fixed handling of paths in package.target variable. * Improved support for SharpDevelop. * Started support for OS X. * Added support for Digital Mars compiler. 1.6.1 * VS7 generator crashed if a package was built before one of its dependencies. Now immediately assigns UUID before processing. 1.6 * Added support for Visual Studio 2003 and SharpDevelop. * Added binaries directory as a reference path for VS7. 1.5 * Added initial support for building static libraries. * Added "no-main" flag, prevents overriding WinMain() on Windows builds. * Added "--no-rtti" and "no-exceptions" build flags to disable those C++ features. * Display error message when project has no packages. * Moved VC7 *.pdb files into intermediates directory. 1.4 * Bug fixes to the path manipulation routines. * GNU makefiles are regenerated when premake scripts change. 1.3 * Added support for the Cygwin environment. * Added "static-runtime" build flag to statically link against C/C++ standard runtime libraries. * Bug fixes to Visual Studio 6 and 7 generators and path reversing algorithm. 1.2 * Standardized format of command-line options. * Can now handle custom command-line options in script. * Added new function findlib(). * Added new C++ build flag "managed" for writing C++ .NET code. * Can now use open-source C# compilers in VS6 generator. * Several bug fixes to the VS7 generator. 1.1 * Added support for custom build configurations. Added "optimize", "optimize-size", "optimize-speed", and "no-symbols" flags to control build settings. * Added matchfiles() to select files using wildcards. * Added "unsafe" flag for C# projects. * Added newpackage() function for creating new package objects inline, instead of creating separate scripts. * Changed include() to dopackage() and option() to addoption(). The old versions have been kept for compatibility, but will be deprecated eventually. * Major cleanup of the source code. 1.0 * Fixed a bug related to the reference paths in VS7 C# projects. * Display a warning message if a reference path can't be found. * Automatically create bin and lib directories if they do not exist. * GNU C# projects will now properly use the configured library paths. 0.9.2 * Added --with-mono and --with-pnet options. * VS7 C# projects will now properly use the configured library paths. 0.9.1 * Switched to Lua (http://www.lua.org/) for project script parsing. * Add support for custom project options. * Changed 'type' to 'kind' to avoid conflict with Lua function of the same name. * Changed 'conexe' to 'exe' because I liked it better. * Changed 'library' to 'dll' for C# projects to keep things consistent. 0.9.0 * Initial public release. premake-3.7.orig/README.txt0000644000000000000000000000104211004366620012325 0ustar PREMAKE Build Script Generation Copyright (C) 2002-2008 by Jason Perkins Distributed under the GNU General Public License, see LICENSE.txt The Lua language and runtime library is (C) TeCGraf, PUC-Rio. See their website at http://www.lua.org/ BUILDING PREMAKE GNU make: type 'make' (also Cygwin and MinGW) MS Visual C++ 6: open Premake.dsw and build. MS Visual C++ 2002-2008: open Premake.sln and build. For questions, comments, or more information, visit the project website at http://premake.sourceforge.net/ premake-3.7.orig/premake.lua0000644000000000000000000000054010553544436012773 0ustar project.name = "Premake" -- Options addoption("with-tests", "Include the unit tests (requires NUnit)") -- Project Settings project.bindir = "bin" dopackage("Src") if (options["with-tests"]) then dopackage("Tests") end -- A little extra cleanup function doclean(cmd, arg) docommand(cmd, arg) os.rmdir("bin") end premake-3.7.orig/Packages/0000755000000000000000000000000011065434622012355 5ustar premake-3.7.orig/Packages/debian/0000755000000000000000000000000011065434622013577 5ustar premake-3.7.orig/Packages/debian/dirs0000644000000000000000000000001011007612460014444 0ustar usr/bin premake-3.7.orig/Packages/debian/copyright0000644000000000000000000000520611007612460015527 0ustar This package was debianized by Ryan Mulder on Thu, 17 Apr 2008 20:27:22 -0400. It was downloaded from Upstream Author: Jason Perkins Copyright: Copyright (C) 2002-2005 Jason Perkins and the Premake project License: 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 package; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The Debian packaging is (C) 2008, Ryan Mulder and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. Lua License ----------- Lua is licensed under the terms of the MIT license reproduced below. This means that Lua is free software and can be used for both academic and commercial purposes at absolutely no cost. For details and rationale, see http://www.lua.org/license.html . =============================================================================== Copyright (C) 2003-2006 Tecgraf, PUC-Rio. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =============================================================================== (end of COPYRIGHT) premake-3.7.orig/Packages/debian/compat0000644000000000000000000000000211007612460014767 0ustar 5 premake-3.7.orig/Packages/debian/rules0000644000000000000000000000167111007612460014653 0ustar #!/usr/bin/make -f CFLAGS = -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif configure: configure-stamp configure-stamp: dh_testdir touch configure-stamp build: build-stamp build-stamp: configure-stamp dh_testdir $(MAKE) CONFIG=Release touch $@ clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp $(MAKE) CONFIG=Release clean dh_clean install: build dh_testdir dh_testroot dh_clean -k dh_installdirs cp $(CURDIR)/bin/premake $(CURDIR)/debian/premake/usr/bin binary-indep: build install binary-arch: build install dh_testdir dh_testroot dh_installchangelogs $(CURDIR)/CHANGES.txt dh_installdocs dh_installman $(CURDIR)/debian/premake.1 dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure premake-3.7.orig/Packages/debian/changelog0000644000000000000000000000045311010065401015434 0ustar premake (3.6-0ubuntu1~dapper1) dapper; urgency=low * Sync to upstream release 3.6 -- Ryan Mulder Wed, 30 Apr 2008 20:54:02 -0400 premake (3.5-0ubuntu1~dapper2) dapper; urgency=low * Initial release -- Ryan Mulder Thu, 17 Apr 2008 20:27:22 -0400 premake-3.7.orig/Packages/debian/premake.10000644000000000000000000000446011010065401015272 0ustar .\" premake man page. .\" Contact rjmyst3@gmail.com to correct errors or omissions. .TH "PREMAKE" "1" "17 April 2008" "Ryan Mulder" "" .SH "NAME" Premake \- A build script generator. .SH "SYNOPSIS" .\" Syntax goes here. .B premake \-\-target .SH "DESCRIPTION" .B premake allows you to manage your project configuration in one place and still support those pesky IDE\-addicted Windows coders and/or cranky Linux command\-line junkies. It allows you to generate project files for tools that you do not own. It saves the time that would otherwise be spent manually keeping several different toolsets in sync. And it provides an easy upgrade path as new versions of your favorite tools are released. .SH "OPTIONS" .TP 8 .B "\-\-file name" Process the specified premake script file. If not specified, "premake.lua" is assumed. .TP 8 .B "\-\-verbose" Generate verbose makefiles (where applicable). .TP 8 .B "\-\-clean" Remove all binaries and build scripts. .TP 8 .B "\-\-cc name" Choose a C/C++ compiler, if supported by target; one of: gcc GNU gcc compiler dmc Digital Mars C/C+ compiler (experimental) .TP 8 .B "\-\-dotnet name" Choose a .NET compiler set, if supported by target; one of: ms Microsoft (csc) mono Mono (mcs) mono2 Mono .NET 2.0 (gmcs) pnet Portable.NET (cscc) .TP 8 .B "\-\-os name" Generate files for different operating system; one of: bsd OpenBSD, NetBSD, or FreeBSD linux Linux macosx MacOS X windows Microsoft Windows .TP 8 .B "\-\-target name" Generate input files for the specified toolset; one of: cb\-gcc Code::Blocks Studio with GCC gnu GNU Makefile for POSIX, MinGW, and Cygwin monodev MonoDevelop sharpdev ICSharpCode SharpDevelop vs6 Microsoft Visual Studio 6 vs2002 Microsoft Visual Studio 2002 vs2003 Microsoft Visual Studio 2003 vs2005 Microsoft Visual Studio 2005 (includes Express editions) vs2008 Microsoft Visual Studio 2008 (experimental) .TP 8 .B "\-\-version" Display version information. .TP 8 .B "\-\-help" Display this information. .SH "EXAMPLES" Generate Makefiles for gcc. .nf premake \-\-target gnu .SH "AUTHORS" .nf Jason Perkins and the Premake Project .fi .SH "HISTORY" 2008 \- Updated for Premake 3.6 premake-3.7.orig/Packages/debian/control0000644000000000000000000000134111007612460015173 0ustar Source: premake Section: contrib/devel Priority: optional Maintainer: Ryan Mulder Build-Depends: debhelper (>= 5) Standards-Version: 3.7.3 Homepage: http://premake.sourceforge.net Package: premake Architecture: any Depends: ${shlibs:Depends} Description: Build Script Generator Premake allows you to manage your project configuration in one place and still support those pesky IDE-addicted Windows coders and/or cranky Linux command-line junkies. It allows you to generate project files for tools that you do not own. It saves the time that would otherwise be spent manually keeping several different toolsets in sync. And it provides an easy upgrade path as new versions of your favorite tools are released. premake-3.7.orig/Tests/0000755000000000000000000000000011065434617011745 5ustar premake-3.7.orig/Tests/MonoDev/0000755000000000000000000000000011065434614013311 5ustar premake-3.7.orig/Tests/MonoDev/Test_Paths.cs0000644000000000000000000000275310446776604015737 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _parser = new MonoDevParser(); } public void Run(params string[] opts) { TestEnvironment.Run(_script, _parser, _expects, opts); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = "."; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "./MySubDir"; Run("--os linux"); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "../PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "."; Run(); } } } premake-3.7.orig/Tests/MonoDev/MonoDevParser.cs0000644000000000000000000001535210501601641016360 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev { public class MonoDevParser : Parser { #region Parser Methods public override string TargetName { get { return "monodev"; } } #endregion #region Solution Parsing public override void Parse(Project project, string filename) { Begin(filename + ".mds"); string[] matches = Regex(""); project.Name = matches[0]; matches = Regex(" "); string active = matches[0]; // Parse configurations while (!Match(" ", true)) { matches = Regex(" "); Configuration config = new Configuration(); config.Name = matches[0]; project.Configuration.Add(matches[0]); int i = 0; while (!Match(" ", true)) { matches = Regex(" "); if (i == project.Package.Count) { Package package = new Package(); package.Name = matches[0]; project.Package.Add(package); } else { if (project.Package[i].Name != matches[0]) throw new FormatException("Package name should be " + project.Package[i] + ", is " + matches[0]); } } } foreach (Package package in project.Package) { foreach (string name in project.Configuration) { Configuration config = new Configuration(); config.Name = name; package.Config.Add(config); } } // Parse startup entries Match(" "); foreach (Package package in project.Package) { Match(" "); } Match(" "); // Parse project entries Match(" "); foreach (Package package in project.Package) { matches = Regex(" "); /* Pull out directory, but keep the path separators intact (no translation) */ package.Path = matches[0].Substring(0, Path.GetDirectoryName(matches[0]).Length); package.ScriptName = Path.GetFileName(matches[0]); } Match(" "); Match(""); foreach (Package package in project.Package) { string pkgfilename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); ParsePackage(project, package, pkgfilename); /* SHARPDEV_DEPENDENCY_BUG: Dependencies are set correctly here! */ #if SHARPDEV_DEPENDENCY_BUG Console.WriteLine(package.Name + ": "); foreach (Configuration config in package.Config) { Console.WriteLine(" " + config.Name + ": " + config.Dependencies.Length); } #endif } } #endregion #region Generic Package Parsing private void ParsePackage(Project project, Package package, string filename) { Begin(filename); string[] matches; matches = Regex(""); package.Name = matches[0]; package.Language = matches[1].ToLower(); Match(" "); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); Match(" "); matches = Regex(" "); config.BinDir = matches[0]; config.OutDir = matches[0]; config.Target = matches[1]; matches = Regex(" "); if (matches[0] == "False") buildFlags.Add("no-symbols"); switch (matches[1]) { case "Exe": config.Kind = "exe"; break; case "WinExe": config.Kind = "winexe"; break; case "Library": config.Kind = "dll"; break; } matches = Regex(" "); if (matches[0] == "False") buildFlags.Add("fatal-warnings"); matches = Regex(" "); package.Compiler = "Csc"; if (matches[0] == "True") buildFlags.Add("optimize"); if (matches[1] == "True") buildFlags.Add("unsafe"); Match(" "); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); config.Defines = (matches[3] != "") ? matches[3].Split(';') : new string[] { }; } Match(" "); Match(" "); Match(" "); Match(" "); Match(" "); Hashtable folders = new Hashtable(); folders.Add(".", true); while (!Match(" ", true)) { matches = Regex(" "); if (matches[1] == "Directory") { if (matches[2] != "Compile") throw new FormatException("Buildaction of folders must be Compile"); folders.Add(matches[0], true); } else if (matches[1] == "Code") { if (matches[2] == "EmbedAsResource") matches[2] = "EmbeddedResource"; /* Get path without translating directory separators to \ */ string path = matches[0].Substring(0, Path.GetDirectoryName(matches[0]).Length); if (folders[path] == null) throw new FormatException("Missing directory entry in file block for '" + path + "'"); package.File.Add(matches[0], matches[1], matches[2], null); } else { throw new FormatException("Unrecognized file subtype '" + matches[1] + "'"); } } ArrayList links = new ArrayList(); ArrayList lddep = new ArrayList(); if (!Match(" ", true)) { Match(" "); while (!Match(" ", true)) { matches = Regex(" "); links.Add(matches[2]); if (matches[0] == "Project") lddep.Add(matches[2]); } } foreach (Configuration config in package.Config) { config.Links = (string[])links.ToArray(typeof(string)); config.Dependencies = (string[])lddep.ToArray(typeof(string)); } Match(""); } #endregion } }premake-3.7.orig/Tests/MonoDev/Test_Packages.cs0000644000000000000000000000140010500347152016341 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_Cs() { _expects.Package[0].Language = "c#"; Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/0000755000000000000000000000000011065434614013656 5ustar premake-3.7.orig/Tests/MonoDev/Cs/Test_Files.cs0000644000000000000000000000246110446776604016263 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cs','file2.cs'"); _expects.Package[0].File.Add("./file1.cs"); _expects.Package[0].File.Add("./file2.cs"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("./Src/file1.cs"); _expects.Package[0].File.Add("./Src/Base/file2.cs"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cs','../Help/file2.cs'"); _expects.Package[0].File.Add("./Src/file1.cs"); _expects.Package[0].File.Add("../Help/file2.cs"); Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/Test_Target.cs0000644000000000000000000000317710446776604016454 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run(); } [Test] public void Test_SetOnPackageConfig() { /* Config specific target not supported for C# */ _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage-d"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/Test_BuildActions.cs0000644000000000000000000000411410501601641017552 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_BuildActions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultCodeAction() { _script.Replace("'somefile.txt'", "'file0.cs'"); _expects.Package[0].File.Add("./file0.cs", "Code", "Compile"); Run(); } [Test] public void Test_DefaultBuildAction() { _expects.Package[0].File.Add("./somefile.txt", "Nothing"); Run(); } /* MonoDevelop doesn't support the "Content" build action */ #if UNSUPPORTED [Test] public void Test_CodeAsContent() { _script.Replace("'somefile.txt'", "'file0.cs','file1.cs'"); _script.Append("package.config['file1.cs'].buildaction = 'Content'"); _expects.Package[0].File.Add("./file0.cs", "Compile"); _expects.Package[0].File.Add("./file1.cs", "Content"); Run(); } #endif [Test] public void Test_ResxAction() { _script.Replace("'somefile.txt'", "'file0.resx'"); _expects.Package[0].File.Add("./file0.resx", null, "EmbeddedResource"); Run(); } [Test] public void Test_ResxWithDependencyAction() { // MonoDevelop doesn't provide file dependencies, as far as I can tell _script.Replace("'somefile.txt'", "'file0.resx','file0.cs'"); _expects.Package[0].File.Add("./file0.resx", null, "EmbeddedResource"); _expects.Package[0].File.Add("./file0.cs"); Run(); } [Test] public void Test_CustomBuildAction() { _script.Append("package.config['somefile.txt'].buildaction = 'EmbeddedResource'"); _expects.Package[0].File.Add("./somefile.txt", "EmbeddedResource"); Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/Test_Dependencies.cs0000644000000000000000000000316210501634103017561 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #if FAILING [Test] public void Test_ExeAndDll() { /* This test is failing, but I can't figure out why. At the end of * MonoDevParser.Parse() the dependencies are set correctly, but * when that method exits back to TestEnvironment.Run() they have * disappeared, replaced by an empty list! I spent a couple of * hours trying to figure this one out to no avail. If you think * you are up for it, search for SHARPDEV_DEPENDENCY_BUG in * Parser_MonoDev.cs and TestEnvironment.cs. */ _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } #endif } } premake-3.7.orig/Tests/MonoDev/Cs/Test_BuildFlags.cs0000644000000000000000000000471110501601641017211 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'unsafe' }"); _script.Append("package.config['Release'].buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "fatal-warnings" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/Test_Links.cs0000644000000000000000000000340210446776604016275 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.dll", "lib2.dll" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.dll", "lib2.dll" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.dll" }; _expects.Package[0].Config[1].Links = new string[] { "lib1-d.dll" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.dll", "liba-d.dll" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.dll", "liba-d.dll" }; Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/Test_Defines.cs0000644000000000000000000000352610446776604016601 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/MonoDev/Cs/Test_OutputDirs.cs0000644000000000000000000000252010446776604017337 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/MonoDev/Cs/Test_Kinds.cs0000644000000000000000000000221010446776604016261 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.MonoDev.Cs { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new MonoDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/SharpDev/0000755000000000000000000000000011065434615013457 5ustar premake-3.7.orig/Tests/SharpDev/SharpDevParser.cs0000644000000000000000000001523110446776604016712 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev { public class SharpDevParser : Parser { #region Parser Methods public override string TargetName { get { return "sharpdev"; } } #endregion #region Combine Parsing public override void Parse(Project project, string filename) { Begin(filename + ".cmbx"); string[] matches = Regex(""); project.Name = matches[1]; matches = Regex(" "); while (!Match(" ", true)) { matches = Regex(" "); Package package = new Package(); package.Name = matches[0]; project.Package.Add(package); } Match(" "); foreach (Package package in project.Package) { matches = Regex(" "); /* Pull out directory, but keep the path separators intact (no translation) */ package.Path = matches[0].Substring(0, Path.GetDirectoryName(matches[0]).Length); package.ScriptName = Path.GetFileName(matches[0]); } Match(" "); matches = Regex(" "); string active = matches[0]; while (!Match(" ", true)) { matches = Regex(" "); Configuration config = new Configuration(); config.Name = matches[0]; project.Configuration.Add(matches[0]); foreach (Package package in project.Package) { package.Config.Add(config); Match(" "); } Match(" "); } if (active != (string)project.Configuration[0]) throw new FormatException("Active configuration should be '" + project.Configuration[0] + "' but is '" + active + "'"); Match(""); foreach (Package package in project.Package) { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); ParsePackage(project, package, filename); /* SHARPDEV_DEPENDENCY_BUG: Dependencies are set correctly here! */ #if SHARPDEV_DEPENDENCY_BUG Console.WriteLine(package.Name + ": "); foreach (Configuration config in package.Config) { Console.WriteLine(" " + config.Name + ": " + config.Dependencies.Length); } #endif } } #endregion #region Generic Package Parsing private void ParsePackage(Project project, Package package, string filename) { Begin(filename); string[] matches = Regex(""); package.Name = matches[0]; package.Language = matches[3].ToLower(); if (package.Name != matches[1]) throw new FormatException("Namespace should be '" + package.Name + "' but is '" + matches[1] + "'"); Match(" "); Hashtable folders = new Hashtable(); folders.Add(".", true); while (!Match(" ", true)) { matches = Regex(" "); if (matches[1] == "Directory") { if (matches[2] != "Compile") throw new FormatException("Buildaction of folders must be Compile"); folders.Add(matches[0].Replace("/", "\\"), true); } else if (matches[1] == "Code") { if (matches[2] == "EmbedAsResource") matches[2] = "EmbeddedResource"; string path = Path.GetDirectoryName(matches[0]); if (folders[path] == null) throw new FormatException("Missing directory entry in file block for '" + path + "'"); package.File.Add(matches[0], matches[1], matches[2], matches[3]); } else { throw new FormatException("Unrecognized file subtype '" + matches[1] + "'"); } } ArrayList links = new ArrayList(); ArrayList lddep = new ArrayList(); if (!Match(" ", true)) { Match(" "); while (!Match(" ", true)) { matches = Regex(" "); links.Add(matches[1]); if (matches[0] == "Project") lddep.Add(matches[1]); } } foreach (Configuration config in package.Config) { config.Links = (string[])links.ToArray(typeof(string)); config.Dependencies = (string[])lddep.ToArray(typeof(string)); } Match(" "); Match(" "); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); matches = Regex(" "); if (matches[0] == "False") buildFlags.Add("fatal-warnings"); matches = Regex(" "); package.Compiler = matches[1]; switch (matches[9]) { case "Exe": config.Kind = "exe"; break; case "WinExe": config.Kind = "winexe"; break; case "Library": config.Kind = "dll"; break; } if (matches[4] == "False") buildFlags.Add("no-symbols"); if (matches[5] == "True") buildFlags.Add("optimize"); if (matches[6] == "True") buildFlags.Add("unsafe"); config.Defines = (matches[10] != "") ? matches[10].Split(';') : new string[]{}; Match(" "); matches = Regex(" "); config.BinDir = matches[0]; config.OutDir = matches[0]; config.Target = matches[1]; Match(" "); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match(" "); Match(""); } #endregion } }premake-3.7.orig/Tests/SharpDev/Test_Paths.cs0000644000000000000000000000271510446776604016102 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = "."; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "./MySubDir"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "../PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "."; Run(); } } } premake-3.7.orig/Tests/SharpDev/Test_Packages.cs0000644000000000000000000000140010446776604016527 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_Cs() { _expects.Package[0].Language = "c#"; Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/0000755000000000000000000000000011065434615014024 5ustar premake-3.7.orig/Tests/SharpDev/Cs/Test_Files.cs0000644000000000000000000000246310446776604016432 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cs','file2.cs'"); _expects.Package[0].File.Add("./file1.cs"); _expects.Package[0].File.Add("./file2.cs"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("./Src/file1.cs"); _expects.Package[0].File.Add("./Src/Base/file2.cs"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cs','../Help/file2.cs'"); _expects.Package[0].File.Add("./Src/file1.cs"); _expects.Package[0].File.Add("../Help/file2.cs"); Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/Test_Target.cs0000644000000000000000000000320110446776604016605 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run(); } [Test] public void Test_SetOnPackageConfig() { /* Config specific target not supported for C# */ _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage-d"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/Test_BuildActions.cs0000644000000000000000000000401410446776604017742 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_BuildActions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultCodeAction() { _script.Replace("'somefile.txt'", "'file0.cs'"); _expects.Package[0].File.Add("./file0.cs", "Code", "Compile"); Run(); } [Test] public void Test_DefaultBuildAction() { _expects.Package[0].File.Add("./somefile.txt", "Nothing"); Run(); } /* #dev doesn't support the "Content" build action */ #if UNSUPPORTED [Test] public void Test_CodeAsContent() { _script.Replace("'somefile.txt'", "'file0.cs','file1.cs'"); _script.Append("package.config['file1.cs'].buildaction = 'Content'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); _expects.Package[0].File.Add("file1.cs", "Content"); Run(); } #endif [Test] public void Test_ResxAction() { _script.Replace("'somefile.txt'", "'file0.resx'"); _expects.Package[0].File.Add("./file0.resx", null, "EmbeddedResource"); Run(); } [Test] public void Test_ResxWithDependencyAction() { _script.Replace("'somefile.txt'", "'file0.resx','file0.cs'"); _expects.Package[0].File.Add("./file0.resx", null, "EmbeddedResource", "file0.cs"); _expects.Package[0].File.Add("./file0.cs"); Run(); } [Test] public void Test_CustomBuildAction() { _script.Append("package.config['somefile.txt'].buildaction = 'EmbeddedResource'"); _expects.Package[0].File.Add("./somefile.txt", "EmbeddedResource"); Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/Test_Dependencies.cs0000644000000000000000000000316610446776604017757 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #if FAILING [Test] public void Test_ExeAndDll() { /* This test is failing, but I can't figure out why. At the end of * SharpDevParser.Parse() the dependencies are set correctly, but * when that method exits back to TestEnvironment.Run() they have * disappeared, replaced by an empty list! I spent a couple of * hours trying to figure this one out to no avail. If you think * you are up for it, search for SHARPDEV_DEPENDENCY_BUG in * Parser_SharpDev.cs and TestEnvironment.cs. */ _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } #endif } } premake-3.7.orig/Tests/SharpDev/Cs/Test_BuildFlags.cs0000644000000000000000000000471310501601641017360 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'unsafe' }"); _script.Append("package.config['Release'].buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "fatal-warnings" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/Test_Links.cs0000644000000000000000000000340410446776604016444 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.dll", "lib2.dll" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.dll", "lib2.dll" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.dll" }; _expects.Package[0].Config[1].Links = new string[] { "lib1-d.dll" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.dll", "liba-d.dll" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.dll", "liba-d.dll" }; Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/Test_Defines.cs0000644000000000000000000000353010446776604016741 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/SharpDev/Cs/Test_OutputDirs.cs0000644000000000000000000000252210446776604017506 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/SharpDev/Cs/Test_Kinds.cs0000644000000000000000000000221210446776604016430 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.SharpDev.Cs { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new SharpDevParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Framework/0000755000000000000000000000000011065434616013701 5ustar premake-3.7.orig/Tests/Framework/Package.cs0000644000000000000000000000311710611151102015543 0ustar using System; using System.Collections; namespace Premake.Tests.Framework { public class Package { public string Name; public string ID; public string Kind; public string Path; public string Language; public string ScriptName; public string Compiler; public string DefFile; public ConfigCollection Config; public FileCollection File; public ArrayList CopyLocal; public string HasAppConfigRule; public Package() { Config = new ConfigCollection(); File = new FileCollection(); } public Package(Project project) : this() { Config.Add(project); } public void CompareTo(Package actual) { Test(this.Name, actual.Name, "Package name"); Test(this.ID, actual.ID, "Package ID"); Test(this.Kind, actual.Kind, "Package kind"); Test(this.Path, actual.Path, "Package path"); Test(this.Language, actual.Language, "Package language"); Test(this.ScriptName, actual.ScriptName, "Package script name"); Test(this.Compiler, actual.Compiler, "Package compiler"); Test(this.DefFile, actual.DefFile, "Exports .def file"); Test(this.HasAppConfigRule, actual.HasAppConfigRule, "App.config build rule"); this.Config.CompareTo(actual.Config); this.File.CompareTo(actual.File); } private void Test(string expected, string actual, string description) { if (expected != null && expected.CompareTo(actual) != 0) throw new FormatException(description + " should be '" + expected + "' but is '" + actual + "'"); } } } premake-3.7.orig/Tests/Framework/TestEnvironment.cs0000644000000000000000000000667010446776604017415 0ustar using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Text.RegularExpressions; namespace Premake.Tests.Framework { public class TestEnvironment { private static ArrayList _files; private static Hashtable _scripts; public static string Errors; public static string Output; static TestEnvironment() { _files = new ArrayList(); _scripts = new Hashtable(); } public static void AddFile(string filename) { _files.Add(filename); } public static void AddScript(Script script) { _scripts["premake.lua"] = script; } public static void Run(Script script, Parser parser, Project expected, string[] options) { /* Remember where Premake is located */ string executable = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "premake"; /* Create a temporary directory for this run */ string temp = Path.GetTempPath() + Guid.NewGuid().ToString() + Path.DirectorySeparatorChar; Directory.CreateDirectory(temp); Directory.SetCurrentDirectory(temp); /* Create any required files */ foreach (string filename in _files) { string dirname = Path.GetDirectoryName(filename); if (dirname != String.Empty && !Directory.Exists(dirname)) Directory.CreateDirectory(dirname); File.Create(filename).Close(); } try { /* Write out the script */ script.WriteFile("premake.lua"); /* Run premake */ string args = (options != null) ? String.Join(" ", options) : String.Empty; Process process = new Process(); process.StartInfo.FileName = executable; process.StartInfo.Arguments = args + " --target " + parser.TargetName; process.StartInfo.CreateNoWindow = true; process.StartInfo.WorkingDirectory = Directory.GetCurrentDirectory(); process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.UseShellExecute = false; process.Start(); process.WaitForExit(); Errors = process.StandardError.ReadToEnd(); Output = process.StandardOutput.ReadToEnd(); if (process.ExitCode != 0) { string message = (Errors != String.Empty) ? Errors : Output; throw new InvalidOperationException("Premake aborted with code " + process.ExitCode + ": \n" + message); } /* Start building the results right here */ Project actual = new Project(); /* Locate the name of the just-written project file */ MatchCollection matches = Regex.Matches(script.ToString(), "project.name = '(.+)'"); actual.Name = matches[0].Groups[1].ToString(); matches = Regex.Matches(script.ToString(), "project.path = '(.+)'"); actual.Path = (matches.Count > 0) ? matches[0].Groups[1].ToString() : ""; /* Parse the results */ parser.Parse(actual, Path.Combine(actual.Path, actual.Name)); /* SHARPDEV_DEPENDENCY_BUG: Dependencies have disappeared! */ #if SHARPDEV_DEPENDENCY_BUG foreach (Package p in actual.Package) { Console.WriteLine(p.Name + ":"); foreach (Configuration config in p.Config) { Console.WriteLine(" " + config.Name + ": " + config.Dependencies.Length); } } #endif expected.CompareTo(actual); } finally { Directory.SetCurrentDirectory(Path.GetDirectoryName(executable)); Directory.Delete(temp, true); _files.Clear(); _scripts.Clear(); } } } } premake-3.7.orig/Tests/Framework/FileCollection.cs0000644000000000000000000000376510446776604017146 0ustar using System; using System.Collections; using System.Text; namespace Premake.Tests.Framework { public class FileCollection : CollectionBase { public void Add(SourceFile file) { List.Add(file); } public void Add(string filename) { Add(filename, null, null, null); } public void Add(string filename, string buildaction) { Add(filename, null, buildaction, null); } public void Add(string filename, string subtype, string buildaction) { Add(filename, subtype, buildaction, null); } public void Add(string filename, string subtype, string buildaction, string depends) { SourceFile file = new SourceFile(); file.Name = filename; file.Subtype = subtype; file.BuildAction = buildaction; file.DependsOn = depends; List.Add(file); } public void Add(int count) { for (int i = 0; i < count; ++i) List.Add(new SourceFile()); } public SourceFile this[int index] { get { return (SourceFile)List[index]; } set { List[index] = value; } } public void CompareTo(FileCollection actual) { if (this.Count == 0) return; if (this.Count != actual.Count) { string files = BuildFileList(actual); throw new FormatException("Expected " + this.Count + " files but got " + actual.Count + ":\n" + files); } Hashtable index = new Hashtable(); foreach (SourceFile file in actual) index[file.Name] = file; foreach (SourceFile efile in this.List) { SourceFile afile = (SourceFile)index[efile.Name]; if (afile == null) { string files = BuildFileList(actual); throw new FormatException("Expected file '" + efile.Name + "' not found in file list:\n" + files); } efile.CompareTo(afile); } } private string BuildFileList(FileCollection files) { StringBuilder result = new StringBuilder(); foreach (SourceFile file in files) result.Append(file.Name + "\n"); return result.ToString(); } } } premake-3.7.orig/Tests/Framework/ConfigCollection.cs0000644000000000000000000000173310446776604017465 0ustar using System; using System.Collections; namespace Premake.Tests.Framework { public class ConfigCollection : CollectionBase { public void Add(Configuration config) { List.Add(config); } public void Add(int count) { for (int i = 0; i < count; ++i) List.Add(new Configuration()); } public void Add(Project project) { foreach (string name in project.Configuration) { Configuration config = new Configuration(); config.Name = name; List.Add(config); } } public Configuration this[int index] { get { return (Configuration)List[index]; } set { List[index] = value; } } public void CompareTo(ConfigCollection actual) { if (this.Count == 0) return; if (this.Count != actual.Count) throw new FormatException("Expected " + this.Count + " configurations but got " + actual.Count); for (int i = 0; i < this.Count; ++i) this[i].CompareTo(actual[i]); } } } premake-3.7.orig/Tests/Framework/Parser.cs0000644000000000000000000000404110446776604015473 0ustar using System; using System.IO; namespace Premake.Tests.Framework { public abstract class Parser { private string[] _lines; private int _currentLine; public void Begin(string filename) { StreamReader reader = new StreamReader(filename); string text = reader.ReadToEnd(); reader.Close(); text = text.Replace("\r\n", "\n"); _lines = text.Split('\n'); _currentLine = 0; } public bool Expect(string actual, params string[] expected) { foreach (string value in expected) { if (actual == value) return true; } throw new FormatException("Unexpected value '" + actual + "'"); } public string GetLine() { return _lines[_currentLine++]; } public bool Match(string expected) { return this.Match(expected, false); } public bool Match(string expected, bool optional) { string line = _lines[_currentLine]; if (expected.CompareTo(line) != 0) { if (optional) return false; else throw new FormatException("I expected:\n" + expected + "\nBut I got:\n" + line); } _currentLine++; return true; } public string[] Regex(string expected) { return this.Regex(expected, false); } public string[] Regex(string expected, bool optional) { string line = _lines[_currentLine]; System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(line, expected, System.Text.RegularExpressions.RegexOptions.None); if (!match.Success) { if (optional) return null; else throw new FormatException("I expected this pattern:\n" + System.Text.RegularExpressions.Regex.Unescape(expected) + "\nBut I got:\n" + line); } _currentLine++; string[] results = new string[match.Groups.Count - 1]; for (int i = 0; i < match.Groups.Count - 1; ++i) results[i] = match.Groups[i + 1].ToString(); return results; } public abstract string TargetName { get; } public abstract void Parse(Project project, string filename); } } premake-3.7.orig/Tests/Framework/File.cs0000644000000000000000000000140110446776604015113 0ustar using System; namespace Premake.Tests.Framework { public class SourceFile { public string Name; public string Subtype; public string BuildAction; public string DependsOn; public void CompareTo(SourceFile actual) { Test(this.Name, actual.Name, "Name"); Test(this.Subtype, actual.Subtype, "Subtype"); Test(this.BuildAction, actual.BuildAction, "Build action"); Test(this.DependsOn, actual.DependsOn, "Dependency"); } private void Test(string expected, string actual, string description) { if (expected != null && expected.CompareTo(actual) != 0) throw new FormatException(description + " on '" + this.Name + "' should be '" + expected + "' but is '" + actual + "'"); } } } premake-3.7.orig/Tests/Framework/Script.cs0000644000000000000000000000232410446776604015505 0ustar using System; using System.IO; using System.Text; namespace Premake.Tests.Framework { public class Script { private StringBuilder _text; public Script() { _text = new StringBuilder(); } public static Script MakeBasic(string kind, string lang) { Script script = new Script(); script.Append(" project.name = 'MyProject' "); script.Append(" package.name = 'MyPackage' "); script.Append(" package.kind = '"+kind+"' "); script.Append(" package.language = '"+lang+"' "); script.Append(" package.files = { 'somefile.txt' }"); return script; } public void Append(string line) { _text.Append(line); _text.Append("\n"); } public void Replace(string pattern, string replacement) { _text.Replace(pattern, replacement); } public void WriteFile(string filename) { string path = Path.GetDirectoryName(filename); if (path != String.Empty) System.IO.Directory.CreateDirectory(path); System.IO.StreamWriter writer = new System.IO.StreamWriter(filename); writer.Write(_text.ToString()); writer.Close(); } public override string ToString() { return _text.ToString(); } } } premake-3.7.orig/Tests/Framework/Configuration.cs0000644000000000000000000000721110631571250017032 0ustar using System; using System.Collections; using System.Text; namespace Premake.Tests.Framework { public class Configuration { public string Name; public string BinDir; public string LibDir; public string ObjDir; public string OutDir; public string Target; public string OutFile; public string Kind; public string Pch; public string[] IncludePaths; public string[] Defines; public string[] LibPaths; public string[] Links; public string[] BuildFlags; public string BuildOptions; public string[] LinkFlags; public string LinkOptions; public string[] Dependencies; public string[] LinkDeps; public string ImportLib; public string PchHeader; public string PchSource; public string[] ResDefines; public string[] ResPaths; public string ResOptions; public Configuration() { } public void CompareTo(Configuration actual) { Test(this.Name, actual.Name, "Configuration name"); Test(this.BinDir, actual.BinDir, "BinDir"); Test(this.LibDir, actual.LibDir, "LibDir"); Test(this.ObjDir, actual.ObjDir, "ObjDir"); Test(this.OutDir, actual.OutDir, "Output directory"); Test(this.Target, actual.Target, "Target"); Test(this.OutFile, actual.OutFile, "Output file"); Test(this.Kind, actual.Kind, "Kind"); Test(this.BuildOptions, actual.BuildOptions, "Build options"); Test(this.LinkOptions, actual.LinkOptions, "Link options"); Test(this.ImportLib, actual.ImportLib, "Import library"); Test(this.PchHeader, actual.PchHeader, "PCH Header"); Test(this.PchSource, actual.PchSource, "PCH Source"); Test(this.ResOptions, actual.ResOptions, "Resource options"); Test(this.Pch, actual.Pch, "Precompiled headers"); TestList(this.IncludePaths, actual.IncludePaths, "Include paths"); TestList(this.Defines, actual.Defines, "Defined symbols"); TestList(this.LibPaths, actual.LibPaths, "Lib paths"); TestList(this.Links, actual.Links, "Links"); TestList(this.BuildFlags, actual.BuildFlags, "Build flags"); TestList(this.LinkFlags, actual.LinkFlags, "Link flags"); TestList(this.Dependencies, actual.Dependencies, "Dependencies"); TestList(this.LinkDeps, actual.LinkDeps, "Linker dependencies"); TestList(this.ResDefines, actual.ResDefines, "Resource defines"); TestList(this.ResPaths, actual.ResPaths, "Resource paths"); } private void Test(string expected, string actual, string description) { if (expected != null && expected.CompareTo(actual) != 0) throw new FormatException(description + " should be '" + expected + "' but is '" + actual + "'"); } private void TestList(string[] expected, string[] actual, string description) { if (expected == null || (expected.Length == 0 && actual == null)) return; if (expected.Length != actual.Length) { throw new FormatException(description + " list should contain " + expected.Length + " items but has " + actual.Length + ". List follows:\n" + BuildListString(actual)); } foreach (string item in expected) { if (Array.IndexOf(actual, item) < 0) { throw new FormatException(description + " list missing item '" + item + "'. List follows:\n" + BuildListString(actual)); } } } private string BuildListString(string[] list) { StringBuilder msg = new StringBuilder(); foreach (string s in list) msg.Append(s + "\n"); return msg.ToString(); } } } premake-3.7.orig/Tests/Framework/PackageCollection.cs0000644000000000000000000000131110446776604017603 0ustar using System; using System.Collections; namespace Premake.Tests.Framework { public class PackageCollection : CollectionBase { public void Add(Package package) { List.Add(package); } public void Add(int count) { for (int i = 0; i < count; ++i) List.Add(new Package()); } public Package this[int index] { get { return (Package)List[index]; } set { List[index] = value; } } public void CompareTo(PackageCollection actual) { if (this.Count != actual.Count) throw new FormatException("Expected " + this.Count + " packages but got " + actual.Count); for (int i = 0; i < this.Count; ++i) this[i].CompareTo(actual[i]); } } } premake-3.7.orig/Tests/Framework/Project.cs0000644000000000000000000000156510446776604015655 0ustar using System; using System.Collections; namespace Premake.Tests.Framework { public class Project { public string ID; public string Name; public string Path; public ArrayList Configuration; public PackageCollection Package; public Project() { Configuration = new ArrayList(); Package = new PackageCollection(); } public void CompareTo(Project actual) { Test(this.ID, actual.ID, "Project ID"); Test(this.Name, actual.Name, "Project name"); Test(this.Path, actual.Path, "Project path"); this.Package.CompareTo(actual.Package); } private void Test(string expected, string actual, string description) { if (expected != null && expected.CompareTo(actual) != 0) throw new FormatException(description + " should be '" + expected + "' but is '" + actual + "'"); } } } premake-3.7.orig/Tests/Vs2003/0000755000000000000000000000000011065434617012642 5ustar premake-3.7.orig/Tests/Vs2003/Test_Paths.cs0000644000000000000000000000271110446776604015257 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003 { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = "."; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "MySubDir"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "..\\PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "."; Run(); } } } premake-3.7.orig/Tests/Vs2003/Test_Packages.cs0000644000000000000000000000235510644513216015706 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003 { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_C() { _script.Replace("c++", "c"); _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cpp() { _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cs() { _script.Replace("c++", "c#"); _expects.Package[0].Language = "c#"; Run(); } [Test] public void CanSetProjectGuidWithoutBrackets() { _script.Append("package.guid = 'A5F26200-7A60-4726-AB0D-5D4D5B82B939'"); _expects.Package[0].ID = "A5F26200-7A60-4726-AB0D-5D4D5B82B939"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/0000755000000000000000000000000011065434617013364 5ustar premake-3.7.orig/Tests/Vs2003/Cpp/Test_Files.cs0000644000000000000000000000321110446776604015760 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cpp','file2.cpp'"); _expects.Package[0].File.Add(".\\file1.cpp"); _expects.Package[0].File.Add(".\\file2.cpp"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','Src/Base/file2.cpp'"); _expects.Package[0].File.Add(".\\Src\\file1.cpp"); _expects.Package[0].File.Add(".\\Src\\Base\\file2.cpp"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','../Help/file2.cpp'"); _expects.Package[0].File.Add(".\\Src\\file1.cpp"); _expects.Package[0].File.Add("..\\Help\\file2.cpp"); Run(); } [Test] public void Test_DefFile() { _script.Replace("'exe'", "'dll'"); _script.Replace("'somefile.txt'", "'file0.cpp','exports.def'"); _expects.Package[0].File.Add(".\\file0.cpp"); _expects.Package[0].File.Add(".\\exports.def"); _expects.Package[0].DefFile = "exports.def"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_ImportLib.cs0000644000000000000000000000222510446776604016623 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_ImportLib { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("dll", "c++"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_WithImportLib() { _expects.Package[0].Config[0].ImportLib = "lib/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "lib/MyPackage.lib"; Run(); } [Test] public void Test_NoImportLib() { _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].ImportLib = "obj/Debug/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "obj/Release/MyPackage.lib"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Pch.cs0000644000000000000000000000377610631571250015432 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Pch { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void PchDefaultsToAuto() { _expects.Package[0].Config[0].Pch = "auto"; _expects.Package[0].Config[1].Pch = "auto"; Run(); } [Test] public void NoPchTurnsItOff() { _script.Append("package.buildflags = {'no-pch'}"); _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } [Test] public void PchOnWhenPchHeaderIsSet() { _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].Pch = "on"; _expects.Package[0].Config[1].Pch = "on"; Run(); } [Test] public void PchHeaderIsSet() { _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].PchHeader = "stdafx.h"; _expects.Package[0].Config[1].PchHeader = "stdafx.h"; Run(); } [Test] public void PchSourceIsSet() { _script.Replace("'somefile.txt'", "'stdafx.cpp'"); _script.Append("package.pchheader = 'stdafx.h'"); _script.Append("package.pchsource = 'stdafx.cpp'"); _expects.Package[0].Config[0].PchSource = "stdafx.cpp"; _expects.Package[0].Config[1].PchSource = "stdafx.cpp"; Run(); } [Test] public void PchOffWithFlagAndHeader() { _script.Append("package.buildflags = {'no-pch'}"); _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Target.cs0000644000000000000000000000533210524433425016136 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp.exe"; _expects.Package[0].Config[1].Target = "MyApp.exe"; Run(); } [Test] public void Test_SetOnPackageConfig() { _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void TargetAppliedToImportLib() { _script.Replace("'exe'", "'dll'"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "bin/MyApp"; _expects.Package[0].Config[0].ImportLib = "lib/MyApp/MyPackage.lib"; _expects.Package[0].Config[1].OutDir = "bin/MyApp"; _expects.Package[0].Config[1].ImportLib = "lib/MyApp/MyPackage.lib"; Run(); } #endregion #region Custom Target Tests [Test] public void Test_CustomTarget() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.zmf"; Run(); } [Test] public void Test_CustomTarget_SetOnConfig() { _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_IncludePaths.cs0000644000000000000000000000373210446776604017311 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_IncludePaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoIncludePaths() { _expects.Package[0].Config[0].IncludePaths = new string[] { }; _expects.Package[0].Config[1].IncludePaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.includepaths = { '../src', '../include' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.includepaths = { '../package' }"); _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Dependencies.cs0000644000000000000000000000322710446776604017313 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } [Test] public void Test_ExeAndLib() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_BuildFlags.cs0000644000000000000000000001714610570623520016730 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _script.Append("package.config['Release'].buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "no-exceptions" }; Run(); } [Test] public void Test_ExtraWarnings() { _script.Append("package.buildflags = { 'extra-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "extra-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "extra-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_No64BitChecks() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoExceptions() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoFramePointer() { _script.Append("package.buildflags = { 'no-frame-pointer' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-frame-pointer" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-frame-pointer", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoImportLib() { _script.Replace("exe", "dll"); _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-import-lib" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-import-lib", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoMain() { _script.Append("package.buildflags = { 'no-main' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-main" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-main", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoRtti() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSize() { _script.Append("package.buildflags = { 'optimize-size' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-size", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-size", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSpeed() { _script.Append("package.buildflags = { 'optimize-speed' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-speed", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-speed", "no-symbols" }; Run(); } [Test] public void OptimizeReleaseBuildWithSymbols() { _script.Append("package.buildflags = { 'optimize' }"); _script.Append("package.config['Release'].buildflags = { 'no-edit-and-continue' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; Run(); } [Test] public void Test_SehExceptions_Ignored() { _script.Append("package.buildflags = { 'seh-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_StaticRuntime() { _script.Append("package.buildflags = { 'static-runtime' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "static-runtime" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "static-runtime", "optimize", "no-symbols" }; } [Test] public void Test_Unicode() { _script.Append("package.buildflags = { 'unicode' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unicode" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unicode", "optimize", "no-symbols" }; Run(); } [Test] public void NativeWChar() { _script.Append("package.buildflags = { 'native-wchar' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "native-wchar" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "native-wchar", "optimize", "no-symbols" }; Run(); } [Test] public void NoNativeWChar() { _script.Append("package.buildflags = { 'no-native-wchar' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-native-wchar" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-native-wchar", "optimize", "no-symbols" }; Run(); } [Test] public void NoManifest() { _script.Append("package.buildflags = { 'no-manifest' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-manifest" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-manifest", "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_BuildOptions.cs0000644000000000000000000000301410462427663017326 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_BuildOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.buildoptions = { 'pkgopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].buildoptions = { 'dbgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "dbgopt"; _expects.Package[0].Config[1].BuildOptions = "relopt"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.buildoptions = { 'pkgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt relopt"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Links.cs0000644000000000000000000000322610446776604016004 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.lib", "lib2.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib", "lib2.lib" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.lib", "liba-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.lib", "liba.lib" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Defines.cs0000644000000000000000000000363010446776604016300 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT=__declspec(dllexport)' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_OutputDirs.cs0000644000000000000000000000502410446776604017044 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion #region LibDir Tests [Test] public void Test_LibDir_Default() { _expects.Package[0].Config[0].LibDir = "."; _expects.Package[0].Config[1].LibDir = "."; Run(); } [Test] public void Test_LibDir_SetAtProject() { _script.Append("project.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } [Test] public void Test_LibDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].libdir = 'lib/Debug'"); _script.Append("project.config['Release'].libdir = 'lib/Release'"); _expects.Package[0].Config[0].LibDir = "lib/Debug"; _expects.Package[0].Config[1].LibDir = "lib/Release"; Run(); } #endregion #region ObjDir Tests [Test] public void Test_ObjDir_Default() { _expects.Package[0].Config[0].ObjDir = "obj/Debug"; _expects.Package[0].Config[1].ObjDir = "obj/Release"; Run(); } [Test] public void Test_ObjDir_SetAtPackage() { _script.Append("package.objdir = 'temp'"); _expects.Package[0].Config[0].ObjDir = "temp/Debug"; _expects.Package[0].Config[1].ObjDir = "temp/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Resources.cs0000644000000000000000000000524610526373152016670 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Resources { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_UsesIncludePaths() { _script.Append("package.includepaths = { 'include' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include" }; Run(); } [Test] public void Test_UsesResourcePaths() { _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "resources" }; Run(); } [Test] public void Test_MergesIncludeAndResourcePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include", "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include", "resources" }; Run(); } [Test] public void Test_UsesDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE" }; Run(); } [Test] public void Test_UsesResourceDefines() { _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "RESDEFINE" }; Run(); } [Test] public void Test_UsesDefinesAndResourceDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; Run(); } [Test] public void Test_UsesResourceOptions() { _script.Append("package.resoptions = { 'ABC', 'XYZ' }"); _expects.Package[0].Config[0].ResOptions = "ABC XYZ"; _expects.Package[0].Config[1].ResOptions = "ABC XYZ"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_Kinds.cs0000644000000000000000000000315010446776604015770 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsLib() { _script.Replace("exe", "lib"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "lib"; Run(); } [Test] public void Test_MixedKinds() { _script.Append("package.config['Debug'].kind = 'lib'"); _script.Append("package.config['Release'].kind = 'dll'"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cpp/Test_LibPaths.cs0000644000000000000000000000363210446776604016433 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cpp { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Vs2003Parser.cs0000644000000000000000000005464010631571250015245 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003 { public class Vs2003Parser : Parser { #region Parser Methods public override string TargetName { get { return "vs2003"; } } #endregion #region Solution Parsing public override void Parse(Project project, string filename) { /* File header */ Begin(filename + ".sln"); Match("Microsoft Visual Studio Solution File, Format Version 8.00"); /* Package entries - VS "projects" */ string[] matches; Hashtable packageDependencies = new Hashtable(); do { matches = Regex("Project\\(\"{([0-9A-F-]+)}\"\\) = \"(.+)\", \"(.+)\", \"{([0-9A-F-]+)}\"", true); if (matches != null) { Package package = new Package(); project.Package.Add(package); package.Name = matches[1]; package.ID = matches[3]; package.Path = Path.GetDirectoryName(matches[2]); package.ScriptName = Path.GetFileName(matches[2]); switch (matches[0]) { case "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942": package.Language = "c++"; break; case "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC": package.Language = "c#"; break; } /* Collect package dependencies, I'll sort them out after * I finish parsing the scripts below */ Match("\tProjectSection(ProjectDependencies) = postProject"); ArrayList deps = new ArrayList(); while (!Match("\tEndProjectSection", true)) { matches = Regex("\t\t{([0-9A-F-]+)} = {([0-9A-F-]+)}"); if (matches[0] != matches[1]) throw new FormatException("GUID mismatch in ProjectDependencies block, should be the same"); deps.Add(matches[0]); } packageDependencies[package.ID] = deps; Match("EndProject"); } } while (matches != null); Match("Global"); /* Read the list of configurations */ Match("\tGlobalSection(SolutionConfiguration) = preSolution"); do { matches = Regex("\t\t(.+)[ ]=[ ](.+)", true); if (matches != null) { if (matches[0] != matches[1]) throw new FormatException("Configuration name mismatch: " + matches[0] + " != " + matches[1]); project.Configuration.Add(matches[0]); } } while (matches != null); foreach (Package package in project.Package) package.Config.Add(project); Match("\tEndGlobalSection"); /* Read the list of package configurations */ Match("\tGlobalSection(ProjectConfiguration) = postSolution"); foreach (Package package in project.Package) { string arch = (package.Language == "c++") ? "Win32" : ".NET"; foreach (string config in project.Configuration) { string pattern = "\t\t{" + package.ID + "}." + config + ".ActiveCfg = " + config + "|" + arch; Match(pattern); pattern = "\t\t{" + package.ID + "}." + config + ".Build.0 = " + config + "|" + arch; Match(pattern); } } Match("\tEndGlobalSection"); Match("\tGlobalSection(ExtensibilityGlobals) = postSolution"); Match("\tEndGlobalSection"); Match("\tGlobalSection(ExtensibilityAddIns) = postSolution"); Match("\tEndGlobalSection"); Match("EndGlobal"); foreach (Package package in project.Package) { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); switch (package.Language) { case "c++": ParseCpp(project, package, filename); break; case "c#": ParseCs(project, package, filename); break; default: throw new NotImplementedException("Loading of " + package.Language + " packages not implemented"); } } /* Now sort out the inter-package dependencies */ foreach (Package package in project.Package) { ArrayList deps = (ArrayList)packageDependencies[package.ID]; string[] deplist = new string[deps.Count]; for (int i = 0; i < deps.Count; ++i) { foreach (Package p2 in project.Package) { if (p2.ID == (string)deps[i]) deplist[i] = p2.Name; } } foreach (Configuration config in package.Config) config.Dependencies = deplist; } } #endregion #region C++ Parsing private void ParseCpp(Project project, Package package, string filename) { Begin(filename); Match(""); Match(""); Match("\t"); Match("\t\t"); Match("\t"); Match("\t"); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); Match("\t\t"); if (matches[0] == "1") buildFlags.Add("unicode"); Match("\t\t\t 0) Match("\t\t\t\tStringPooling=\"TRUE\"", true); if (optimization == 0) Match("\t\t\t\tBasicRuntimeChecks=\"3\"", true); if (optimization == 0) matches = Regex("\t\t\t\tRuntimeLibrary=\"(1|3)\""); else matches = Regex("\t\t\t\tRuntimeLibrary=\"(0|2)\""); if (matches[0] == "0" || matches[0] == "1") config.LinkFlags = new string[] { "static-runtime" }; Match("\t\t\t\tEnableFunctionLevelLinking=\"TRUE\""); if (!Match("\t\t\t\tRuntimeTypeInfo=\"TRUE\"", true)) buildFlags.Add("no-rtti"); matches = Regex("\t\t\t\tTreatWChar_tAsBuiltInType=\"(TRUE|FALSE)\"", true); if (matches != null) buildFlags.Add(matches[0] == "TRUE" ? "native-wchar" : "no-native-wchar"); config.Pch = "auto"; matches = Regex("\t\t\t\tUsePrecompiledHeader=\"([0-9])\""); if (matches[0] == "3") { config.Pch = "on"; matches = Regex("\t\t\t\tPrecompiledHeaderThrough=\"(.+?)\""); config.PchHeader = matches[0]; } else if (matches[0] == "0") { config.Pch = "off"; } else if (matches[0] != "2") { throw new FormatException("Expected UsePrecompiledHeader to be 2, got " + matches[0]); } matches = Regex("\t\t\t\tWarningLevel=\"([3-4])\""); if (matches[0] == "4") buildFlags.Add("extra-warnings"); if (Match("\t\t\t\tWarnAsError=\"TRUE\"", true)) buildFlags.Add("fatal-warnings"); matches = Regex("\t\t\t\tDetect64BitPortabilityProblems=\"(TRUE|FALSE)\""); if (matches[0] == "FALSE") buildFlags.Add("no-64bit-checks"); matches = Regex("\t\t\t\tDebugInformationFormat=\"([0-9])\"/>"); if (matches[0] == "0") buildFlags.Add("no-symbols"); else if (matches[0] == "3") buildFlags.Add("no-edit-and-continue"); Match("\t\t\t"); Match("\t\t\t"); config.Target = matches[0]; } else { Match("\t\t\t\tName=\"VCLinkerTool\""); matches = Regex("\t\t\t\tAdditionalDependencies=\"(.+)\"", true); if (matches != null) config.Links = matches[0].Split(' '); if (Match("\t\t\t\tIgnoreImportLibrary=\"TRUE\"", true)) buildFlags.Add("no-import-lib"); matches = Regex("\t\t\t\tOutputFile=\"\\$\\(OutDir\\)/(.+)\""); config.Target = matches[0]; Match("\t\t\t\tLinkIncremental=\"" + (optimization == 0 ? 2 : 1) + "\""); matches = Regex("\t\t\t\tAdditionalLibraryDirectories=\"(.+)\""); matches = matches[0].Split(';'); config.LibDir = matches[0]; if (config.LibDir != config.OutDir) config.BinDir = config.OutDir; config.LibPaths = new string[matches.Length - 1]; for (int i = 0; i < matches.Length - 1; ++i) config.LibPaths[i] = matches[i + 1]; matches = Regex("\t\t\t\tModuleDefinitionFile=\"(.+)\"", true); if (matches != null) package.DefFile = matches[0]; if (Match("\t\t\t\tGenerateManifest=\"FALSE\"", true)) buildFlags.Add("no-manifest"); string expected = buildFlags.Contains("no-symbols") ? "FALSE" : "TRUE"; Match("\t\t\t\tGenerateDebugInformation=\"" + expected + "\""); if (!buildFlags.Contains("no-symbols")) Match("\t\t\t\tProgramDatabaseFile=\"$(OutDir)/" + Path.GetFileNameWithoutExtension(config.Target) + ".pdb\""); matches = Regex("\t\t\t\tSubSystem=\"([0-9])\""); if (config.Kind == "exe" && matches[0] == "2") config.Kind = "winexe"; if (optimization > 0) { Match("\t\t\t\tOptimizeReferences=\"2\""); Match("\t\t\t\tEnableCOMDATFolding=\"2\""); } if (config.Kind == "exe" || config.Kind == "winexe") { if (!Match("\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"", true)) buildFlags.Add("no-main"); } else { matches = Regex("\t\t\t\tImportLibrary=\"(.+)\""); config.ImportLib = matches[0]; } Match("\t\t\t\tTargetMachine=\"1\"/>"); } Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t", true)) { Match("\t\t\t\tName=\"VCResourceCompilerTool\""); matches = Regex("\t\t\t\tAdditionalOptions=\"(.+)\"(.*)", true); config.ResOptions = (matches != null) ? matches[0] : ""; matches = Regex("\t\t\t\tPreprocessorDefinitions=\"(.+)\"(.*)", true); config.ResDefines = (matches != null) ? matches[0].Split(';') : new string[] { }; matches = Regex("\t\t\t\tAdditionalIncludeDirectories=\"(.+)\"(.*)", true); config.ResPaths = (matches != null) ? matches[0].Split(';') : new string[] { }; } Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t"); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("\t"); Match("\t"); Match("\t"); Match("\t"); string indent = "\t"; string folder = ""; while (!Match("\t", true)) { if (Match(indent + "\t"); } else if (Match(indent + "", true)) { indent = indent.Substring(0, indent.Length - 1); folder = Path.GetDirectoryName(folder); } else { Match(indent + "\t"); package.File.Add(matches[0]); /* Make sure file appears in the correct folder */ filename = matches[0]; if (filename.StartsWith(".\\")) filename = filename.Substring(2); while (filename.StartsWith("..\\")) filename = filename.Substring(3); if (Path.GetDirectoryName(filename) != folder) throw new FormatException("File '" + matches[0] + "' is in folder '" + folder + "'"); /* Check for file configuration section */ foreach (Configuration config in package.Config) { if (Match(indent + "\t\t"); Match(indent + "\t\t\t"); Match(indent + "\t\t"); } } Match(indent + "\t"); } } if (indent != "\t") throw new FormatException("Unclosed entity in block"); Match("\t"); Match("\t"); Match(""); } #endregion #region C# Parsing private void ParseCs(Project project, Package package, string filename) { string kind = null; Begin(filename); Match(""); Match("\t"); Match("\t\t"); Match("\t\t\t"); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); config.Target = target; Match("\t\t\t\t"); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("\t\t\t"); ArrayList links = new ArrayList(); ArrayList lddep = new ArrayList(); Match("\t\t\t"); while (!Match("\t\t\t", true)) { Match("\t\t\t\t"); } foreach (Configuration config in package.Config) { config.Kind = kind; config.Links = (string[])links.ToArray(typeof(string)); config.LinkDeps = (string[])lddep.ToArray(typeof(string)); } Match("\t\t"); Match("\t\t"); Match("\t\t\t"); while (!Match("\t\t\t", true)) { Match("\t\t\t\t"); } Match("\t\t"); Match("\t"); Match(""); if (kind != "aspnet") ParseUserFile(project, package, filename); } private void ParseUserFile(Project project, Package package, string filename) { Begin(filename + ".user"); Match(""); Match("\t"); Match("\t\t"); string[] matches = Regex("\t\t\t"); matches = matches[0].Split(';'); string[] libpaths = new string[matches.Length - 1]; /* VS.NET stores reference directories as absolute paths, so I need * to do some ugly trickery here */ string[] bindir = matches[matches.Length - 1].Split('\\'); for (int i = 0; i < matches.Length - 1; ++i) { string[] thisdir = matches[i].Split('\\'); int j = 0; while (j < bindir.Length && j < thisdir.Length && bindir[j] == thisdir[j]) ++j; string path = ""; for (int k = j + 1; k < bindir.Length; ++k) path += "..\\"; for (int k = j; k < thisdir.Length; ++k) path += thisdir[k] + '\\'; libpaths[i] = path.Substring(0, path.Length - 1); libpaths[i] = libpaths[i].Replace("/", "\\"); } foreach (Configuration config in package.Config) { config.LibPaths = libpaths; Match("\t\t\t\t"); } Match("\t\t\t"); Match("\t\t"); Match("\t\t"); Match("\t"); Match(""); } #endregion } } premake-3.7.orig/Tests/Vs2003/Cs/0000755000000000000000000000000011065434617013207 5ustar premake-3.7.orig/Tests/Vs2003/Cs/Test_Files.cs0000644000000000000000000000255510446776604015615 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion /* Note: VS.NET *requires* backslash in source file names */ [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cs','file2.cs'"); _expects.Package[0].File.Add("file1.cs"); _expects.Package[0].File.Add("file2.cs"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("Src\\file1.cs"); _expects.Package[0].File.Add("Src\\Base\\file2.cs"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cs','../Help/file2.cs'"); _expects.Package[0].File.Add("Src\\file1.cs"); _expects.Package[0].File.Add("..\\Help\\file2.cs"); Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_Target.cs0000644000000000000000000000414110446776604015772 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run(); } [Test] public void Test_SetOnPackageConfig() { /* Config specific target not supported for C# */ _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage-d"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_TargetInPackageDir() { _script.Append("package.path = 'MyPackage'"); _script.Append("package.target = package.path .. '/bin/MyTarget'"); _expects.Package[0].Config[0].OutDir = "../MyPackage/bin"; _expects.Package[0].Config[0].Target = "MyTarget"; _expects.Package[0].Config[1].OutDir = "../MyPackage/bin"; _expects.Package[0].Config[1].Target = "MyTarget"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2003/Cs/Test_BuildActions.cs0000644000000000000000000000500210446776604017121 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_BuildActions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultCodeAction() { _script.Replace("'somefile.txt'", "'file0.cs'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); Run(); } [Test] public void Test_CodeAsContent() { _script.Replace("'somefile.txt'", "'file0.cs','file1.cs'"); _script.Append("package.config['file1.cs'].buildaction = 'Content'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); _expects.Package[0].File.Add("file1.cs", "Content"); Run(); } [Test] public void Test_AspxCodeAction() { _script.Replace("'somefile.txt'", "'file0.aspx.cs'"); _expects.Package[0].File.Add("file0.aspx.cs", "aspxcodebehind", "Compile", "file0.aspx"); Run(); } [Test] public void Test_AspxAction() { _script.Replace("'somefile.txt'", "'file0.aspx'"); _expects.Package[0].File.Add("file0.aspx", "form", "Content"); Run(); } [Test] public void Test_AsaxAction() { _script.Replace("'somefile.txt'", "'file0.asax'"); _expects.Package[0].File.Add("file0.asax", "component", "Content"); Run(); } [Test] public void Test_ResxAction() { _script.Replace("'somefile.txt'", "'file0.resx'"); _expects.Package[0].File.Add("file0.resx", null, "EmbeddedResource"); Run(); } [Test] public void Test_ResxWithDependencyAction() { _script.Replace("'somefile.txt'", "'file0.resx','file0.cs'"); _expects.Package[0].File.Add("file0.resx", null, "EmbeddedResource", "file0.cs"); _expects.Package[0].File.Add("file0.cs"); Run(); } [Test] public void Test_DefaultBuildAction() { _expects.Package[0].File.Add("somefile.txt", "None"); Run(); } [Test] public void Test_CustomBuildAction() { _script.Append("package.config['somefile.txt'].buildaction = 'EmbeddedResource'"); _expects.Package[0].File.Add("somefile.txt", "EmbeddedResource"); Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_Dependencies.cs0000644000000000000000000000221310446776604017130 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_BuildFlags.cs0000644000000000000000000000534210446776604016564 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'unsafe' }"); _script.Append("package.config['Release'].buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "fatal-warnings" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Unsafe() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_Links.cs0000644000000000000000000000333010446776604015623 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1", "lib2" }; _expects.Package[0].Config[1].Links = new string[] { "lib1", "lib2" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d" }; _expects.Package[0].Config[1].Links = new string[] { "lib1-d" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib", "liba-d" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib", "liba-d" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_Defines.cs0000644000000000000000000000352410446776604016125 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_OutputDirs.cs0000644000000000000000000000251610446776604016672 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2003/Cs/Test_Kinds.cs0000644000000000000000000000252610446776604015621 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsAspNet() { _script.Replace("exe", "aspnet"); _expects.Package[0].Config[0].Kind = "aspnet"; _expects.Package[0].Config[1].Kind = "aspnet"; Run(); } } } premake-3.7.orig/Tests/Vs2003/Cs/Test_LibPaths.cs0000644000000000000000000000364310446776604016260 0ustar using System; using System.IO; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2003.Cs { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2003Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { 'src', 'include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "src", "include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "src", "include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { /* C# doesn't allow per-config lib paths */ _script.Append("package.config['Debug'].libpaths = { 'debug' }"); _script.Append("package.config['Release'].libpaths = { 'release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "debug" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { 'package' }"); _script.Append("package.config['Debug'].libpaths = { 'debug' }"); _script.Append("package.config['Release'].libpaths = { 'release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "package", "debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "package", "debug" }; Run(); } } } premake-3.7.orig/Tests/Test_FileExists.cs0000644000000000000000000000214710446776604015365 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests { [TestFixture] public class Test_FileExists { #region Setup and Teardown Script _script; Project _expects; Parser _parser; [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Premake.Tests.Gnu.GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void FindExistingFile() { _script.Append("print(fileexists('premake.lua'))"); Run(); string result = TestEnvironment.Output; Assert.IsTrue(result.StartsWith("true"), "Did not find existing file"); } [Test] public void FailOnMissingFIle() { _script.Append("print(fileexists('nosuchfile.lua'))"); Run(); string result = TestEnvironment.Output; Assert.IsTrue(result.StartsWith("false"), "Returned false positive"); } } } premake-3.7.orig/Tests/Gnu/0000755000000000000000000000000011065434615012474 5ustar premake-3.7.orig/Tests/Gnu/Test_Paths.cs0000644000000000000000000000270310512426101015066 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = "."; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "MySubDir"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "../PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "."; Run(); } } } premake-3.7.orig/Tests/Gnu/Test_Packages.cs0000644000000000000000000000200210446776604015543 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_C() { _script.Replace("c++", "c"); _expects.Package[0].Language = "c"; Run(); } [Test] public void Test_Cpp() { _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cs() { _script.Replace("c++", "c#"); _expects.Package[0].Language = "c#"; Run(); } } } premake-3.7.orig/Tests/Gnu/ParserGnu.cs0000644000000000000000000004541410703501577014741 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.Gnu { public class GnuParser : Parser { #region Parser Methods public override string TargetName { get { return "gnu"; } } #endregion #region Root Makefile Parsing public override void Parse(Project project, string filename) { string root = Path.GetDirectoryName(filename); if (root != String.Empty) root += Path.DirectorySeparatorChar; Begin(root + "Makefile"); /* File header */ Match("# Makefile autogenerated by premake"); Match("# Don't edit this file! Instead edit `premake.lua` then rerun `make`"); Match("# Options:"); /* Project configurations */ string[] matches = Regex("# CONFIG=\\[(.+)\\]"); matches = matches[0].Split('|'); foreach (string config in matches) project.Configuration.Add(config); Match(""); Match("ifndef CONFIG"); Match(" CONFIG=" + project.Configuration[0]); Match("endif"); Match(""); Match("export CONFIG"); Match(""); /* Package list */ matches = Regex(".PHONY: all clean (.+)"); matches = matches[0].Split(' '); foreach (string name in matches) { Package package = new Package(project); project.Package.Add(package); package.Name = name; } Match(""); Match("all: " + String.Join(" ", matches)); Match(""); /* The premake script dependency...need a way to test this! */ string path = Path.Combine(project.Path, "premake.lua"); Regex("Makefile: (.+)"); Match("\t@echo ==== Regenerating Makefiles ===="); Regex("\t@premake --file \\$\\^ (.+)"); Match(""); foreach (Package package in project.Package) { matches = Regex(package.Name + ":(.*)"); foreach (Configuration config in package.Config) { config.Dependencies = matches[0].Trim().Split(' '); } Match("\t@echo ==== Building " + package.Name + " ===="); /* Pull out the package path */ matches = Regex("\t@\\$\\(MAKE\\) --no-print-directory -C (.+)"); int split = matches[0].IndexOf(" -f "); if (split > 0) { package.Path = matches[0].Substring(0, split); package.ScriptName = matches[0].Substring(split + 4); } else { package.Path = matches[0]; package.ScriptName = "Makefile"; } Match(""); } Match("clean:"); foreach (Package package in project.Package) { Regex("\t@\\$\\(MAKE\\) --no-print-directory -C " + package.Path + "(.*)clean$"); } /* Parse the individual packages */ foreach (Package package in project.Package) { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); ParsePackageHeader(project, package, filename); } } #endregion #region Parse Generic Package Header private void ParsePackageHeader(Project project, Package package, string filename) { Begin(filename); string[] matches = Regex("# (.+?) (.+?) Makefile autogenerated by premake"); package.Language = matches[0].ToLower(); Match("# Don't edit this file! Instead edit `premake.lua` then rerun `make`"); Match(""); Match("ifndef CONFIG"); Match(" CONFIG=" + project.Configuration[0]); Match("endif"); Match(""); if (package.Language == "c++" || package.Language == "c") ParseCpp(project, package); else ParseManaged(project, package); } #endregion #region C++ Parsing private void ParseCpp(Project project, Package package) { bool isMac = false; string[] matches; foreach (Configuration config in package.Config) { package.Kind = "exe"; config.Kind = "exe"; ArrayList buildFlags = new ArrayList(); Match("ifeq ($(CONFIG)," + config.Name + ")"); matches = Regex(" BINDIR := (.+)"); config.BinDir = matches[0]; matches = Regex(" LIBDIR := (.+)"); config.LibDir = matches[0]; matches = Regex(" OBJDIR := (.+)"); config.ObjDir = matches[0]; matches = Regex(" OUTDIR := (.+)"); config.OutDir = matches[0]; matches = Regex(" CPPFLAGS := (.*)"); System.Text.RegularExpressions.MatchCollection mc; mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "-I \"(.+?)\""); config.IncludePaths = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.IncludePaths[i] = mc[i].Groups[1].ToString(); mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "-D \"(.+?)\""); config.Defines = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.Defines[i] = mc[i].Groups[1].ToString(); matches = Regex(" CFLAGS \\+= \\$\\(CPPFLAGS\\)(.*)"); if (matches != null) { bool symbols = false; config.BuildOptions = ""; string[] flags = matches[0].Split(' '); foreach (string flag in flags) { switch (flag) { case "-fomit-frame-pointer": buildFlags.Add("no-frame-pointer"); break; case "-g": symbols = true; break; case "-O2": buildFlags.Add("optimize"); break; case "-O3": buildFlags.Add("optimize-speed"); break; case "-Os": buildFlags.Add("optimize-size"); break; case "-Wall": buildFlags.Add("extra-warnings"); break; case "-Werror": buildFlags.Add("fatal-warnings"); break; default: if (flag != "" && flag != "$(TARGET_ARCH)") config.BuildOptions += flag + " "; break; } } if (!symbols) buildFlags.Add("no-symbols"); config.BuildOptions = config.BuildOptions.Trim(' '); } matches = Regex(" CXXFLAGS := \\$\\(CFLAGS\\)(.*)"); if (matches != null) { string[] flags = matches[0].Split(' '); foreach (string flag in flags) { switch (flag) { case "--no-exceptions": buildFlags.Add("no-exceptions"); break; case "--no-rtti": buildFlags.Add("no-rtti"); break; } } } matches = Regex(" LDFLAGS \\+= -L\\$\\(BINDIR\\) -L\\$\\(LIBDIR\\)(.*)"); mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "-L\"(.+?)\""); config.LibPaths = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.LibPaths[i] = mc[i].Groups[1].ToString(); mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "-l([^ $]+)"); config.Links = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.Links[i] = mc[i].Groups[1].ToString(); foreach (string flag in matches[0].Split(' ')) { switch (flag) { case "-dynamiclib": buildFlags.Add("dylib"); break; case "-shared": package.Kind = "dll"; config.Kind = "dll"; break; } } /* Pull out the link options...this gets a bit hairy */ int split = matches[0].IndexOf("-L"); if (split < 0) split = matches[0].IndexOf("-l"); if (split < 0) split = matches[0].Length; config.LinkOptions = matches[0].Substring(0, split); config.LinkOptions = config.LinkOptions.Trim(' '); if (config.LinkOptions.StartsWith("-s")) { config.LinkOptions = config.LinkOptions.Substring(2); config.LinkOptions = config.LinkOptions.Trim(' '); } matches = Regex(" LDDEPS :=(.*)"); config.LinkDeps = matches[0].Trim().Split(' '); ArrayList resDefines = new ArrayList(); ArrayList resPaths = new ArrayList(); matches = Regex(" RESFLAGS :=(.*)"); matches[0] = matches[0].Trim(); while (matches[0].Length > 0) { if (matches[0].StartsWith("-D") || matches[0].StartsWith("-I")) { split = matches[0].IndexOf('"', 4); string value = matches[0].Substring(4, split - 4); if (matches[0].StartsWith("-D")) resDefines.Add(value); else resPaths.Add(value); matches[0] = matches[0].Substring(split + 1).TrimStart(); } else { config.ResOptions = matches[0]; matches[0] = ""; } } config.ResDefines = (string[])resDefines.ToArray(typeof(string)); config.ResPaths = (string[])resPaths.ToArray(typeof(string)); matches = Regex(" TARGET := (.+)"); config.Target = matches[0]; isMac = Match(" MACAPP := " + config.Target + ".app/Contents", true); if (Match(" BLDCMD = ar -rcs $(OUTDIR)/$(TARGET) $(OBJECTS) $(TARGET_ARCH)", true)) config.Kind = "lib"; else if (package.Language == "c++") Match(" BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)"); else Match(" BLDCMD = $(CC) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH)"); Match("endif"); Match(""); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("OBJECTS := \\"); do { matches = Regex("\t\\$\\(OBJDIR\\)/(.+?) \\\\", true); } while (matches != null); Match(""); if (Match("RESOURCES := \\", true)) { do { matches = Regex("\t\\$\\(OBJDIR\\)/(.+?) \\\\", true); } while (matches != null); Match(""); } Match("MKDIR_TYPE := msdos"); Match("CMD := $(subst \\,\\\\,$(ComSpec)$(COMSPEC))"); Match("ifeq (,$(CMD))"); Match(" MKDIR_TYPE := posix"); Match("endif"); Match("ifeq (/bin/sh.exe,$(SHELL))"); Match(" MKDIR_TYPE := posix"); Match("endif"); Match("ifeq ($(MKDIR_TYPE),posix)"); Match(" CMD_MKBINDIR := mkdir -p $(BINDIR)"); Match(" CMD_MKLIBDIR := mkdir -p $(LIBDIR)"); Match(" CMD_MKOUTDIR := mkdir -p $(OUTDIR)"); Match(" CMD_MKOBJDIR := mkdir -p $(OBJDIR)"); Match("else"); Match(" CMD_MKBINDIR := $(CMD) /c if not exist $(subst /,\\\\,$(BINDIR)) mkdir $(subst /,\\\\,$(BINDIR))"); Match(" CMD_MKLIBDIR := $(CMD) /c if not exist $(subst /,\\\\,$(LIBDIR)) mkdir $(subst /,\\\\,$(LIBDIR))"); Match(" CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\\\,$(OUTDIR)) mkdir $(subst /,\\\\,$(OUTDIR))"); Match(" CMD_MKOBJDIR := $(CMD) /c if not exist $(subst /,\\\\,$(OBJDIR)) mkdir $(subst /,\\\\,$(OBJDIR))"); Match("endif"); Match(""); Match(".PHONY: clean"); Match(""); if (isMac) { Match("all: $(OUTDIR)/$(MACAPP)/PkgInfo $(OUTDIR)/$(MACAPP)/Info.plist $(OUTDIR)/$(MACAPP)/MacOS/$(TARGET)"); Match(""); Match("$(OUTDIR)/$(MACAPP)/MacOS/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES)"); } else { Match("$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES)"); } Match("\t@echo Linking " + package.Name); Match("\t-@$(CMD_MKBINDIR)"); Match("\t-@$(CMD_MKLIBDIR)"); Match("\t-@$(CMD_MKOUTDIR)"); if (isMac) { Match("\t-@if [ ! -d $(OUTDIR)/$(MACAPP)/MacOS ]; then mkdir -p $(OUTDIR)/$(MACAPP)/MacOS; fi"); } Match("\t@$(BLDCMD)"); Match(""); if (isMac) { Match("$(OUTDIR)/$(MACAPP)/PkgInfo:"); Match(""); Match("$(OUTDIR)/$(MACAPP)/Info.plist:"); Match(""); } Match("clean:"); Match("\t@echo Cleaning " + package.Name); Match("ifeq ($(MKDIR_TYPE),posix)"); if (isMac) { Match("\t-@rm -rf $(OUTDIR)/$(TARGET).app"); } else { Match("\t-@rm -f $(OUTDIR)/$(TARGET)"); } Match("\t-@rm -rf $(OBJDIR)"); Match("else"); Match("\t-@if exist $(subst /,\\,$(OUTDIR)/$(TARGET)) del /q $(subst /,\\,$(OUTDIR)/$(TARGET))"); Match("\t-@if exist $(subst /,\\,$(OBJDIR)) del /q $(subst /,\\,$(OBJDIR))"); Match("\t-@if exist $(subst /,\\,$(OBJDIR)) rmdir /s /q $(subst /,\\,$(OBJDIR))"); Match("endif"); Match(""); do { matches = Regex("^\\$\\(OBJDIR\\)/(.+)[.](o|res): (.+)", true); if (matches != null) { package.File.Add(matches[2]); Match("\t-@$(CMD_MKOBJDIR)"); Match("\t@echo $(notdir $<)"); switch (Path.GetExtension(matches[2])) { case ".c": Match("\t@$(CC) $(CFLAGS) -o $@ -c $<"); break; case ".s": Match("\t@$(CC) -x assembler-with-cpp $(CPPFLAGS) -o $@ -c $<"); break; case ".rc": Match("\t@windres $< -O coff -o $@ $(RESFLAGS)"); break; default: Match("\t@$(CXX) $(CXXFLAGS) -o $@ -c $<"); break; } Match(""); } } while (matches != null); Match("-include $(OBJECTS:%.o=%.d)"); } #endregion #region Managed Code Parsing private void ParseManaged(Project project, Package package) { string[] matches = Regex("CSC := ([a-z]+)"); package.Compiler = matches[0]; matches = Regex("RESGEN := ([a-z]+)"); bool ok = false; switch (package.Compiler) { case "csc": case "cscc": ok = (matches[0] == "resgen"); break; case "mcs": ok = (matches[0] == "resgen"); break; default: throw new NotImplementedException("Unrecognized compiler: " + package.Compiler); } if (!ok) throw new FormatException("Compiler/Resgen mismatch"); Match(""); matches = Regex("OBJDIR := (.+)"); string objdir = matches[0]; Match(""); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); config.ObjDir = objdir; Match("ifeq ($(CONFIG)," + config.Name + ")"); matches = Regex(" BINDIR := (.+)"); config.BinDir = matches[0]; matches = Regex(" OUTDIR := (.+)"); config.OutDir = matches[0]; matches = Regex(" FLAGS \\+=(.*)"); bool symbols = false; config.BuildOptions = ""; string[] flags = matches[0].Split(' '); foreach (string flag in flags) { switch (flag) { case "/warnaserror": buildFlags.Add("fatal-warnings"); break; case "/optimize": buildFlags.Add("optimize"); break; case "/unsafe": buildFlags.Add("unsafe"); break; case "/debug": symbols = true; break; default: if (flag.StartsWith("/t:")) { config.Kind = flag.Substring(3); if (config.Kind == "library") config.Kind = "dll"; } else { config.BuildOptions += flag + " "; } break; } } if (!symbols) buildFlags.Add("no-symbols"); config.BuildOptions = config.BuildOptions.Trim(' '); System.Text.RegularExpressions.MatchCollection mc; mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "/d:([A-Za-z0-9_]+)"); config.Defines = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.Defines[i] = mc[i].Groups[1].ToString(); mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "/lib:\"(.+?)\""); config.LibPaths = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.LibPaths[i] = mc[i].Groups[1].ToString(); mc = System.Text.RegularExpressions.Regex.Matches(matches[0], "/r:([^ $]+)"); config.Links = new string[mc.Count]; for (int i = 0; i < mc.Count; ++i) config.Links[i] = mc[i].Groups[1].ToString(); matches = Regex(" DEPS :=(.*)"); config.LinkDeps = matches[0].Trim().Split(' '); matches = Regex(" TARGET := (.+)"); config.Target = Path.Combine(Path.GetDirectoryName(matches[0]), Path.GetFileNameWithoutExtension(matches[0])); Match("endif"); Match(""); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("SOURCES := \\"); do { matches = Regex("\t(.+?)[ ]\\\\", true); if (matches != null) package.File.Add(matches[0], "Compile"); } while (matches != null); Match(""); Match("EMBEDDEDFILES := \\"); do { matches = Regex("\t(.+?)[ ]\\\\", true); if (matches != null) package.File.Add(matches[0], "EmbeddedResource"); } while (matches != null); Match(""); Match("EMBEDDEDCOMMAND := \\"); foreach (SourceFile file in package.File) { if (file.BuildAction == "EmbeddedResource") Match("\t/resource:" + file.Name + " \\"); } while (matches != null); Match(""); Match("LINKEDFILES := \\"); do { matches = Regex("\t(.+?)[ ]\\\\", true); if (matches != null) package.File.Add(matches[0], "Linked"); } while (matches != null); Match(""); Match("LINKEDCOMMAND := \\"); foreach (SourceFile file in package.File) { if (file.BuildAction == "Linked") Match("\t/linkresource:" + file.Name + " \\"); } Match(""); Match("CONTENTFILES := \\"); do { matches = Regex("\t(.+?)[ ]\\\\", true); if (matches != null) package.File.Add(matches[0], "Content"); } while (matches != null); Match(""); Match("COPYLOCALFILES := \\"); do { matches = Regex("\t(.+?)[ ]\\\\", true); if (matches != null) package.CopyLocal.Add(matches[0].Substring(10)); } while (matches != null); Match(""); Match("COMPILECOMMAND := $(SOURCES) $(EMBEDDEDCOMMAND) $(LINKEDCOMMAND)"); Match(""); Match("CMD := $(subst \\,\\\\,$(ComSpec)$(COMSPEC))"); Match("ifeq (,$(CMD))"); Match(" CMD_MKOUTDIR := mkdir -p $(OUTDIR)"); Match("else"); Match(" CMD_MKOUTDIR := $(CMD) /c if not exist $(subst /,\\\\,$(OUTDIR)) mkdir $(subst /,\\\\,$(OUTDIR))"); Match("endif"); Match(""); Match(".PHONY: clean"); Match(""); Match("all: \\"); Match("\t$(OUTDIR)/$(TARGET) \\"); if (Match("\t$(OUTDIR)/$(TARGET).config \\", true)) package.HasAppConfigRule = "yes"; foreach (SourceFile file in package.File) { if (file.BuildAction == "Content") Match("\t$(BINDIR)/" + Path.GetFileName(file.Name) + " \\"); } Match(""); Match("$(OUTDIR)/$(TARGET): $(SOURCES) $(EMBEDDEDFILES) $(LINKEDFILES) $(COPYLOCALFILES) $(DEPS)"); Match("\t-@$(CMD_MKOUTDIR)"); Match("\t@$(CSC) /nologo /out:$@ /lib:$(BINDIR) $(FLAGS) $(COMPILECOMMAND)"); Match(""); if (package.HasAppConfigRule == "yes") { Match("$(OUTDIR)/$(TARGET).config: App.config"); Match("\t@echo Copying App.config"); Match("\t-@$(CMD_MKOUTDIR)"); Match("\t@cp $^ $@"); Match(""); } foreach (SourceFile file in package.File) { if (file.BuildAction == "Linked") { string basename = Path.GetFileName(file.Name); Match("$(BINDIR)/" + basename + ": " + file.Name); Match("\t-@cp -fR $^ $@"); Match(""); } } foreach (SourceFile file in package.File) { if (file.BuildAction == "Content") { string basename = Path.GetFileName(file.Name); Match("$(BINDIR)/" + basename + ": " + file.Name); Match("\t-@cp -fR $^ $@"); Match(""); } } Match("clean:"); Match("\t@echo Cleaning " + package.Name); Match("\t-@rm -f $(OUTDIR)/$(TARGET)"); Match("\t-@rm -fR $(OBJDIR)"); } #endregion } } premake-3.7.orig/Tests/Gnu/Cpp/0000755000000000000000000000000011065434615013216 5ustar premake-3.7.orig/Tests/Gnu/Cpp/Test_Files.cs0000644000000000000000000000245510446776604015625 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cpp','file2.cpp'"); _expects.Package[0].File.Add("file1.cpp"); _expects.Package[0].File.Add("file2.cpp"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','Src/Base/file2.cpp'"); _expects.Package[0].File.Add("Src/file1.cpp"); _expects.Package[0].File.Add("Src/Base/file2.cpp"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','../Help/file2.cpp'"); _expects.Package[0].File.Add("Src/file1.cpp"); _expects.Package[0].File.Add("../Help/file2.cpp"); Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Win32Support.cs0000644000000000000000000000144610446776604017061 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Win32Support { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] options) { TestEnvironment.Run(_script, _parser, _expects, options); } #endregion [Test] public void Test_Resources() { _script.Replace("'somefile.txt'", "'somefile.rc'"); _expects.Package[0].File.Add("somefile.rc"); Run("--os windows"); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Target.cs0000644000000000000000000001651410536334317016001 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] options) { TestEnvironment.Run(_script, _parser, _expects, options); } #endregion #region Package/Config Level Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run("--os linux"); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run("--os linux"); } [Test] public void Test_SetOnPackageConfig() { _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage"; Run("--os linux"); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run("--os linux"); } [Test] public void Test_DefaultWithBinDir() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _expects.Package[0].Config[0].OutDir = "../bin"; _expects.Package[0].Config[0].Target = "MyPackage"; Run("--os linux"); } #endregion #region Prefix/Extension Tests [Test] public void Test_TargetPrefixOnExe() { _script.Append("package.targetprefix = 'fi'"); _expects.Package[0].Config[0].Target = "fiMyPackage"; Run("--os linux"); } [Test] public void Test_TargetPrefixOnDll() { _script.Replace("'exe'", "'dll'"); _script.Append("package.targetprefix = 'fi'"); _expects.Package[0].Config[0].Target = "fiMyPackage.so"; Run("--os linux"); } [Test] public void Test_TargetPrefixOnLib() { _script.Replace("'exe'", "'lib'"); _script.Append("package.targetprefix = 'fi'"); _expects.Package[0].Config[0].Target = "fiMyPackage.a"; Run("--os linux"); } [Test] public void Test_TargetExtensionOnExe() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; Run("--os linux"); } [Test] public void Test_TargetExtensionOnDll() { _script.Replace("'exe'", "'dll'"); _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "libMyPackage.zmf"; Run("--os linux"); } [Test] public void Test_TargetExtensionOnLib() { _script.Replace("'exe'", "'lib'"); _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "libMyPackage.zmf"; Run("--os linux"); } #endregion #region Windows Targets [Test] public void Test_Windows_WinExeTarget() { _script.Replace("'exe'", "'winexe'"); _expects.Package[0].Config[0].Target = "MyPackage.exe"; Run("--os windows"); } [Test] public void Test_Windows_ExeTarget() { _expects.Package[0].Config[0].Target = "MyPackage.exe"; Run("--os windows"); } [Test] public void Test_Windows_DllTarget() { _script.Replace("'exe'", "'dll'"); _expects.Package[0].Config[0].Target = "MyPackage.dll"; Run("--os windows"); } [Test] public void Test_Windows_LibTarget() { _script.Replace("'exe'", "'lib'"); _expects.Package[0].Config[0].Target = "libMyPackage.a"; Run("--os windows"); } [Test] public void Test_Windows_CustomTarget() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.zmf"; Run("--os windows"); } [Test] public void Test_Windows_CustomTarget_SetOnConfig() { _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run("--os windows"); } #endregion #region Linux Targets [Test] public void Test_Linux_WinExeTarget() { _script.Replace("'exe'", "'winexe'"); _expects.Package[0].Config[0].Target = "MyPackage"; Run("--os linux"); } [Test] public void Test_Linux_ExeTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; Run("--os linux"); } [Test] public void Test_Linux_DllTarget() { _script.Replace("'exe'", "'dll'"); _expects.Package[0].Config[0].Target = "libMyPackage.so"; Run("--os linux"); } [Test] public void Test_Linux_LibTarget() { _script.Replace("'exe'", "'lib'"); _expects.Package[0].Config[0].Target = "libMyPackage.a"; Run("--os linux"); } [Test] public void Test_Linux_CustomTarget() { _script.Replace("'exe'", "'dll'"); _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "libMyPackage.zmf"; _expects.Package[0].Config[1].Target = "libMyPackage.zmf"; Run("--os linux"); } [Test] public void Test_Linux_CustomTarget_SetOnConfig() { _script.Replace("'exe'", "'dll'"); _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "libMyPackage.zmf"; _expects.Package[0].Config[1].Target = "libMyPackage.so"; Run("--os linux"); } #endregion #region MacOS X Targets [Test] public void Test_MacOSX_WinExeTarget() { _script.Replace("'exe'", "'winexe'"); _expects.Package[0].Config[0].Target = "MyPackage"; Run("--os macosx"); } [Test] public void Test_MacOSX_ExeTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; Run("--os macosx"); } [Test] public void Test_MacOSX_DllTarget() { _script.Replace("'exe'", "'dll'"); _expects.Package[0].Config[0].Target = "libMyPackage.so"; Run("--os macosx"); } [Test] public void Test_MacOSX_LibTarget() { _script.Replace("'exe'", "'lib'"); _expects.Package[0].Config[0].Target = "libMyPackage.a"; Run("--os macosx"); } [Test] public void Test_MacOSX_CustomTarget() { _script.Replace("'exe'", "'dll'"); _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "libMyPackage.zmf"; _expects.Package[0].Config[1].Target = "libMyPackage.zmf"; Run("--os macosx"); } [Test] public void Test_MacOSX_CustomTarget_SetOnConfig() { _script.Replace("'exe'", "'dll'"); _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "libMyPackage.zmf"; _expects.Package[0].Config[1].Target = "libMyPackage.so"; Run("--os macosx"); } #endregion } } premake-3.7.orig/Tests/Gnu/Cpp/Test_IncludePaths.cs0000644000000000000000000000372410446776604017146 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_IncludePaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoIncludePaths() { _expects.Package[0].Config[0].IncludePaths = new string[] { }; _expects.Package[0].Config[1].IncludePaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.includepaths = { '../src', '../include' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.includepaths = { '../package' }"); _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Dependencies.cs0000644000000000000000000001322210536334317017132 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] options) { TestEnvironment.Run(_script, _parser, _expects, options); } #endregion #region DLL Dependencies [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "libPackageB.so" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "libPackageB.so" }; Run("--os linux"); } [Test] public void Test_ExeAndDllFromSubDir() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../bin/libPackageB.so" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../bin/libPackageB.so" }; Run("--os linux"); } [Test] public void Test_ExeAndDllWithTargetPath() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.target = 'Modules/PackageB'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../bin/Modules/libPackageB.so" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../bin/Modules/libPackageB.so" }; Run("--os linux"); } #endregion #region Static Lib Dependencies [Test] public void Test_ExeAndLib() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "libPackageB.a" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "libPackageB.a" }; Run("--os linux"); } [Test] public void Test_ExeAndLibFromSubDir() { _script.Append("project.libdir = 'lib'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../lib/libPackageB.a" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../lib/libPackageB.a" }; Run("--os linux"); } [Test] public void Test_ExeAndLibWithTargetPath() { _script.Append("project.libdir = 'lib'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.target = 'Modules/PackageB'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../lib/Modules/libPackageB.a" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../lib/Modules/libPackageB.a" }; Run("--os linux"); } #endregion } } premake-3.7.orig/Tests/Gnu/Cpp/Test_LinkOptions.cs0000644000000000000000000000307010516203460017005 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_LinkOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.linkoptions = { '--some-opt' }"); _expects.Package[0].Config[0].LinkOptions = "--some-opt"; _expects.Package[0].Config[1].LinkOptions = "--some-opt"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].linkoptions = { '--debug-opt' }"); _script.Append("package.config['Release'].linkoptions = { '--release-opt' }"); _expects.Package[0].Config[0].LinkOptions = "--debug-opt"; _expects.Package[0].Config[1].LinkOptions = "--release-opt"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.linkoptions = { '--some-opt' }"); _script.Append("package.config['Release'].linkoptions = { '--release-opt' }"); _expects.Package[0].Config[0].LinkOptions = "--some-opt"; _expects.Package[0].Config[1].LinkOptions = "--some-opt --release-opt"; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_BuildFlags.cs0000644000000000000000000001131210462427663016563 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] options) { TestEnvironment.Run(_script, _parser, _expects, options); } #endregion #region Flag Placement Tests [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'no-exceptions' }"); _script.Append("package.config['Release'].buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "no-rtti" }; Run(); } #endregion [Test] public void Test_Dylib() { _script.Append("package.buildflags = { 'dylib' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "dylib" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "dylib", "optimize", "no-symbols" }; Run("--os macosx"); } [Test] public void Test_ExtraWarnings() { _script.Append("package.buildflags = { 'extra-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "extra-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "extra-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoExceptions() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoFramePointer() { _script.Append("package.buildflags = { 'no-frame-pointer' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-frame-pointer" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-frame-pointer", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoRtti() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSize() { _script.Append("package.buildflags = { 'optimize-size' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-size" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-size", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSpeed() { _script.Append("package.buildflags = { 'optimize-speed' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-speed" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-speed", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_BuildOptions.cs0000644000000000000000000000345010536334317017161 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_BuildOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void NoBuildOptions() { _expects.Package[0].Config[0].BuildOptions = ""; _expects.Package[0].Config[1].BuildOptions = ""; Run(); } [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.buildoptions = { '`wx-config --dll`' }"); _expects.Package[0].Config[0].BuildOptions = "`wx-config --dll`"; _expects.Package[0].Config[1].BuildOptions = "`wx-config --dll`"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].buildoptions = { '`wx-config --dll --debug`' }"); _script.Append("package.config['Release'].buildoptions = { '`wx-config --dll`' }"); _expects.Package[0].Config[0].BuildOptions = "`wx-config --dll --debug`"; _expects.Package[0].Config[1].BuildOptions = "`wx-config --dll`"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.buildoptions = { '--some-opt' }"); _script.Append("package.config['Release'].buildoptions = { '--release-opt' }"); _expects.Package[0].Config[0].BuildOptions = "--some-opt"; _expects.Package[0].Config[1].BuildOptions = "--some-opt --release-opt"; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Links.cs0000644000000000000000000000314610645510305015622 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1", "lib2" }; _expects.Package[0].Config[1].Links = new string[] { "lib1", "lib2" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d" }; _expects.Package[0].Config[1].Links = new string[] { "lib1" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib", "liba-d" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib", "liba" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Defines.cs0000644000000000000000000000362210446776604016135 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT=__declspec(dllexport)' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_OutputDirs.cs0000644000000000000000000000603410512426101016654 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } [Test] public void BinDir_FromSubDir() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _expects.Package[0].Config[0].BinDir = "../bin"; _expects.Package[0].Config[1].BinDir = "../bin"; Run(); } [Test] public void BinDir_SetAtPackage() { _script.Append("package.path = 'MyPackage'"); _script.Append("package.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } #endregion #region LibDir Tests [Test] public void Test_LibDir_Default() { _expects.Package[0].Config[0].LibDir = "."; _expects.Package[0].Config[1].LibDir = "."; Run(); } [Test] public void Test_LibDir_SetAtProject() { _script.Append("project.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } [Test] public void Test_LibDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].libdir = 'lib/Debug'"); _script.Append("project.config['Release'].libdir = 'lib/Release'"); _expects.Package[0].Config[0].LibDir = "lib/Debug"; _expects.Package[0].Config[1].LibDir = "lib/Release"; Run(); } #endregion #region ObjDir Tests [Test] public void Test_ObjDir_Default() { _expects.Package[0].Config[0].ObjDir = "obj/Debug"; _expects.Package[0].Config[1].ObjDir = "obj/Release"; Run(); } [Test] public void Test_ObjDir_SetAtPackage() { _script.Append("package.objdir = 'temp'"); _expects.Package[0].Config[0].ObjDir = "temp/Debug"; _expects.Package[0].Config[1].ObjDir = "temp/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Resources.cs0000644000000000000000000000524010526373152016516 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Resources { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_UsesIncludePaths() { _script.Append("package.includepaths = { 'include' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include" }; Run(); } [Test] public void Test_UsesResourcePaths() { _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "resources" }; Run(); } [Test] public void Test_MergesIncludeAndResourcePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include", "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include", "resources" }; Run(); } [Test] public void Test_UsesDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE" }; Run(); } [Test] public void Test_UsesResourceDefines() { _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "RESDEFINE" }; Run(); } [Test] public void Test_UsesDefinesAndResourceDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; Run(); } [Test] public void Test_UsesResourceOptions() { _script.Append("package.resoptions = { 'ABC', 'XYZ' }"); _expects.Package[0].Config[0].ResOptions = "ABC XYZ"; _expects.Package[0].Config[1].ResOptions = "ABC XYZ"; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_Kinds.cs0000644000000000000000000000323310446776604015626 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { /* Can't distinguish between the two on this platform */ _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsLib() { _script.Replace("exe", "lib"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "lib"; Run(); } [Test] public void Test_MixedKinds() { _script.Append("package.config['Debug'].kind = 'lib'"); _script.Append("package.config['Release'].kind = 'dll'"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Gnu/Cpp/Test_LibPaths.cs0000644000000000000000000000362410446776604016270 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cpp { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cs/0000755000000000000000000000000011065434615013041 5ustar premake-3.7.orig/Tests/Gnu/Cs/Test_Files.cs0000644000000000000000000000354510611151102015417 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] args) { TestEnvironment.Run(_script, _parser, _expects, args); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cs','file2.cs'"); _expects.Package[0].File.Add("file1.cs"); _expects.Package[0].File.Add("file2.cs"); Run("--os linux"); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("Src/file1.cs"); _expects.Package[0].File.Add("Src/Base/file2.cs"); Run("--os linux"); } [Test] public void Test_FilesInSubDirs_Windows() { /* Backslashes must be escaped in makefiles */ _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("Src\\\\file1.cs"); _expects.Package[0].File.Add("Src\\\\Base\\\\file2.cs"); Run("--os windows"); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cs','../Help/file2.cs'"); _expects.Package[0].File.Add("Src/file1.cs"); _expects.Package[0].File.Add("../Help/file2.cs"); Run("--os linux"); } [Test] public void AddsCopyRuleForAppConfig() { _script.Replace("'somefile.txt'", "'App.config'"); _expects.Package[0].HasAppConfigRule = "yes"; Run("--os linux"); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_Target.cs0000644000000000000000000000316710446776604015635 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run(); } [Test] public void Test_SetOnPackageConfig() { /* Config specific target not supported for C# */ _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage-d"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_BuildActions.cs0000644000000000000000000000523410446776604016764 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_BuildActions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultCodeAction() { _script.Replace("'somefile.txt'", "'file0.cs'"); _expects.Package[0].File.Add("file0.cs", "Compile"); Run(); } [Test] public void Test_DefaultBuildAction() { /* For GNU, files with buildaction==none are left out of makefile, * so there should only be one file in this example */ _script.Replace("'somefile.txt'", "'file0.cs','somefile.txt'"); _expects.Package[0].File.Add("file0.cs", "Compile"); Run(); } [Test] public void Test_CodeAsContent() { _script.Replace("'somefile.txt'", "'file0.cs','file1.cs'"); _script.Append("package.config['file1.cs'].buildaction = 'Content'"); _expects.Package[0].File.Add("file0.cs", "Compile"); _expects.Package[0].File.Add("file1.cs", "Content"); Run(); } [Test] public void Test_AspxCodeAction() { _script.Replace("'somefile.txt'", "'file0.aspx.cs'"); _expects.Package[0].File.Add("file0.aspx.cs", "Compile"); Run(); } [Test] public void Test_AspxAction() { _script.Replace("'somefile.txt'", "'file0.aspx'"); _expects.Package[0].File.Add("file0.aspx", "Content"); Run(); } [Test] public void Test_AsaxAction() { _script.Replace("'somefile.txt'", "'file0.asax'"); _expects.Package[0].File.Add("file0.asax", "Content"); Run(); } [Test] public void Test_ResxAction() { _script.Replace("'somefile.txt'", "'file0.resx'"); _expects.Package[0].File.Add("obj/Debug/MyPackage.file0.resources", null, "EmbeddedResource"); Run(); } [Test] public void Test_ResxWithDependencyAction() { _script.Replace("'somefile.txt'", "'file0.resx','file0.cs'"); _expects.Package[0].File.Add("obj/Debug/MyPackage.file0.resources", "EmbeddedResource"); _expects.Package[0].File.Add("file0.cs"); Run(); } [Test] public void Test_CustomBuildAction() { _script.Append("package.config['somefile.txt'].buildaction = 'EmbeddedResource'"); _expects.Package[0].File.Add("somefile.txt", "EmbeddedResource"); Run(); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_Dependencies.cs0000644000000000000000000001004510446776604016766 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] options) { TestEnvironment.Run(_script, _parser, _expects, options); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "PackageB.dll" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "PackageB.dll" }; Run("--os linux"); } [Test] public void Test_ExeAndDllFromSubDir() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../bin/PackageB.dll" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../bin/PackageB.dll" }; Run("--os linux"); } [Test] public void Test_ExeAndDllWithTargetPath() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.target = 'Modules/PackageB'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../bin/Modules/PackageB.dll" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../bin/Modules/PackageB.dll" }; Run("--os linux"); } [Test] public void Test_ExeAndDllWithBinDir() { _script.Append("project.config['Debug'].bindir = 'Bin/Debug'"); _script.Append("project.config['Release'].bindir = 'Bin/Release'"); _script.Append("package.path = 'MyPackage'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _script.Append("package.path = 'PackageB'"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[0].LinkDeps = new string[]{ "../Bin/Debug/PackageB.dll" }; _expects.Package[0].Config[1].LinkDeps = new string[]{ "../Bin/Release/PackageB.dll" }; Run("--os linux"); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_BuildFlags.cs0000644000000000000000000000544610446776604016425 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run(params string[] args) { TestEnvironment.Run(_script, _parser, _expects, args); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'unsafe' }"); _script.Append("package.config['Release'].buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "fatal-warnings" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run("--dotnet ms"); } [Test] public void Test_OptimizeMono() { /* Mono does not support an optimize flag */ _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-symbols" }; Run("--dotnet mono"); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_Links.cs0000644000000000000000000000337210446776604015465 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.dll", "lib2.dll" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.dll", "lib2.dll" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.dll" }; _expects.Package[0].Config[1].Links = new string[] { "lib1-d.dll" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.dll", "liba-d.dll" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.dll", "liba-d.dll" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_Defines.cs0000644000000000000000000000351610446776604015762 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_OutputDirs.cs0000644000000000000000000000317610446776604016531 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; _expects.Package[0].Config[0].OutDir = "."; _expects.Package[0].Config[1].OutDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; _expects.Package[0].Config[0].OutDir = "bin"; _expects.Package[0].Config[1].OutDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; _expects.Package[0].Config[0].OutDir = "bin/Debug"; _expects.Package[0].Config[1].OutDir = "bin/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Gnu/Cs/Test_Kinds.cs0000644000000000000000000000260710446776604015455 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsAspNet() { /* Can't distinguish between the two on this platform */ _script.Replace("exe", "aspnet"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Gnu/Cs/Test_LibPaths.cs0000644000000000000000000000367610446776604016122 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Gnu.Cs { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { /* C# doesn't allow per-config lib paths */ _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../debug" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../package", "../debug" }; Run(); } } } premake-3.7.orig/Tests/Test_MatchFiles.cs0000644000000000000000000000705510446776604015330 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests { [TestFixture] public class Test_MatchFiles { #region Setup and Teardown Script _script; Project _expects; Parser _parser; [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Premake.Tests.Gnu.GnuParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SimplePattern() { _script.Replace("'somefile.txt'", "matchfiles('*.cpp')"); TestEnvironment.AddFile("file0.cpp"); TestEnvironment.AddFile("file1.cpp"); _expects.Package[0].File.Add("file0.cpp"); _expects.Package[0].File.Add("file1.cpp"); Run(); } [Test] public void Test_SubdirPattern() { _script.Replace("'somefile.txt'", "matchfiles('Code/*.cpp')"); TestEnvironment.AddFile("Code/file0.cpp"); TestEnvironment.AddFile("Code/file1.cpp"); _expects.Package[0].File.Add("Code/file0.cpp"); _expects.Package[0].File.Add("Code/file1.cpp"); Run(); } [Test] public void Test_WithBuildActions() { _script.Replace("'c++'", "'c#'"); _script.Replace("'somefile.txt'", "matchfiles('*.cs', '*.bmp')"); _script.Append("package.config[matchfiles('*.bmp')].buildaction = 'EmbeddedResource'"); TestEnvironment.AddFile("file0.cs"); TestEnvironment.AddFile("file1.cs"); TestEnvironment.AddFile("image0.bmp"); TestEnvironment.AddFile("image1.bmp"); _expects.Package[0].File.Add("file0.cs"); _expects.Package[0].File.Add("file1.cs"); _expects.Package[0].File.Add("image0.bmp"); _expects.Package[0].File.Add("image1.bmp"); Run(); } [Test] public void Test_WithPackagePath() { _script.Replace("package.files", "package.path='Subdir'\n package.files"); _script.Replace("'somefile.txt'", "matchfiles('*.cpp')"); TestEnvironment.AddFile("Subdir/aaaa.cpp"); TestEnvironment.AddFile("Subdir/bbbb.cpp"); _expects.Package[0].File.Add("aaaa.cpp"); _expects.Package[0].File.Add("bbbb.cpp"); Run(); } [Test] public void Test_WithPackageDotPath() { _script.Replace("package.files", "package.path='.'\n package.files"); _script.Replace("'somefile.txt'", "matchfiles('*.cpp')"); TestEnvironment.AddFile("aaaa.cpp"); TestEnvironment.AddFile("bbbb.cpp"); _expects.Package[0].File.Add("aaaa.cpp"); _expects.Package[0].File.Add("bbbb.cpp"); Run(); } [Test] public void Test_RecursiveMatch() { _script.Replace("'somefile.txt'", "matchrecursive('*.cpp')"); TestEnvironment.AddFile("aaaa.cpp"); TestEnvironment.AddFile("Sub0/bbbb.cpp"); TestEnvironment.AddFile("Sub0/Sub1/cccc.cpp"); TestEnvironment.AddFile("Sub2/dddd.cpp"); _expects.Package[0].File.Add("aaaa.cpp"); _expects.Package[0].File.Add("Sub0/bbbb.cpp"); _expects.Package[0].File.Add("Sub0/Sub1/cccc.cpp"); _expects.Package[0].File.Add("Sub2/dddd.cpp"); Run(); } [Test] public void Test_RecursiveMatchWithSubdirMask() { _script.Replace("'somefile.txt'", "matchrecursive('Sub0/*.cpp')"); TestEnvironment.AddFile("aaaa.cpp"); TestEnvironment.AddFile("Sub0/bbbb.cpp"); TestEnvironment.AddFile("Sub0/Sub1/cccc.cpp"); TestEnvironment.AddFile("Sub2/dddd.cpp"); _expects.Package[0].File.Add("Sub0/bbbb.cpp"); _expects.Package[0].File.Add("Sub0/Sub1/cccc.cpp"); Run(); } } } premake-3.7.orig/Tests/CodeBlocks/0000755000000000000000000000000011065434614013752 5ustar premake-3.7.orig/Tests/CodeBlocks/Test_Paths.cs0000644000000000000000000000271510457234350016363 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = ""; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "MySubDir"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "..\\PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ""; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Test_Packages.cs0000644000000000000000000000167410475362632017032 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _script.Replace("somefile.txt", "somefile.cpp"); _expects = new Project(); _expects.Package.Add(1); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_C() { _script.Replace("c++", "c"); _expects.Package[0].Language = "c"; Run(); } [Test] public void Test_Cpp() { _expects.Package[0].Language = "c++"; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/CodeBlocksParser.cs0000644000000000000000000002011610663071316017465 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks { public class CodeBlocksParser : Parser { #region Parser Methods public override string TargetName { get { return "cb-gcc"; } } #endregion #region Workspace Parsing public override void Parse(Project project, string filename) { /* File header */ Begin(filename + ".workspace"); Match(""); Match(""); Match("\t"); Hashtable packageDependencies = new Hashtable(); while (!Match("\t", true)) { string[] matches = Regex("\t\t"); Package package = new Package(); project.Package.Add(package); package.Name = Path.GetFileNameWithoutExtension(matches[0]); package.Path = Path.GetDirectoryName(matches[0]); package.ScriptName = Path.GetFileName(matches[0]); ArrayList deps = new ArrayList(); while (!Match("\t\t", true)) { matches = Regex("\t\t\t"); deps.Add(Path.GetFileNameWithoutExtension(matches[0])); } packageDependencies.Add(package, deps.ToArray(typeof(string))); } Match(""); foreach (Package package in project.Package) { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); ParseCpp(project, package, filename); foreach (Configuration cfg in package.Config) cfg.Dependencies = (string[])packageDependencies[package]; } } #endregion #region C++ Parsing private void ParseCpp(Project project, Package package, string filename) { Begin(filename); Match(""); Match(""); Match("\t"); Match("\t"); Match("\t\t"); Match(""); } #endregion } } premake-3.7.orig/Tests/CodeBlocks/Cpp/0000755000000000000000000000000011065434614014474 5ustar premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Files.cs0000644000000000000000000000332210477351403017064 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cpp','file2.cpp'"); _expects.Package[0].File.Add("file1.cpp"); _expects.Package[0].File.Add("file2.cpp"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','Src/Base/file2.cpp'"); _expects.Package[0].File.Add("Src/file1.cpp"); _expects.Package[0].File.Add("Src/Base/file2.cpp"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','../Help/file2.cpp'"); _expects.Package[0].File.Add("Src/file1.cpp"); _expects.Package[0].File.Add("../Help/file2.cpp"); Run(); } [Test] public void Test_HeaderFiles() { _script.Replace("'somefile.txt'", "'file1.h','file1.cpp'"); _expects.Package[0].File.Add("file1.h"); _expects.Package[0].File.Add("file1.cpp"); Run(); } [Test] public void Test_ResourceFiles() { _script.Replace("'somefile.txt'", "'../resource1.rc'"); _expects.Package[0].File.Add("../resource1.rc"); Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Target.cs0000644000000000000000000000433010457471706017257 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp.exe"; _expects.Package[0].Config[1].Target = "MyApp.exe"; Run(); } [Test] public void Test_SetOnPackageConfig() { _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } #endregion #region Custom Target Tests [Test] public void Test_CustomTarget() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.zmf"; Run(); } [Test] public void Test_CustomTarget_SetOnConfig() { _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } #endregion } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_IncludePaths.cs0000644000000000000000000000374210457471706020422 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_IncludePaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoIncludePaths() { _expects.Package[0].Config[0].IncludePaths = new string[] { }; _expects.Package[0].Config[1].IncludePaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.includepaths = { '../src', '../include' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.includepaths = { '../package' }"); _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Dependencies.cs0000644000000000000000000000323710457471706020424 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } [Test] public void Test_ExeAndLib() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_LinkOptions.cs0000644000000000000000000000306510516203460020270 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_LinkOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void SetOptionsOnPackage() { _script.Append("package.linkoptions = { '--some-opt' }"); _expects.Package[0].Config[0].LinkOptions = "--some-opt"; _expects.Package[0].Config[1].LinkOptions = "--some-opt"; Run(); } [Test] public void SetOptionsOnConfig() { _script.Append("package.config['Debug'].linkoptions = { '--debug-opt' }"); _script.Append("package.config['Release'].linkoptions = { '--release-opt' }"); _expects.Package[0].Config[0].LinkOptions = "--debug-opt"; _expects.Package[0].Config[1].LinkOptions = "--release-opt"; Run(); } [Test] public void SetOptionsOnPackageAndConfig() { _script.Append("package.linkoptions = { '--some-opt' }"); _script.Append("package.config['Release'].linkoptions = { '--release-opt' }"); _expects.Package[0].Config[0].LinkOptions = "--some-opt"; _expects.Package[0].Config[1].LinkOptions = "--some-opt --release-opt"; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_BuildFlags.cs0000644000000000000000000001127610462427663020053 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'no-exceptions' }"); _script.Append("package.config['Release'].buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "no-rtti" }; Run(); } [Test] public void Test_ExtraWarnings() { _script.Append("package.buildflags = { 'extra-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "extra-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "extra-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoExceptions() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoFramePointer() { _script.Append("package.buildflags = { 'no-frame-pointer' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-frame-pointer" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-frame-pointer", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoImportLib() { _script.Replace("exe", "dll"); _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-import-lib" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-import-lib", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoRtti() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSize() { _script.Append("package.buildflags = { 'optimize-size' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-size" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-size", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSpeed() { _script.Append("package.buildflags = { 'optimize-speed' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-speed" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-speed", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_BuildOptions.cs0000644000000000000000000000302410462427663020442 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_BuildOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.buildoptions = { 'pkgopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].buildoptions = { 'dbgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "dbgopt"; _expects.Package[0].Config[1].BuildOptions = "relopt"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.buildoptions = { 'pkgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt relopt"; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Links.cs0000644000000000000000000000316610473376711017115 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1", "lib2" }; _expects.Package[0].Config[1].Links = new string[] { "lib1", "lib2" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d" }; _expects.Package[0].Config[1].Links = new string[] { "lib1" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib", "liba-d" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib", "liba" }; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Defines.cs0000644000000000000000000000364010457471706017411 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT=__declspec(dllexport)' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_OutputDirs.cs0000644000000000000000000000521510473376711020154 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = ""; _expects.Package[0].Config[1].BinDir = ""; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion #region LibDir Tests [Test] public void Test_LibDir_Default() { _script.Replace("'exe'", "'lib'"); _expects.Package[0].Config[0].LibDir = ""; _expects.Package[0].Config[1].LibDir = ""; Run(); } [Test] public void Test_LibDir_SetAtProject() { _script.Replace("'exe'", "'lib'"); _script.Append("project.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } [Test] public void Test_LibDir_SetAtProjectConfig() { _script.Replace("'exe'", "'lib'"); _script.Append("project.config['Debug'].libdir = 'lib/Debug'"); _script.Append("project.config['Release'].libdir = 'lib/Release'"); _expects.Package[0].Config[0].LibDir = "lib/Debug"; _expects.Package[0].Config[1].LibDir = "lib/Release"; Run(); } #endregion #region ObjDir Tests [Test] public void Test_ObjDir_Default() { _expects.Package[0].Config[0].ObjDir = "obj/Debug"; _expects.Package[0].Config[1].ObjDir = "obj/Release"; Run(); } [Test] public void Test_ObjDir_SetAtPackage() { _script.Append("package.objdir = 'temp'"); _expects.Package[0].Config[0].ObjDir = "temp/Debug"; _expects.Package[0].Config[1].ObjDir = "temp/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Resources.cs0000644000000000000000000000573010567103156020001 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Resources { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_UsesIncludePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Replace("somefile.txt", "somefile.rc"); _expects.Package[0].Config[0].ResPaths = new string[] { "include" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include" }; Run(); } [Test] public void Test_UsesResourcePaths() { _script.Append("package.respaths = { 'resources' }"); _script.Replace("somefile.txt", "somefile.rc"); _expects.Package[0].Config[0].ResPaths = new string[] { "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "resources" }; Run(); } [Test] public void Test_MergesIncludeAndResourcePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Append("package.respaths = { 'resources' }"); _script.Replace("somefile.txt", "somefile.rc"); _expects.Package[0].Config[0].ResPaths = new string[] { "include", "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include", "resources" }; Run(); } #if UNIMPLEMENTED // - CodeBlocks doesn't support these features yet [Test] public void Test_UsesDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "_DEBUG", "MYDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "NDEBUG", "MYDEFINE" }; Run(); } [Test] public void Test_UsesResourceDefines() { _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "_DEBUG", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "NDEBUG", "RESDEFINE" }; Run(); } [Test] public void Test_UsesDefinesAndResourceDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "_DEBUG", "MYDEFINE", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "NDEBUG", "MYDEFINE", "RESDEFINE" }; Run(); } [Test] public void Test_UsesResourceOptions() { _script.Append("package.resoptions = { 'ABC', 'XYZ' }"); _expects.Package[0].Config[0].ResOptions = "ABC XYZ"; _expects.Package[0].Config[1].ResOptions = "ABC XYZ"; Run(); } #endif } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_Kinds.cs0000644000000000000000000000316010457471706017101 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsLib() { _script.Replace("exe", "lib"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "lib"; Run(); } [Test] public void Test_MixedKinds() { _script.Append("package.config['Debug'].kind = 'lib'"); _script.Append("package.config['Release'].kind = 'dll'"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/CodeBlocks/Cpp/Test_LibPaths.cs0000644000000000000000000000371010650007770017527 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.CodeBlocks.Cpp { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new CodeBlocksParser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { "." }; _expects.Package[0].Config[1].LibPaths = new string[] { "." }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { ".", "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { ".", "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { ".", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { ".", "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { ".", "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { ".", "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs6/0000755000000000000000000000000011065434617012423 5ustar premake-3.7.orig/Tests/Vs6/Test_Paths.cs0000644000000000000000000000270310446776604015041 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6 { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = "."; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "MySubDir"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "..\\PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "."; Run(); } } } premake-3.7.orig/Tests/Vs6/Vs6Parser.cs0000644000000000000000000003404610644201105014576 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.Vs6 { public class Vs6Parser : Parser { #region Parser Methods public override string TargetName { get { return "vs6"; } } #endregion #region Workspace Parsing public override void Parse(Project project, string filename) { /* File header */ Begin(filename + ".dsw"); Match("Microsoft Developer Studio Workspace File, Format Version 6.00"); Match("# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!"); Match(""); Match("###############################################################################"); Match(""); Hashtable dependencies = new Hashtable(); string[] matches; while (!Match("Global:", true)) { Package package = new Package(); project.Package.Add(package); matches = Regex("Project: \"(.+)\"=(.+) - Package Owner=<4>"); package.Name = matches[0]; package.Path = Path.GetDirectoryName(matches[1]); package.ScriptName = Path.GetFileName(matches[1]); package.Language = "c++"; Match(""); Match("Package=<5>"); Match("{{{"); Match("}}}"); Match(""); Match("Package=<4>"); Match("{{{"); /* Get the package dependencies, cache until I have configs */ ArrayList deps = new ArrayList(); while (Match(" Begin Project Dependency", true)) { matches = Regex(" Project_Dep_Name (.+)"); deps.Add(matches[0]); Match(" End Project Dependency"); } dependencies[package] = (string[])deps.ToArray(typeof(string)); Match("}}}"); Match(""); Match("###############################################################################"); Match(""); } Match(""); Match("Package=<5>"); Match("{{{"); Match("}}}"); Match(""); Match("Package=<3>"); Match("{{{"); Match("}}}"); Match(""); Match("###############################################################################"); Match(""); foreach (Package package in project.Package) { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); switch (package.Language) { case "c++": ParseCpp(project, package, filename); break; default: throw new NotImplementedException("Loading of " + package.Language + " packages not implemented"); } ArrayList temp = new ArrayList(); foreach (Configuration config in package.Config) { config.Dependencies = (string[])dependencies[package]; temp.Add(config); } /* VS6 stores configs in reverse order */ temp.Reverse(); for (int i = 0; i < package.Config.Count; ++i) package.Config[i] = (Configuration)temp[i]; } } #endregion #region C++ Parsing private void ParseCpp(Project project, Package package, string filename) { Begin(filename); Match("# Microsoft Developer Studio Project File - Name=\"" + package.Name + "\" - Package Owner=<4>"); Match("# Microsoft Developer Studio Generated Build File, Format Version 6.00"); Match("# ** DO NOT EDIT **"); Match(""); string[] matches = Regex("# TARGTYPE (.+)"); switch (matches[0]) { case "\"Win32 (x86) Application\" 0x0101": package.Kind = "winexe"; break; case "\"Win32 (x86) Console Application\" 0x0103": package.Kind = "exe"; break; case "\"Win32 (x86) Dynamic-Link Library\" 0x0102": package.Kind = "dll"; break; case "\"Win32 (x86) Static Library\" 0x0104": package.Kind = "lib"; break; default: throw new FormatException("Unrecognized target type: '" + matches[0] + "'"); } string baseKind = matches[0].Substring(0, matches[0].Length - 7); Match(""); matches = Regex("CFG=" + package.Name + " - (.+)"); string defaultConfig = matches[0]; Match("!MESSAGE This is not a valid makefile. To build this project using NMAKE,"); Match("!MESSAGE use the Export Makefile command and run"); Match("!MESSAGE "); Match("!MESSAGE NMAKE /f \"" + package.Name + ".mak\"."); Match("!MESSAGE "); Match("!MESSAGE You can specify a configuration when running NMAKE"); Match("!MESSAGE by defining the macro CFG on the command line. For example:"); Match("!MESSAGE "); Match("!MESSAGE NMAKE /f \"" + package.Name + ".mak\" CFG=\"" + package.Name + " - " + defaultConfig + "\""); Match("!MESSAGE "); Match("!MESSAGE Possible choices for configuration are:"); Match("!MESSAGE "); baseKind = baseKind.Replace("(", "\\("); baseKind = baseKind.Replace(")", "\\)"); while (!Match("!MESSAGE ", true)) { matches = Regex("!MESSAGE \"" + package.Name + " - ([^\"]+)\" \\(based on " + baseKind + "\\)"); Configuration config = new Configuration(); config.Name = matches[0]; config.Dependencies = new string[0]; package.Config.Add(config); } Match(""); /* Verify configurations */ if (project.Configuration.Count == 0) { foreach (Configuration config in package.Config) project.Configuration.Add(config.Name); } else { foreach (Configuration config in package.Config) if (!project.Configuration.Contains(config.Name)) throw new FormatException("Config '" + config.Name + "' not found in project"); } Match("# Begin Project"); Match("# PROP AllowPerConfigDependencies 0"); Match("# PROP Scc_ProjName \"\""); Match("# PROP Scc_LocalPath \"\""); Match("CPP=cl.exe"); if (package.Kind != "lib") Match("MTL=midl.exe"); Match("RSC=rc.exe"); Match(""); bool first = true; foreach (Configuration config in package.Config) { ArrayList bldflags = new ArrayList(); ArrayList lnkflags = new ArrayList(); ArrayList defines = new ArrayList(); ArrayList incpaths = new ArrayList(); ArrayList links = new ArrayList(); ArrayList libpaths = new ArrayList(); string cond = (first) ? "!IF" : "!ELSEIF"; first = false; Match(cond + " \"$(CFG)\" == \"" + package.Name + " - " + config.Name + "\""); Match(""); Match("# PROP BASE Use_MFC 0"); matches = Regex("# PROP BASE Use_Debug_Libraries ([0-1])"); string useDebugLib = matches[0]; matches = Regex("# PROP BASE Output_Dir \"(.+)\""); config.OutDir = matches[0]; config.BinDir = matches[0]; config.LibDir = matches[0]; matches = Regex("# PROP BASE Intermediate_Dir \"(.+)\""); config.ObjDir = matches[0]; Match("# PROP BASE Target_Dir \"\""); Match("# PROP Use_MFC 0"); Match("# PROP Use_Debug_Libraries " + useDebugLib); Match("# PROP Output_Dir \"" + config.OutDir + "\""); Match("# PROP Intermediate_Dir \"" + config.ObjDir + "\""); if (Match("# PROP Ignore_Export_Lib 1", true)) bldflags.Add("no-import-lib"); Match("# PROP Target_Dir \"\""); matches = Regex("# ADD BASE CPP /nologo (.+)"); string flags = matches[0]; matches = flags.Split(' '); int i = 0; if (matches[i] == "/MTd" || matches[i] == "/MT") { lnkflags.Add("static-runtime"); } else { Expect(matches[i], "/MDd", "/MD"); } ++i; if (matches[i] == "/W4") { bldflags.Add("extra-warnings"); } else { Expect(matches[i], "/W3"); } ++i; if (matches[i] == "/WX") { bldflags.Add("fatal-warnings"); ++i; } if (matches[i] == "/Gm") { ++i; } if (matches[i] == "/GR") { ++i; } else { bldflags.Add("no-rtti"); } if (matches[i] == "/GX") { ++i; } else { bldflags.Add("no-exceptions"); } if (matches[i] == "/ZI") { ++i; } else { bldflags.Add("no-symbols"); } if (matches[i] == "/O1") { bldflags.Add("optimize-size"); } else if (matches[i] == "/O2") { bldflags.Add("optimize"); } else { Expect(matches[i], "/Od"); } ++i; if (matches[i] == "/Oy") { bldflags.Add("no-frame-pointer"); ++i; } while (matches[i] == "/I") { incpaths.Add(matches[++i].Trim('\"')); ++i; } while (matches[i] == "/D") { defines.Add(matches[++i].Trim('\"')); ++i; } Expect(matches[i], "/YX"); Expect(matches[++i], "/FD"); if (matches[++i] == "/GZ") ++i; Expect(matches[i++], "/c"); config.BuildOptions = String.Empty; while (i < matches.Length) config.BuildOptions += " " + matches[i++]; config.BuildOptions = config.BuildOptions.Trim(); Match("# ADD CPP /nologo " + flags); string debugSymbol = bldflags.Contains("no-symbols") ? "NDEBUG" : "_DEBUG"; bool hasMtl = Match("# ADD BASE MTL /nologo /D \"" + debugSymbol + "\" /mktyplib203 /win32", true); if (hasMtl) Match("# ADD MTL /nologo /D \"" + debugSymbol + "\" /mktyplib203 /win32"); ArrayList resDefines = new ArrayList(); ArrayList resPaths = new ArrayList(); matches = Regex("# ADD BASE RSC /l 0x409 (.+)"); while (matches[0].Length > 0) { if (matches[0].StartsWith("/d") || matches[0].StartsWith("/i")) { int split = matches[0].IndexOf('"', 4); string value = matches[0].Substring(4, split - 4); if (matches[0].StartsWith("/d")) resDefines.Add(value); else resPaths.Add(value); matches[0] = matches[0].Substring(split + 1).TrimStart(); } else { config.ResOptions = matches[0]; matches[0] = ""; } } config.ResDefines = (string[])resDefines.ToArray(typeof(string)); config.ResPaths = (string[])resPaths.ToArray(typeof(string)); string rsc = "# ADD RSC /l 0x409"; foreach (string symbol in resDefines) rsc += " /d \"" + symbol + "\""; foreach (string symbol in resPaths) rsc += " /i \"" + symbol + "\""; if (config.ResOptions != null) rsc += " " + config.ResOptions; Match(rsc); Match("BSC32=bscmake.exe"); Match("# ADD BASE BSC32 /nologo"); Match("# ADD BSC32 /nologo"); if (Match("LINK32=link.exe -lib", true)) { config.Kind = "lib"; Match("# ADD BASE LIB32 /nologo"); matches = Regex("# ADD LIB32 /nologo /out:\"(.+)\"", true); if (matches != null) { config.Target = matches[0]; } else { Match("# ADD LIB32 /nologo"); } } else { Match("LINK32=link.exe"); matches = Regex("# ADD BASE LINK32 (.+)"); flags = matches[0]; matches = flags.Split(' '); i = 0; while (i < matches.Length && matches[i][0] != '/') links.Add(matches[i++]); Expect(matches[i++], "/nologo"); bool noMain = true; if (matches[i] == "/entry:\"mainCRTStartup\"") { noMain = false; ++i; } if (matches[i] == "/subsystem:windows") { config.Kind = "winexe"; } else if (matches[i] == "/subsystem:console") { config.Kind = "exe"; } else if (matches[i] == "/dll") { config.Kind = "dll"; } else { throw new FormatException("Unexpected subsystem flag: " + matches[i]); } ++i; if (hasMtl && config.Kind != "winexe" && config.Kind != "dll") throw new FormatException("Found unexpected MTL block"); if ((config.Kind == "winexe" || config.Kind == "exe") && noMain) bldflags.Add("no-main"); if (!bldflags.Contains("no-symbols")) { Expect(matches[i++], "/incremental:yes"); Expect(matches[i++], "/debug"); } Expect(matches[i++], "/machine:I386"); if (config.Kind == "dll") { config.ImportLib = matches[i].Substring(9, matches[i].Length - 10); ++i; } config.Target = matches[i].Substring(6, matches[i].Length - 7); if (config.Target.StartsWith(config.OutDir)) config.Target = config.Target.Substring(config.OutDir.Length + 1); ++i; if (!bldflags.Contains("no-symbols")) Expect(matches[i++], "/pdbtype:sept"); config.LibDir = matches[i].Substring(10, matches[i].Length - 11); ++i; while (i < matches.Length && matches[i].StartsWith("/libpath:")) { libpaths.Add(matches[i].Substring(10, matches[i].Length - 11)); ++i; } Match("# ADD LINK32 " + flags); } config.BuildFlags = (string[])bldflags.ToArray(typeof(string)); config.LinkFlags = (string[])lnkflags.ToArray(typeof(string)); config.Defines = (string[])defines.ToArray(typeof(string)); config.IncludePaths = (string[])incpaths.ToArray(typeof(string)); config.Links = (string[])links.ToArray(typeof(string)); config.LibPaths = (string[])libpaths.ToArray(typeof(string)); Match(""); } Match("!ENDIF"); Match(""); Match("# Begin Target"); Match(""); foreach (Configuration config in package.Config) Match("# Name \"" + package.Name + " - " + config.Name + "\""); string folder = ""; while (!Match("# End Target", true)) { matches = Regex("# Begin Group \"(.+)\"", true); if (matches != null) { folder = Path.Combine(folder, matches[0]); Match(""); Match("# PROP Default_Filter \"\""); continue; } matches = Regex("# End Group", true); if (matches != null) { folder = Path.GetDirectoryName(folder); continue; } Match("# Begin Source File"); Match(""); matches = Regex("SOURCE=(.+)"); filename = matches[0]; package.File.Add(filename); if (filename.StartsWith("./")) filename = filename.Substring(2); while (filename.StartsWith("../")) filename = filename.Substring(3); if (Path.GetDirectoryName(filename) != folder) throw new FormatException("File '" + matches[0] + "' is in folder '" + folder + "'"); Match("# End Source File"); } } #endregion } } premake-3.7.orig/Tests/Vs6/Test_Packages.cs0000644000000000000000000000157710446776604015510 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6 { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_C() { _script.Replace("c++", "c"); _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cpp() { _expects.Package[0].Language = "c++"; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/0000755000000000000000000000000011065434617013145 5ustar premake-3.7.orig/Tests/Vs6/Cpp/Test_Files.cs0000644000000000000000000000245510446776604015552 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cpp','file2.cpp'"); _expects.Package[0].File.Add("file1.cpp"); _expects.Package[0].File.Add("file2.cpp"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','Src/Base/file2.cpp'"); _expects.Package[0].File.Add("Src/file1.cpp"); _expects.Package[0].File.Add("Src/Base/file2.cpp"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','../Help/file2.cpp'"); _expects.Package[0].File.Add("Src/file1.cpp"); _expects.Package[0].File.Add("../Help/file2.cpp"); Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_ImportLib.cs0000644000000000000000000000221710446776604016405 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_ImportLib { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("dll", "c++"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_WithImportLib() { _expects.Package[0].Config[0].ImportLib = "lib/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "lib/MyPackage.lib"; Run(); } [Test] public void Test_NoImportLib() { _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].ImportLib = "obj/Debug/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "obj/Release/MyPackage.lib"; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_Target.cs0000644000000000000000000000574710644201105015720 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp.exe"; _expects.Package[0].Config[1].Target = "MyApp.exe"; Run(); } [Test] public void Test_SetOnPackageConfig() { _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void TargetAppliedToImportLib() { _script.Replace("'exe'", "'dll'"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "bin/MyApp"; _expects.Package[0].Config[0].ImportLib = "lib/MyApp/MyPackage.lib"; _expects.Package[0].Config[1].OutDir = "bin/MyApp"; _expects.Package[0].Config[1].ImportLib = "lib/MyApp/MyPackage.lib"; Run(); } [Test] public void TargetAppliedToStaticLib() { _script.Replace("'exe'", "'lib'"); _script.Append("package.target = 'MyLib'"); _expects.Package[0].Config[0 ].Target = "MyLib.lib"; _expects.Package[0].Config[1].Target = "MyLib.lib"; Run(); } #endregion #region Custom Target Tests [Test] public void Test_CustomTarget() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.zmf"; Run(); } [Test] public void Test_CustomTarget_SetOnConfig() { _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs6/Cpp/Test_IncludePaths.cs0000644000000000000000000000372410446776604017073 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_IncludePaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoIncludePaths() { _expects.Package[0].Config[0].IncludePaths = new string[] { }; _expects.Package[0].Config[1].IncludePaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.includepaths = { '../src', '../include' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.includepaths = { '../package' }"); _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_Dependencies.cs0000644000000000000000000000322110446776604017066 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } [Test] public void Test_ExeAndLib() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_BuildFlags.cs0000644000000000000000000001240010446776604016513 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'no-rtti' }"); _script.Append("package.config['Release'].buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "no-exceptions" }; Run(); } [Test] public void Test_ExtraWarnings() { _script.Append("package.buildflags = { 'extra-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "extra-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "extra-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoExceptions() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoFramePointer() { _script.Append("package.buildflags = { 'no-frame-pointer' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-frame-pointer" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-frame-pointer", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoImportLib() { _script.Replace("exe", "dll"); _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-import-lib" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-import-lib", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoMain() { _script.Append("package.buildflags = { 'no-main' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-main" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-main", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoRtti() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSize() { _script.Append("package.buildflags = { 'optimize-size' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-size" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-size", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSpeed() { /* VS6 only has two built in optimization levels */ _script.Append("package.buildflags = { 'optimize-speed' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_StaticRuntime() { _script.Append("package.buildflags = { 'static-runtime' }"); _expects.Package[0].Config[0].LinkFlags = new string[] { "static-runtime" }; _expects.Package[0].Config[1].LinkFlags = new string[] { "static-runtime" }; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_BuildOptions.cs0000644000000000000000000000300610462427663017110 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_BuildOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.buildoptions = { 'pkgopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].buildoptions = { 'dbgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "dbgopt"; _expects.Package[0].Config[1].BuildOptions = "relopt"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.buildoptions = { 'pkgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt relopt"; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_Links.cs0000644000000000000000000000322010446776604015557 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.lib", "lib2.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib", "lib2.lib" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.lib", "liba-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.lib", "liba.lib" }; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_Defines.cs0000644000000000000000000000362210446776604016062 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT=__declspec(dllexport)' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_OutputDirs.cs0000644000000000000000000000501610446776604016626 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion #region LibDir Tests [Test] public void Test_LibDir_Default() { _expects.Package[0].Config[0].LibDir = "."; _expects.Package[0].Config[1].LibDir = "."; Run(); } [Test] public void Test_LibDir_SetAtProject() { _script.Append("project.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } [Test] public void Test_LibDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].libdir = 'lib/Debug'"); _script.Append("project.config['Release'].libdir = 'lib/Release'"); _expects.Package[0].Config[0].LibDir = "lib/Debug"; _expects.Package[0].Config[1].LibDir = "lib/Release"; Run(); } #endregion #region ObjDir Tests [Test] public void Test_ObjDir_Default() { _expects.Package[0].Config[0].ObjDir = "obj/Debug"; _expects.Package[0].Config[1].ObjDir = "obj/Release"; Run(); } [Test] public void Test_ObjDir_SetAtPackage() { _script.Append("package.objdir = 'temp'"); _expects.Package[0].Config[0].ObjDir = "temp/Debug"; _expects.Package[0].Config[1].ObjDir = "temp/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs6/Cpp/Test_Resources.cs0000644000000000000000000000533410526373152016447 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Resources { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_UsesIncludePaths() { _script.Append("package.includepaths = { 'include' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include" }; Run(); } [Test] public void Test_UsesResourcePaths() { _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "resources" }; Run(); } [Test] public void Test_MergesIncludeAndResourcePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include", "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include", "resources" }; Run(); } [Test] public void Test_UsesDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "_DEBUG", "MYDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "NDEBUG", "MYDEFINE" }; Run(); } [Test] public void Test_UsesResourceDefines() { _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "_DEBUG", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "NDEBUG", "RESDEFINE" }; Run(); } [Test] public void Test_UsesDefinesAndResourceDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "_DEBUG", "MYDEFINE", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "NDEBUG", "MYDEFINE", "RESDEFINE" }; Run(); } [Test] public void Test_UsesResourceOptions() { _script.Append("package.resoptions = { 'ABC', 'XYZ' }"); _expects.Package[0].Config[0].ResOptions = "ABC XYZ"; _expects.Package[0].Config[1].ResOptions = "ABC XYZ"; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_Kinds.cs0000644000000000000000000000314210446776604015552 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsLib() { _script.Replace("exe", "lib"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "lib"; Run(); } [Test] public void Test_MixedKinds() { _script.Append("package.config['Debug'].kind = 'lib'"); _script.Append("package.config['Release'].kind = 'dll'"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Vs6/Cpp/Test_LibPaths.cs0000644000000000000000000000362410446776604016215 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs6.Cpp { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs6Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/premake.lua0000644000000000000000000000052710446776604014107 0ustar package.name = "Premake.Tests" package.kind = "dll" package.language = "c#" -- Adding this for GNU generator on Windows; how does VS.NET find it? if (windows) then package.libpaths = { "C:/Program Files/NUnit 2.2/bin" } end package.links = { "System", "nunit.framework" } package.files = { matchrecursive("*.cs") } premake-3.7.orig/Tests/Vs2005/0000755000000000000000000000000011065434613012640 5ustar premake-3.7.orig/Tests/Vs2005/Test_Paths.cs0000644000000000000000000000271110446776604015261 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005 { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = "."; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "MySubDir"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".."; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "..\\PkgDir"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "."; Run(); } } } premake-3.7.orig/Tests/Vs2005/Test_Packages.cs0000644000000000000000000000235510644513216015710 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005 { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_C() { _script.Replace("c++", "c"); _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cpp() { _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cs() { _script.Replace("c++", "c#"); _expects.Package[0].Language = "c#"; Run(); } [Test] public void CanSetProjectGuidWithoutBrackets() { _script.Append("package.guid = 'A5F26200-7A60-4726-AB0D-5D4D5B82B939'"); _expects.Package[0].ID = "A5F26200-7A60-4726-AB0D-5D4D5B82B939"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Vs2005Parser.cs0000644000000000000000000006426510631571250015255 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005 { public class Vs2005Parser : Parser { private int _numAspNet = 0; #region Parser Methods public override string TargetName { get { return "vs2005"; } } #endregion #region Solution Parsing public override void Parse(Project project, string filename) { /* File header */ Begin(filename + ".sln"); Match("Microsoft Visual Studio Solution File, Format Version 9.00"); Match("# Visual Studio 2005"); /* Package entries - VS "projects" */ string[] matches; Hashtable packageDependencies = new Hashtable(); while (!Match("Global", true)) { matches = Regex("Project\\(\"{([0-9A-F-]+)}\"\\) = \"(.+)\", \"(.+)\", \"{([0-9A-F-]+)}\""); Package package = new Package(); project.Package.Add(package); package.Name = matches[1]; package.ID = matches[3]; package.Path = Path.GetDirectoryName(matches[2]); package.ScriptName = Path.GetFileName(matches[2]); switch (matches[0]) { case "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942": package.Language = "c++"; break; case "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC": package.Language = "c#"; break; case "E24C65DC-7377-472B-9ABA-BC803B73C61A": package.Kind = "aspnet"; break; } if (package.Kind == "aspnet") { Match("\tProjectSection(WebsiteProperties) = preProject"); ArrayList deps = new ArrayList(); matches = Regex("\t\tProjectReferences = \"{([0-9A-F-]+)}|(.+).dll;\"", true); while (matches != null) { deps.Add(matches[0]); matches = Regex("\t\tProjectReferences = \"{([0-9A-F-]+)}|(.+).dll;\"", true); } packageDependencies[package.ID] = deps; matches = Regex("\t\t(.+).AspNetCompiler.VirtualPath = \"/" + package.Name + "\"", true); while (matches != null) { string cfg = matches[0]; Match("\t\t" + cfg + ".AspNetCompiler.PhysicalPath = \"" + package.Path + "\\\""); Match("\t\t" + cfg + ".AspNetCompiler.TargetPath = \"PrecompiledWeb\\" + package.Name + "\\\""); Match("\t\t" + cfg + ".AspNetCompiler.Updateable = \"true\""); Match("\t\t" + cfg + ".AspNetCompiler.ForceOverwrite = \"true\""); Match("\t\t" + cfg + ".AspNetCompiler.FixedNames = \"false\""); matches = Regex("\t\t" + cfg + ".AspNetCompiler.Debug = \"(True|False)\""); matches = Regex("\t\t(.+).AspNetCompiler.VirtualPath = \"/" + package.Name + "\"", true); } int port; if (_numAspNet == 0) port = 1106; else if (_numAspNet == 1) port = 1231; else port = 1251 + 2 * (_numAspNet - 2); Match("\t\tVWDPort = \"" + port + "\""); _numAspNet++; matches = Regex("\t\tDefaultWebSiteLanguage = \"(.+)\""); if (matches == null) package.Language = "vbnet"; else if (matches[0] == "Visual C#") package.Language = "c#"; Match("\tEndProjectSection"); } else { /* Collect package dependencies, I'll sort them out after * I finish parsing the scripts below */ Match("\tProjectSection(ProjectDependencies) = postProject"); ArrayList deps = new ArrayList(); while (!Match("\tEndProjectSection", true)) { matches = Regex("\t\t{([0-9A-F-]+)} = {([0-9A-F-]+)}"); if (matches[0] != matches[1]) throw new FormatException("GUID mismatch in ProjectDependencies block, should be the same"); deps.Add(matches[0]); } packageDependencies[package.ID] = deps; } Match("EndProject"); } /* Read the list of configurations...just cache for now, test later */ ArrayList possibleConfigs = new ArrayList(); Match("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); while (!Match("\tEndGlobalSection", true)) { matches = Regex("\t\t(.+)[ ]=[ ](.+)", true); string cfg = matches[0]; if (possibleConfigs.Contains(cfg)) throw new FormatException("Duplicate configuration '" + cfg + "'"); possibleConfigs.Add(cfg); /* Build up my list of scripted package configurations */ matches = cfg.Split('|'); if (!project.Configuration.Contains(matches[0])) project.Configuration.Add(matches[0]); } foreach (Package package in project.Package) package.Config.Add(project); /* Read the list of package configurations...cache and test later */ ArrayList packageConfigs = new ArrayList(); Match("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); while (!Match("\tEndGlobalSection", true)) { string cfg = GetLine(); if (packageConfigs.Contains(cfg)) throw new FormatException("Duplicate configuration '" + cfg + "'"); packageConfigs.Add(cfg); } Match("\tGlobalSection(SolutionProperties) = preSolution"); Match("\t\tHideSolutionNode = FALSE"); Match("\tEndGlobalSection"); Match("EndGlobal"); foreach (Package package in project.Package) { if (package.Kind != "aspnet") { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); switch (package.Language) { case "c++": ParseCpp(project, package, filename); break; case "c#": ParseCs(project, package, filename); break; default: throw new NotImplementedException("Loading of " + package.Language + " packages not implemented"); } } else { foreach (Configuration config in package.Config) config.Kind = "aspnet"; } } /* Now sort out the inter-package dependencies */ foreach (Package package in project.Package) { ArrayList deps = (ArrayList)packageDependencies[package.ID]; string[] deplist = new string[deps.Count]; for (int i = 0; i < deps.Count; ++i) { foreach (Package p2 in project.Package) { if (p2.ID == (string)deps[i]) deplist[i] = p2.Name; } } foreach (Configuration config in package.Config) config.Dependencies = deplist; } /* Now test configurations */ bool hasDotNet = false; bool hasCpp = false; foreach (Package package in project.Package) { if (package.Language == "c" || package.Language == "c++") hasCpp = true; else hasDotNet = true; } ArrayList platforms = new ArrayList(); if (hasDotNet) platforms.Add("Any CPU"); if (hasDotNet && hasCpp) platforms.Add("Mixed Platforms"); if (hasCpp) platforms.Add("Win32"); int c = 0; foreach (Package package in project.Package) { string arch; if (package.Language == "c" || package.Language == "c++") arch = "Win32"; else arch = "Any CPU"; foreach (Configuration config in package.Config) { foreach (string platform in platforms) { string configPlatform = config.Name + "|" + platform; if (!possibleConfigs.Contains(configPlatform)) throw new FormatException(configPlatform + " is not listed in possible configuration"); string root = "\t\t{" + package.ID + "}." + configPlatform + "."; string match = root + "ActiveCfg = " + config.Name + "|" + arch; if (((string)packageConfigs[c]) != match) throw new FormatException("Expected:\n " + match + "\nBut I got:\n " + packageConfigs[c]); c++; if (platform == "MixedPlatforms" || platform == arch) { match = root + "Build.0 = " + config.Name + "|" + arch; if (((string)packageConfigs[c]) != match) throw new FormatException("Expected:\n " + match + "\nBut I got:\n " + packageConfigs[c]); c++; } } } } } #endregion #region C++ Parsing private void ParseCpp(Project project, Package package, string filename) { Begin(filename); Match(""); Match(""); Match("\t"); Match("\t\t"); Match("\t"); Match("\t"); Match("\t"); Match("\t"); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); Match("\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t 0) Match("\t\t\t\tStringPooling=\"true\"", true); if (optimization == 0) Match("\t\t\t\tBasicRuntimeChecks=\"3\"", true); if (optimization == 0) matches = Regex("\t\t\t\tRuntimeLibrary=\"(1|3)\""); else matches = Regex("\t\t\t\tRuntimeLibrary=\"(0|2)\""); if (matches[0] == "0" || matches[0] == "1") config.LinkFlags = new string[] { "static-runtime" }; Match("\t\t\t\tEnableFunctionLevelLinking=\"true\""); if (Match("\t\t\t\tRuntimeTypeInfo=\"false\"", true)) buildFlags.Add("no-rtti"); matches = Regex("\t\t\t\tTreatWChar_tAsBuiltInType=\"(true|false)\"", true); if (matches != null) buildFlags.Add(matches[0] == "true" ? "native-wchar" : "no-native-wchar"); config.Pch = "off"; matches = Regex("\t\t\t\tUsePrecompiledHeader=\"([0-9])\""); if (matches[0] == "2") { config.Pch = "on"; matches = Regex("\t\t\t\tPrecompiledHeaderThrough=\"(.+?)\""); config.PchHeader = matches[0]; } else if (matches[0] != "0") { throw new FormatException("Expected UsePrecompiledHeader to be 2, got " + matches[0]); } matches = Regex("\t\t\t\tWarningLevel=\"([3-4])\""); if (matches[0] == "4") buildFlags.Add("extra-warnings"); if (Match("\t\t\t\tWarnAsError=\"true\"", true)) buildFlags.Add("fatal-warnings"); matches = Regex("\t\t\t\tDetect64BitPortabilityProblems=\"(true|false)\""); if (matches[0] == "false") buildFlags.Add("no-64bit-checks"); matches = Regex("\t\t\t\tDebugInformationFormat=\"([0-9])\""); if (matches[0] == "0") buildFlags.Add("no-symbols"); else if (matches[0] == "3") buildFlags.Add("no-edit-and-continue"); Match("\t\t\t/>"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t 0) { Match("\t\t\t\tOptimizeReferences=\"2\""); Match("\t\t\t\tEnableCOMDATFolding=\"2\""); } if (config.Kind == "exe" || config.Kind == "winexe") { if (!Match("\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"", true)) buildFlags.Add("no-main"); } else { matches = Regex("\t\t\t\tImportLibrary=\"(.+)\""); config.ImportLib = matches[0]; } Match("\t\t\t\tTargetMachine=\"1\""); } Match("\t\t\t/>"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t"); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("\t"); Match("\t"); Match("\t"); Match("\t"); string indent = "\t"; string folder = ""; while (!Match("\t", true)) { if (Match(indent + "\t"); } else if (Match(indent + "", true)) { indent = indent.Substring(0, indent.Length - 1); folder = Path.GetDirectoryName(folder); } else { Match(indent + "\t]?)"); package.File.Add(matches[0]); /* Make sure file appears in the correct folder */ filename = matches[0]; if (filename.StartsWith(".\\")) filename = filename.Substring(2); while (filename.StartsWith("..\\")) filename = filename.Substring(3); if (Path.GetDirectoryName(filename) != folder) throw new FormatException("File '" + matches[0] + "' is in folder '" + folder + "'"); /* Check for file configuration section */ if (matches[1] == "") { Match(indent + "\t\t>"); foreach (Configuration config in package.Config) { config.PchSource = filename; Match(indent + "\t\t"); Match(indent + "\t\t\t"); Match(indent + "\t\t"); } } Match(indent + "\t"); } } if (indent != "\t") throw new FormatException("Unclosed entity in block"); Match("\t"); Match("\t"); Match(""); } #endregion #region C# Parsing private void ParseCs(Project project, Package package, string filename) { string kind = package.Kind; Begin(filename); Match(""); Match(" "); string[] matches; matches = Regex(" (.+)"); string defaultConfigName = matches[0]; Match(" AnyCPU"); Match(" 8.0.50727"); Match(" 2.0"); Match(" {" + package.ID + "}"); matches = Regex(" (.+)"); if (kind == null) { switch (matches[0]) { case "Exe": kind = "exe"; break; case "WinExe": kind = "winexe"; break; case "Library": kind = "dll"; break; default: throw new FormatException("Unexpected value: OutputType = \"" + matches[0] + "\""); } } else if (matches[0] != "Library") { throw new FormatException("Output type must be 'library' for ASP.NET applications"); } Match(" Properties"); matches = Regex("(.+)"); string target = matches[0]; Match(" " + target + ""); Match(" "); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); config.Kind = kind; config.Target = target; Match(" "); if (!Match(" true", true)) { buildFlags.Add("no-symbols"); Match(" pdbonly"); } else { Match(" full"); } matches = Regex(" (true|false)"); if (matches[0] == "true") buildFlags.Add("optimize"); matches = Regex(" (.*)\\\\"); config.BinDir = matches[0]; config.OutDir = matches[0]; matches = Regex(" (.*)"); config.Defines = matches[0].Split(';'); if (config.Defines[0] == String.Empty) config.Defines = new string[] { }; Match(" prompt"); Match(" 4"); if (Match(" true", true)) buildFlags.Add("unsafe"); if (Match(" true", true)) buildFlags.Add("fatal-warnings"); Match(" "); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } ArrayList links = new ArrayList(); Match(" "); while (!Match(" ", true)) { matches = Regex(" ", true); if (matches != null) { string name = matches[0]; links.Add(name); } matches = Regex(" ", true); if (matches != null) { matches = Regex(" {([0-9A-F-]+)}"); matches = Regex(" (.+)"); Match(" "); string name = matches[0]; links.Add(name); } } foreach (Configuration config in package.Config) { config.Links = (string[])links.ToArray(typeof(string)); } Match(" "); while (!Match(" ", true)) { matches = Regex(" <(.+) Include=\"(.+)\"(>| />)"); string action = matches[0]; string name = matches[1]; string endtag = matches[2]; string subtype = ""; string depends = ""; if (action == "Compile" && endtag == ">") { subtype = "code"; while (!Match(" ", true)) { matches = Regex(" (.+)", true); if (matches != null) subtype = matches[0]; if (Match(" True", true)) subtype = "autogen"; matches = Regex(" (.+)", true); if (matches != null) depends = matches[0]; } } else { subtype = "code"; } if (action == "EmbeddedResource" && endtag == ">") { while (!Match(" ", true)) { matches = Regex(" (.+)", true); if (matches != null) subtype = matches[0]; matches = Regex(" (.+)", true); if (matches != null) depends = matches[0]; if (Match(" ResXFileCodeGenerator", true)) { subtype = "autogen"; Match(" " + Path.GetFileNameWithoutExtension(name) + ".Designer.cs"); } } } if (action == "Content") { Match(" PreserveNewest"); Match(" "); } package.File.Add(name, subtype, action, depends); } Match(" "); Match(" "); Match(""); if (kind != "aspnet") ParseUserFile(project, package, filename); } private void ParseUserFile(Project project, Package package, string filename) { Begin(filename + ".user"); Match(""); Match(" "); string[] matches = Regex(" (.+)"); matches = matches[0].Split(';'); string[] libpaths = new string[matches.Length - 1]; /* VS.NET stores reference directories as absolute paths, so I need * to do some ugly trickery here */ string[] bindir = matches[matches.Length - 1].Split('\\'); for (int i = 0; i < matches.Length - 1; ++i) { string[] thisdir = matches[i].Split('\\'); int j = 0; while (j < bindir.Length && j < thisdir.Length && bindir[j] == thisdir[j]) ++j; string path = ""; for (int k = j + 1; k < bindir.Length; ++k) path += "..\\"; for (int k = j; k < thisdir.Length; ++k) path += thisdir[k] + '\\'; libpaths[i] = path.Substring(0, path.Length - 1); libpaths[i] = libpaths[i].Replace("/", "\\"); } foreach (Configuration config in package.Config) { config.LibPaths = libpaths; } Match(" "); Match(""); } #endregion } } premake-3.7.orig/Tests/Vs2005/Cpp/0000755000000000000000000000000011065434613013362 5ustar premake-3.7.orig/Tests/Vs2005/Cpp/Test_Files.cs0000644000000000000000000000321110446776604015762 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cpp','file2.cpp'"); _expects.Package[0].File.Add(".\\file1.cpp"); _expects.Package[0].File.Add(".\\file2.cpp"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','Src/Base/file2.cpp'"); _expects.Package[0].File.Add(".\\Src\\file1.cpp"); _expects.Package[0].File.Add(".\\Src\\Base\\file2.cpp"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','../Help/file2.cpp'"); _expects.Package[0].File.Add(".\\Src\\file1.cpp"); _expects.Package[0].File.Add("..\\Help\\file2.cpp"); Run(); } [Test] public void Test_DefFile() { _script.Replace("'exe'", "'dll'"); _script.Replace("'somefile.txt'", "'file0.cpp','exports.def'"); _expects.Package[0].File.Add(".\\file0.cpp"); _expects.Package[0].File.Add(".\\exports.def"); _expects.Package[0].DefFile = "exports.def"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_ImportLib.cs0000644000000000000000000000222510446776604016625 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_ImportLib { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("dll", "c++"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_WithImportLib() { _expects.Package[0].Config[0].ImportLib = "lib/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "lib/MyPackage.lib"; Run(); } [Test] public void Test_NoImportLib() { _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].ImportLib = "obj/Debug/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "obj/Release/MyPackage.lib"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Pch.cs0000644000000000000000000000377310631571250015431 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Pch { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void PchDefaultsToOff() { _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } [Test] public void NoPchTurnsItOff() { _script.Append("package.buildflags = {'no-pch'}"); _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } [Test] public void PchOnWhenPchHeaderIsSet() { _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].Pch = "on"; _expects.Package[0].Config[1].Pch = "on"; Run(); } [Test] public void PchHeaderIsSet() { _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].PchHeader = "stdafx.h"; _expects.Package[0].Config[1].PchHeader = "stdafx.h"; Run(); } [Test] public void PchSourceIsSet() { _script.Replace("'somefile.txt'", "'stdafx.cpp'"); _script.Append("package.pchheader = 'stdafx.h'"); _script.Append("package.pchsource = 'stdafx.cpp'"); _expects.Package[0].Config[0].PchSource = "stdafx.cpp"; _expects.Package[0].Config[1].PchSource = "stdafx.cpp"; Run(); } [Test] public void PchOffWithFlagAndHeader() { _script.Append("package.buildflags = {'no-pch'}"); _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Target.cs0000644000000000000000000000516310524433425016142 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp.exe"; _expects.Package[0].Config[1].Target = "MyApp.exe"; Run(); } [Test] public void Test_SetOnPackageConfig() { _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void TargetAppliedToImportLib() { _script.Replace("'exe'", "'dll'"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "bin/MyApp"; _expects.Package[0].Config[0].ImportLib = "lib/MyApp/MyPackage.lib"; _expects.Package[0].Config[1].OutDir = "bin/MyApp"; _expects.Package[0].Config[1].ImportLib = "lib/MyApp/MyPackage.lib"; Run(); } [Test] public void Test_CustomTarget() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.zmf"; Run(); } [Test] public void Test_CustomTarget_SetOnConfig() { _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_IncludePaths.cs0000644000000000000000000000373210446776604017313 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_IncludePaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoIncludePaths() { _expects.Package[0].Config[0].IncludePaths = new string[] { }; _expects.Package[0].Config[1].IncludePaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.includepaths = { '../src', '../include' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.includepaths = { '../package' }"); _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Dependencies.cs0000644000000000000000000000322710446776604017315 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } [Test] public void Test_ExeAndLib() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_BuildFlags.cs0000644000000000000000000001651010570623520016724 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _script.Append("package.config['Release'].buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "no-exceptions" }; Run(); } [Test] public void Test_ExtraWarnings() { _script.Append("package.buildflags = { 'extra-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "extra-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "extra-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_No64BitChecks() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoExceptions() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoFramePointer() { _script.Append("package.buildflags = { 'no-frame-pointer' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-frame-pointer" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-frame-pointer", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoImportLib() { _script.Replace("exe", "dll"); _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-import-lib" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-import-lib", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoMain() { _script.Append("package.buildflags = { 'no-main' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-main" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-main", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoRtti() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSize() { _script.Append("package.buildflags = { 'optimize-size' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-size", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-size", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSpeed() { _script.Append("package.buildflags = { 'optimize-speed' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-speed", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-speed", "no-symbols" }; Run(); } [Test] public void OptimizeReleaseBuildWithSymbols() { _script.Append("package.buildflags = { 'optimize' }"); _script.Append("package.config['Release'].buildflags = { 'no-edit-and-continue' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; Run(); } [Test] public void Test_SehExceptions() { _script.Append("package.buildflags = { 'seh-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "seh-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "seh-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_Unicode() { _script.Append("package.buildflags = { 'unicode' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unicode" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unicode", "optimize", "no-symbols" }; Run(); } [Test] public void NativeWChar() { _script.Append("package.buildflags = { 'native-wchar' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "native-wchar" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "native-wchar", "optimize", "no-symbols" }; Run(); } [Test] public void NoNativeWChar() { _script.Append("package.buildflags = { 'no-native-wchar' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-native-wchar" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-native-wchar", "optimize", "no-symbols" }; Run(); } [Test] public void NoManifest() { _script.Append("package.buildflags = { 'no-manifest' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-manifest" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-manifest", "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_BuildOptions.cs0000644000000000000000000000301410462427663017330 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_BuildOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.buildoptions = { 'pkgopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].buildoptions = { 'dbgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "dbgopt"; _expects.Package[0].Config[1].BuildOptions = "relopt"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.buildoptions = { 'pkgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt relopt"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Links.cs0000644000000000000000000000322610446776604016006 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.lib", "lib2.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib", "lib2.lib" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.lib", "liba-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.lib", "liba.lib" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Defines.cs0000644000000000000000000000363010446776604016302 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT=__declspec(dllexport)' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_OutputDirs.cs0000644000000000000000000000705110512511304017022 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } [Test] public void BinDir_FromSubDir() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _expects.Package[0].Config[0].BinDir = "../bin"; _expects.Package[0].Config[1].BinDir = "../bin"; Run(); } [Test] public void BinDir_SetAtPackage() { _script.Append("package.path = 'MyPackage'"); _script.Append("package.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } #endregion #region LibDir Tests [Test] public void LibDir_Default() { _expects.Package[0].Config[0].LibDir = "."; _expects.Package[0].Config[1].LibDir = "."; Run(); } [Test] public void LibDir_SetAtProject() { _script.Append("project.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } [Test] public void LibDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].libdir = 'lib/Debug'"); _script.Append("project.config['Release'].libdir = 'lib/Release'"); _expects.Package[0].Config[0].LibDir = "lib/Debug"; _expects.Package[0].Config[1].LibDir = "lib/Release"; Run(); } [Test] public void LibDir_FromSubDir() { _script.Append("project.libdir = 'lib'"); _script.Append("package.path = 'MyPackage'"); _expects.Package[0].Config[0].LibDir = "../lib"; _expects.Package[0].Config[1].LibDir = "../lib"; Run(); } [Test] public void LibDir_SetAtPackage() { _script.Append("package.path = 'MyPackage'"); _script.Append("package.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } #endregion #region ObjDir Tests [Test] public void ObjDir_Default() { _expects.Package[0].Config[0].ObjDir = "obj/Debug"; _expects.Package[0].Config[1].ObjDir = "obj/Release"; Run(); } [Test] public void ObjDir_SetAtPackage() { _script.Append("package.objdir = 'temp'"); _expects.Package[0].Config[0].ObjDir = "temp/Debug"; _expects.Package[0].Config[1].ObjDir = "temp/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Resources.cs0000644000000000000000000000524610526373152016672 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Resources { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_UsesIncludePaths() { _script.Append("package.includepaths = { 'include' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include" }; Run(); } [Test] public void Test_UsesResourcePaths() { _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "resources" }; Run(); } [Test] public void Test_MergesIncludeAndResourcePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include", "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include", "resources" }; Run(); } [Test] public void Test_UsesDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE" }; Run(); } [Test] public void Test_UsesResourceDefines() { _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "RESDEFINE" }; Run(); } [Test] public void Test_UsesDefinesAndResourceDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; Run(); } [Test] public void Test_UsesResourceOptions() { _script.Append("package.resoptions = { 'ABC', 'XYZ' }"); _expects.Package[0].Config[0].ResOptions = "ABC XYZ"; _expects.Package[0].Config[1].ResOptions = "ABC XYZ"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_Kinds.cs0000644000000000000000000000315010446776604015772 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsLib() { _script.Replace("exe", "lib"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "lib"; Run(); } [Test] public void Test_MixedKinds() { _script.Append("package.config['Debug'].kind = 'lib'"); _script.Append("package.config['Release'].kind = 'dll'"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cpp/Test_LibPaths.cs0000644000000000000000000000363210446776604016435 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cpp { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/0000755000000000000000000000000011065434613013205 5ustar premake-3.7.orig/Tests/Vs2005/Cs/Test_Files.cs0000644000000000000000000000255510446776604015617 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion /* Note: VS.NET *requires* backslash in source file names */ [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cs','file2.cs'"); _expects.Package[0].File.Add("file1.cs"); _expects.Package[0].File.Add("file2.cs"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("Src\\file1.cs"); _expects.Package[0].File.Add("Src\\Base\\file2.cs"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cs','../Help/file2.cs'"); _expects.Package[0].File.Add("Src\\file1.cs"); _expects.Package[0].File.Add("..\\Help\\file2.cs"); Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_Target.cs0000644000000000000000000000414110446776604015774 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run(); } [Test] public void Test_SetOnPackageConfig() { /* Config specific target not supported for C# */ _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage-d"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_TargetInPackageDir() { _script.Append("package.path = 'MyPackage'"); _script.Append("package.target = package.path .. '/bin/MyTarget'"); _expects.Package[0].Config[0].OutDir = "../MyPackage/bin"; _expects.Package[0].Config[0].Target = "MyTarget"; _expects.Package[0].Config[1].OutDir = "../MyPackage/bin"; _expects.Package[0].Config[1].Target = "MyTarget"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2005/Cs/Test_BuildActions.cs0000644000000000000000000000563410446776604017136 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_BuildActions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultCodeAction() { _script.Replace("'somefile.txt'", "'file0.cs'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); Run(); } [Test] public void Test_CodeWithDesigner() { _script.Replace("'somefile.txt'", "'file0.cs','file0.Designer.cs'"); _expects.Package[0].File.Add("file0.cs", "Form", "Compile"); _expects.Package[0].File.Add("file0.Designer.cs", "code", "Compile", "file0.cs"); Run(); } [Test] public void Test_CodeAutoGenFromResx() { _script.Replace("'somefile.txt'", "'file0.resx','file0.Designer.cs'"); _expects.Package[0].File.Add("file0.resx", "autogen", "EmbeddedResource"); _expects.Package[0].File.Add("file0.Designer.cs", "autogen", "Compile", "file0.resx"); Run(); } [Test] public void Test_CodeAsContent() { _script.Replace("'somefile.txt'", "'file0.cs','file1.cs'"); _script.Append("package.config['file1.cs'].buildaction = 'Content'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); _expects.Package[0].File.Add("file1.cs", "Content"); Run(); } [Test] public void Test_ResxAction() { _script.Replace("'somefile.txt'", "'file0.resx'"); _expects.Package[0].File.Add("file0.resx", null, "EmbeddedResource"); Run(); } [Test] public void Test_ResxWithDependencyAction() { _script.Replace("'somefile.txt'", "'file0.resx','file0.cs'"); _expects.Package[0].File.Add("file0.resx", null, "EmbeddedResource", "file0.cs"); _expects.Package[0].File.Add("file0.cs"); Run(); } [Test] public void Test_ResxWithForm() { _script.Replace("'somefile.txt'", "'file0.cs','file0.Designer.cs','file0.resx'"); _expects.Package[0].File.Add("file0.cs", "Form", "Compile"); _expects.Package[0].File.Add("file0.Designer.cs", "code", "Compile", "file0.cs"); _expects.Package[0].File.Add("file0.resx", "Designer", "EmbeddedResource", "file0.cs"); Run(); } [Test] public void Test_DefaultBuildAction() { _expects.Package[0].File.Add("somefile.txt", "None"); Run(); } [Test] public void Test_CustomBuildAction() { _script.Append("package.config['somefile.txt'].buildaction = 'EmbeddedResource'"); _expects.Package[0].File.Add("somefile.txt", "EmbeddedResource"); Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_Dependencies.cs0000644000000000000000000000327410446776604017142 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cs')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } [Test] public void Test_AspNetAndDll() { _script.Replace("'exe'", "'aspnet'"); _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cs')"); _expects.Package[0].Config[0].Dependencies = new string[] { "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[] { "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_BuildFlags.cs0000644000000000000000000000534210446776604016566 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'unsafe' }"); _script.Append("package.config['Release'].buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "fatal-warnings" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Unsafe() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_Links.cs0000644000000000000000000000333010446776604015625 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1", "lib2" }; _expects.Package[0].Config[1].Links = new string[] { "lib1", "lib2" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d" }; _expects.Package[0].Config[1].Links = new string[] { "lib1-d" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib", "liba-d" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib", "liba-d" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_Defines.cs0000644000000000000000000000352410446776604016127 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_OutputDirs.cs0000644000000000000000000000353410512426101016647 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } [Test] public void BinDir_FromSubDir() { _script.Append("project.bindir = 'bin'"); _script.Append("package.path = 'MyPackage'"); _expects.Package[0].Config[0].BinDir = "../bin"; _expects.Package[0].Config[1].BinDir = "../bin"; Run(); } [Test] public void BinDir_SetAtPackage() { _script.Append("package.path = 'MyPackage'"); _script.Append("package.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2005/Cs/Test_Kinds.cs0000644000000000000000000000252610446776604015623 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsAspNet() { _script.Replace("exe", "aspnet"); _expects.Package[0].Config[0].Kind = "aspnet"; _expects.Package[0].Config[1].Kind = "aspnet"; Run(); } } } premake-3.7.orig/Tests/Vs2005/Cs/Test_LibPaths.cs0000644000000000000000000000364310446776604016262 0ustar using System; using System.IO; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2005.Cs { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2005Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { 'src', 'include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "src", "include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "src", "include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { /* C# doesn't allow per-config lib paths */ _script.Append("package.config['Debug'].libpaths = { 'debug' }"); _script.Append("package.config['Release'].libpaths = { 'release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "debug" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { 'package' }"); _script.Append("package.config['Debug'].libpaths = { 'debug' }"); _script.Append("package.config['Release'].libpaths = { 'release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "package", "debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "package", "debug" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/0000755000000000000000000000000011065434616012640 5ustar premake-3.7.orig/Tests/Vs2002/Test_Paths.cs0000644000000000000000000000272310446776604015261 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002 { [TestFixture] public class Test_Paths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_AllInSameDirectory() { _expects.Package[0].Path = ".\\"; Run(); } [Test] public void Test_PackageInSubDir() { _script.Append("package.path = 'MySubDir'"); _expects.Package[0].Path = "MySubDir\\"; Run(); } [Test] public void Test_ProjectInSubDir() { _script.Append("project.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = "..\\"; Run(); } [Test] public void Test_BothInSubDirs() { _script.Append("project.path = 'BuildDir'"); _script.Append("package.path = 'PkgDir'"); _expects.Path = "BuildDir"; _expects.Package[0].Path = "..\\PkgDir\\"; Run(); } [Test] public void Test_BothInSameSubDir() { _script.Append("project.path = 'Build'"); _script.Append("package.path = 'Build'"); _expects.Path = "Build"; _expects.Package[0].Path = ".\\"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Vs2002Parser.cs0000644000000000000000000005402410631571250015237 0ustar using System; using System.Collections; using System.IO; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002 { public class Vs2002Parser : Parser { #region Parser Methods public override string TargetName { get { return "vs2002"; } } #endregion #region Solution Parsing public override void Parse(Project project, string filename) { /* File header */ Begin(filename + ".sln"); Match("Microsoft Visual Studio Solution File, Format Version 7.00"); /* Package entries - VS "projects" */ string[] matches; do { matches = Regex("Project\\(\"{([0-9A-F-]+)}\"\\) = \"(.+)\", \"(.+)\", \"{([0-9A-F-]+)}\"", true); if (matches != null) { Package package = new Package(); project.Package.Add(package); package.Name = matches[1]; package.ID = matches[3]; package.Path = Path.GetDirectoryName(matches[2]); package.ScriptName = Path.GetFileName(matches[2]); if (package.Path != String.Empty) package.Path += '\\'; switch (matches[0]) { case "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942": package.Language = "c++"; break; case "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC": package.Language = "c#"; break; } Match("EndProject"); } } while (matches != null); Match("Global"); Match("\tGlobalSection(SolutionConfiguration) = preSolution"); /* Read the list of configurations */ int i = 0; do { matches = Regex("\t\tConfigName[.]" + i + "[ ]=[ ](.+)", true); if (matches != null) project.Configuration.Add(matches[0]); ++i; } while (matches != null); Hashtable packageDependencies = new Hashtable(); foreach (Package package in project.Package) { package.Config.Add(project); packageDependencies[package] = new ArrayList(); } Match("\tEndGlobalSection"); /* Collect package dependencies, I'll sort them out after I finish * parsing the scripts below */ Match("\tGlobalSection(ProjectDependencies) = postSolution"); while (!Match("\tEndGlobalSection", true)) { matches = Regex("\t\t{([0-9A-F-]+)}[.]([0-9]+) = {([0-9A-F-]+)}"); foreach (Package p2 in project.Package) { if (p2.ID == matches[0]) { ArrayList pkgdeps = (ArrayList)packageDependencies[p2]; if (int.Parse(matches[1]) != pkgdeps.Count) throw new FormatException("Package dependency index should be " + pkgdeps.Count + ", is " + matches[1]); pkgdeps.Add(matches[2]); } } } Match("\tGlobalSection(ProjectConfiguration) = postSolution"); /* Read the list of package configurations */ foreach (Package package in project.Package) { string arch = (package.Language == "c++") ? "Win32" : ".NET"; foreach (string config in project.Configuration) { string pattern = "\t\t{" + package.ID + "}." + config + ".ActiveCfg = " + config + "|" + arch; Match(pattern); pattern = "\t\t{" + package.ID + "}." + config + ".Build.0 = " + config + "|" + arch; Match(pattern); } } Match("\tEndGlobalSection"); Match("\tGlobalSection(ExtensibilityGlobals) = postSolution"); Match("\tEndGlobalSection"); Match("\tGlobalSection(ExtensibilityAddIns) = postSolution"); Match("\tEndGlobalSection"); Match("EndGlobal"); foreach (Package package in project.Package) { filename = Path.Combine(Path.Combine(project.Path, package.Path), package.ScriptName); switch (package.Language) { case "c++": ParseCpp(project, package, filename); break; case "c#": ParseCs(project, package, filename); break; default: throw new NotImplementedException("Loading of " + package.Language + " packages not implemented"); } } /* Now sort out the inter-package dependencies */ foreach (Package package in project.Package) { ArrayList deps = (ArrayList)packageDependencies[package]; string[] deplist = new string[deps.Count]; for (i = 0; i < deps.Count; ++i) { foreach (Package p2 in project.Package) { if (p2.ID == (string)deps[i]) deplist[i] = p2.Name; } } foreach (Configuration config in package.Config) config.Dependencies = deplist; } } #endregion #region C++ Parsing private void ParseCpp(Project project, Package package, string filename) { Begin(filename); Match(""); Match(""); Match("\t"); Match("\t\t"); Match("\t"); Match("\t"); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); Match("\t\t"); if (matches[0] == "1") buildFlags.Add("unicode"); Match("\t\t\t 0) Match("\t\t\t\tStringPooling=\"TRUE\"", true); if (optimization == 0) Match("\t\t\t\tBasicRuntimeChecks=\"3\"", true); if (optimization == 0) matches = Regex("\t\t\t\tRuntimeLibrary=\"(1|3)\""); else matches = Regex("\t\t\t\tRuntimeLibrary=\"(0|2)\""); if (matches[0] == "0" || matches[0] == "1") config.LinkFlags = new string[] { "static-runtime" }; Match("\t\t\t\tEnableFunctionLevelLinking=\"TRUE\""); if (!Match("\t\t\t\tRuntimeTypeInfo=\"TRUE\"", true)) buildFlags.Add("no-rtti"); matches = Regex("\t\t\t\tTreatWChar_tAsBuiltInType=\"(TRUE|FALSE)\"", true); if (matches != null) buildFlags.Add(matches[0] == "TRUE" ? "native-wchar" : "no-native-wchar"); config.Pch = "auto"; matches = Regex("\t\t\t\tUsePrecompiledHeader=\"([0-9])\""); if (matches[0] == "3") { config.Pch = "on"; matches = Regex("\t\t\t\tPrecompiledHeaderThrough=\"(.+?)\""); config.PchHeader = matches[0]; } else if (matches[0] == "0") { config.Pch = "off"; } else if (matches[0] != "2") { throw new FormatException("Expected UsePrecompiledHeader to be 2, got " + matches[0]); } matches = Regex("\t\t\t\tWarningLevel=\"([3-4])\""); if (matches[0] == "4") buildFlags.Add("extra-warnings"); if (Match("\t\t\t\tWarnAsError=\"TRUE\"", true)) buildFlags.Add("fatal-warnings"); matches = Regex("\t\t\t\tDetect64BitPortabilityProblems=\"(TRUE|FALSE)\""); if (matches[0] == "FALSE") buildFlags.Add("no-64bit-checks"); matches = Regex("\t\t\t\tDebugInformationFormat=\"([0-9])\"/>"); if (matches[0] == "0") buildFlags.Add("no-symbols"); else if (matches[0] == "3") buildFlags.Add("no-edit-and-continue"); Match("\t\t\t"); Match("\t\t\t"); config.Target = matches[0]; } else { Match("\t\t\t\tName=\"VCLinkerTool\""); matches = Regex("\t\t\t\tAdditionalDependencies=\"(.+)\"", true); if (matches != null) config.Links = matches[0].Split(' '); if (Match("\t\t\t\tIgnoreImportLibrary=\"TRUE\"", true)) buildFlags.Add("no-import-lib"); matches = Regex("\t\t\t\tOutputFile=\"\\$\\(OutDir\\)/(.+)\""); config.Target = matches[0]; Match("\t\t\t\tLinkIncremental=\"" + (optimization == 0 ? 2 : 1) + "\""); matches = Regex("\t\t\t\tAdditionalLibraryDirectories=\"(.+)\""); matches = matches[0].Split(';'); config.LibDir = matches[0]; if (config.LibDir != config.OutDir) config.BinDir = config.OutDir; config.LibPaths = new string[matches.Length - 1]; for (int i = 0; i < matches.Length - 1; ++i) config.LibPaths[i] = matches[i + 1]; matches = Regex("\t\t\t\tModuleDefinitionFile=\"(.+)\"", true); if (matches != null) package.DefFile = matches[0]; if (Match("\t\t\t\tGenerateManifest=\"FALSE\"", true)) buildFlags.Add("no-manifest"); string expected = buildFlags.Contains("no-symbols") ? "FALSE" : "TRUE"; Match("\t\t\t\tGenerateDebugInformation=\"" + expected + "\""); if (!buildFlags.Contains("no-symbols")) Match("\t\t\t\tProgramDatabaseFile=\"$(OutDir)/" + Path.GetFileNameWithoutExtension(config.Target) + ".pdb\""); matches = Regex("\t\t\t\tSubSystem=\"([0-9])\""); if (config.Kind == "exe" && matches[0] == "2") config.Kind = "winexe"; if (optimization > 0) { Match("\t\t\t\tOptimizeReferences=\"2\""); Match("\t\t\t\tEnableCOMDATFolding=\"2\""); } if (config.Kind == "exe" || config.Kind == "winexe") { if (!Match("\t\t\t\tEntryPointSymbol=\"mainCRTStartup\"", true)) buildFlags.Add("no-main"); } else { matches = Regex("\t\t\t\tImportLibrary=\"(.+)\""); config.ImportLib = matches[0]; } Match("\t\t\t\tTargetMachine=\"1\"/>"); } Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t"); Match("\t\t\t", true)) { Match("\t\t\t\tName=\"VCResourceCompilerTool\""); matches = Regex("\t\t\t\tAdditionalOptions=\"(.+)\"(.*)", true); config.ResOptions = (matches != null) ? matches[0] : ""; matches = Regex("\t\t\t\tPreprocessorDefinitions=\"(.+)\"(.*)", true); config.ResDefines = (matches != null) ? matches[0].Split(';') : new string[] { }; matches = Regex("\t\t\t\tAdditionalIncludeDirectories=\"(.+)\"(.*)", true); config.ResPaths = (matches != null) ? matches[0].Split(';') : new string[] { }; } Match("\t\t\t"); Match("\t\t\t"); Match("\t\t"); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("\t"); Match("\t"); string indent = "\t"; string folder = ""; while (!Match("\t", true)) { if (Match(indent + "\t"); } else if (Match(indent + "", true)) { indent = indent.Substring(0, indent.Length - 1); folder = Path.GetDirectoryName(folder); } else { Match(indent + "\t"); package.File.Add(matches[0]); /* Make sure file appears in the correct folder */ filename = matches[0]; if (filename.StartsWith(".\\")) filename = filename.Substring(2); while (filename.StartsWith("..\\")) filename = filename.Substring(3); if (Path.GetDirectoryName(filename) != folder) throw new FormatException("File '" + matches[0] + "' is in folder '" + folder + "'"); /* Check for file configuration section */ foreach (Configuration config in package.Config) { if (Match(indent + "\t\t"); Match(indent + "\t\t\t"); Match(indent + "\t\t"); } } Match(indent + "\t"); } } if (indent != "\t") throw new FormatException("Unclosed entity in block"); Match("\t"); Match("\t"); Match(""); } #endregion #region C# Parsing private void ParseCs(Project project, Package package, string filename) { string kind = null; Begin(filename); Match(""); Match("\t"); Match("\t\t"); Match("\t\t\t"); foreach (Configuration config in package.Config) { ArrayList buildFlags = new ArrayList(); config.Target = target; Match("\t\t\t\t"); config.BuildFlags = (string[])buildFlags.ToArray(typeof(string)); } Match("\t\t\t"); ArrayList links = new ArrayList(); ArrayList lddep = new ArrayList(); Match("\t\t\t"); while (!Match("\t\t\t", true)) { Match("\t\t\t\t"); } foreach (Configuration config in package.Config) { config.Kind = kind; config.Links = (string[])links.ToArray(typeof(string)); config.LinkDeps = (string[])lddep.ToArray(typeof(string)); } Match("\t\t"); Match("\t\t"); Match("\t\t\t"); while (!Match("\t\t\t", true)) { Match("\t\t\t\t"); } Match("\t\t"); Match("\t"); Match(""); if (kind != "aspnet") ParseUserFile(project, package, filename); } private void ParseUserFile(Project project, Package package, string filename) { Begin(filename + ".user"); Match(""); Match("\t"); Match("\t\t"); string[] matches = Regex("\t\t\t"); matches = matches[0].Split(';'); string[] libpaths = new string[matches.Length - 1]; /* VS.NET stores reference directories as absolute paths, so I need * to do some ugly trickery here */ string[] bindir = matches[matches.Length - 1].Split('\\'); for (int i = 0; i < matches.Length - 1; ++i) { string[] thisdir = matches[i].Split('\\'); int j = 0; while (j < bindir.Length && j < thisdir.Length && bindir[j] == thisdir[j]) ++j; string path = ""; for (int k = j + 1; k < bindir.Length; ++k) path += "..\\"; for (int k = j; k < thisdir.Length; ++k) path += thisdir[k] + '\\'; libpaths[i] = path.Substring(0, path.Length - 1); libpaths[i] = libpaths[i].Replace("/", "\\"); } foreach (Configuration config in package.Config) { config.LibPaths = libpaths; Match("\t\t\t\t"); } Match("\t\t\t"); Match("\t\t"); Match("\t\t"); Match("\t"); Match(""); } #endregion } }premake-3.7.orig/Tests/Vs2002/Test_Packages.cs0000644000000000000000000000235510644513216015705 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002 { [TestFixture] public class Test_Packages { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_PackageName() { _expects.Package[0].Name = "MyPackage"; Run(); } [Test] public void Test_C() { _script.Replace("c++", "c"); _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cpp() { _expects.Package[0].Language = "c++"; Run(); } [Test] public void Test_Cs() { _script.Replace("c++", "c#"); _expects.Package[0].Language = "c#"; Run(); } [Test] public void CanSetProjectGuidWithoutBrackets() { _script.Append("package.guid = 'A5F26200-7A60-4726-AB0D-5D4D5B82B939'"); _expects.Package[0].ID = "A5F26200-7A60-4726-AB0D-5D4D5B82B939"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/0000755000000000000000000000000011065434616013362 5ustar premake-3.7.orig/Tests/Vs2002/Cpp/Test_Files.cs0000644000000000000000000000321310446776604015761 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cpp','file2.cpp'"); _expects.Package[0].File.Add(".\\file1.cpp"); _expects.Package[0].File.Add(".\\file2.cpp"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','Src/Base/file2.cpp'"); _expects.Package[0].File.Add(".\\Src\\file1.cpp"); _expects.Package[0].File.Add(".\\Src\\Base\\file2.cpp"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cpp','../Help/file2.cpp'"); _expects.Package[0].File.Add(".\\Src\\file1.cpp"); _expects.Package[0].File.Add("..\\Help\\file2.cpp"); Run(); } [Test] public void Test_DefFile() { _script.Replace("'exe'", "'dll'"); _script.Replace("'somefile.txt'", "'file0.cpp','exports.def'"); _expects.Package[0].File.Add(".\\file0.cpp"); _expects.Package[0].File.Add(".\\exports.def"); _expects.Package[0].DefFile = "exports.def"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_ImportLib.cs0000644000000000000000000000222510446776604016622 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_ImportLib { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("dll", "c++"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_WithImportLib() { _expects.Package[0].Config[0].ImportLib = "lib/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "lib/MyPackage.lib"; Run(); } [Test] public void Test_NoImportLib() { _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].ImportLib = "obj/Debug/MyPackage.lib"; _expects.Package[0].Config[1].ImportLib = "obj/Release/MyPackage.lib"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Pch.cs0000644000000000000000000000377610631571250015431 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Pch { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void PchDefaultsToAuto() { _expects.Package[0].Config[0].Pch = "auto"; _expects.Package[0].Config[1].Pch = "auto"; Run(); } [Test] public void NoPchTurnsItOff() { _script.Append("package.buildflags = {'no-pch'}"); _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } [Test] public void PchOnWhenPchHeaderIsSet() { _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].Pch = "on"; _expects.Package[0].Config[1].Pch = "on"; Run(); } [Test] public void PchHeaderIsSet() { _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].PchHeader = "stdafx.h"; _expects.Package[0].Config[1].PchHeader = "stdafx.h"; Run(); } [Test] public void PchSourceIsSet() { _script.Replace("'somefile.txt'", "'stdafx.cpp'"); _script.Append("package.pchheader = 'stdafx.h'"); _script.Append("package.pchsource = 'stdafx.cpp'"); _expects.Package[0].Config[0].PchSource = "stdafx.cpp"; _expects.Package[0].Config[1].PchSource = "stdafx.cpp"; Run(); } [Test] public void PchOffWithFlagAndHeader() { _script.Append("package.buildflags = {'no-pch'}"); _script.Append("package.pchheader='stdafx.h'"); _expects.Package[0].Config[0].Pch = "off"; _expects.Package[0].Config[1].Pch = "off"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Target.cs0000644000000000000000000000533210524433425016135 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp.exe"; _expects.Package[0].Config[1].Target = "MyApp.exe"; Run(); } [Test] public void Test_SetOnPackageConfig() { _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d.exe"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage.exe"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } [Test] public void TargetAppliedToImportLib() { _script.Replace("'exe'", "'dll'"); _script.Append("project.bindir = 'bin'"); _script.Append("project.libdir = 'lib'"); _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "bin/MyApp"; _expects.Package[0].Config[0].ImportLib = "lib/MyApp/MyPackage.lib"; _expects.Package[0].Config[1].OutDir = "bin/MyApp"; _expects.Package[0].Config[1].ImportLib = "lib/MyApp/MyPackage.lib"; Run(); } #endregion #region Custom Target Tests [Test] public void Test_CustomTarget() { _script.Append("package.targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.zmf"; Run(); } [Test] public void Test_CustomTarget_SetOnConfig() { _script.Append("package.config['Debug'].targetextension = 'zmf'"); _expects.Package[0].Config[0].Target = "MyPackage.zmf"; _expects.Package[0].Config[1].Target = "MyPackage.exe"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_IncludePaths.cs0000644000000000000000000000373210446776604017310 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_IncludePaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoIncludePaths() { _expects.Package[0].Config[0].IncludePaths = new string[] { }; _expects.Package[0].Config[1].IncludePaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.includepaths = { '../src', '../include' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.includepaths = { '../package' }"); _script.Append("package.config['Debug'].includepaths = { '../debug' }"); _script.Append("package.config['Release'].includepaths = { '../release' }"); _expects.Package[0].Config[0].IncludePaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].IncludePaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Dependencies.cs0000644000000000000000000000322710446776604017312 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } [Test] public void Test_ExeAndLib() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'lib'"); _script.Append("package.language = 'c++'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_BuildFlags.cs0000644000000000000000000001600410511227206016713 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _script.Append("package.config['Release'].buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "no-exceptions" }; Run(); } [Test] public void Test_ExtraWarnings() { _script.Append("package.buildflags = { 'extra-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "extra-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "extra-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_No64BitChecks() { _script.Append("package.buildflags = { 'no-64bit-checks' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-64bit-checks" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-64bit-checks", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoExceptions() { _script.Append("package.buildflags = { 'no-exceptions' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-exceptions" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-exceptions", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoFramePointer() { _script.Append("package.buildflags = { 'no-frame-pointer' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-frame-pointer" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-frame-pointer", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoImportLib() { _script.Replace("exe", "dll"); _script.Append("package.buildflags = { 'no-import-lib' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-import-lib" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-import-lib", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoMain() { _script.Append("package.buildflags = { 'no-main' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-main" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-main", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoRtti() { _script.Append("package.buildflags = { 'no-rtti' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-rtti" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-rtti", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSize() { _script.Append("package.buildflags = { 'optimize-size' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-size", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-size", "no-symbols" }; Run(); } [Test] public void Test_OptimizeSpeed() { _script.Append("package.buildflags = { 'optimize-speed' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize-speed", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize-speed", "no-symbols" }; Run(); } [Test] public void OptimizeReleaseBuildWithSymbols() { _script.Append("package.buildflags = { 'optimize' }"); _script.Append("package.config['Release'].buildflags = { 'no-edit-and-continue' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-edit-and-continue" }; Run(); } [Test] public void Test_Unicode() { _script.Append("package.buildflags = { 'unicode' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unicode" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unicode", "optimize", "no-symbols" }; Run(); } [Test] public void NativeWChar() { _script.Append("package.buildflags = { 'native-wchar' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "native-wchar" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "native-wchar", "optimize", "no-symbols" }; Run(); } [Test] public void NoNativeWChar() { _script.Append("package.buildflags = { 'no-native-wchar' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-native-wchar" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-native-wchar", "optimize", "no-symbols" }; Run(); } [Test] public void NoManifest() { _script.Append("package.buildflags = { 'no-manifest' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-manifest" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "no-manifest", "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_BuildOptions.cs0000644000000000000000000000301410462427663017325 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_BuildOptions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetOptionsOnPackage() { _script.Append("package.buildoptions = { 'pkgopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt"; Run(); } [Test] public void Test_SetOptionsOnConfig() { _script.Append("package.config['Debug'].buildoptions = { 'dbgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "dbgopt"; _expects.Package[0].Config[1].BuildOptions = "relopt"; Run(); } [Test] public void Test_SetOptionsOnPackageAndConfig() { _script.Append("package.buildoptions = { 'pkgopt' }"); _script.Append("package.config['Release'].buildoptions = { 'relopt' }"); _expects.Package[0].Config[0].BuildOptions = "pkgopt"; _expects.Package[0].Config[1].BuildOptions = "pkgopt relopt"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Links.cs0000644000000000000000000000322610446776604016003 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1.lib", "lib2.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib", "lib2.lib" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "lib1.lib" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib.lib", "liba-d.lib" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib.lib", "liba.lib" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Defines.cs0000644000000000000000000000363010446776604016277 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT=__declspec(dllexport)' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT=__declspec(dllexport)" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_OutputDirs.cs0000644000000000000000000000502410446776604017043 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion #region LibDir Tests [Test] public void Test_LibDir_Default() { _expects.Package[0].Config[0].LibDir = "."; _expects.Package[0].Config[1].LibDir = "."; Run(); } [Test] public void Test_LibDir_SetAtProject() { _script.Append("project.libdir = 'lib'"); _expects.Package[0].Config[0].LibDir = "lib"; _expects.Package[0].Config[1].LibDir = "lib"; Run(); } [Test] public void Test_LibDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].libdir = 'lib/Debug'"); _script.Append("project.config['Release'].libdir = 'lib/Release'"); _expects.Package[0].Config[0].LibDir = "lib/Debug"; _expects.Package[0].Config[1].LibDir = "lib/Release"; Run(); } #endregion #region ObjDir Tests [Test] public void Test_ObjDir_Default() { _expects.Package[0].Config[0].ObjDir = "obj/Debug"; _expects.Package[0].Config[1].ObjDir = "obj/Release"; Run(); } [Test] public void Test_ObjDir_SetAtPackage() { _script.Append("package.objdir = 'temp'"); _expects.Package[0].Config[0].ObjDir = "temp/Debug"; _expects.Package[0].Config[1].ObjDir = "temp/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Resources.cs0000644000000000000000000000524610526373152016667 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Resources { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_UsesIncludePaths() { _script.Append("package.includepaths = { 'include' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include" }; Run(); } [Test] public void Test_UsesResourcePaths() { _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "resources" }; Run(); } [Test] public void Test_MergesIncludeAndResourcePaths() { _script.Append("package.includepaths = { 'include' }"); _script.Append("package.respaths = { 'resources' }"); _expects.Package[0].Config[0].ResPaths = new string[] { "include", "resources" }; _expects.Package[0].Config[1].ResPaths = new string[] { "include", "resources" }; Run(); } [Test] public void Test_UsesDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE" }; Run(); } [Test] public void Test_UsesResourceDefines() { _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "RESDEFINE" }; Run(); } [Test] public void Test_UsesDefinesAndResourceDefines() { _script.Append("package.defines = { 'MYDEFINE' }"); _script.Append("package.resdefines = { 'RESDEFINE' }"); _expects.Package[0].Config[0].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; _expects.Package[0].Config[1].ResDefines = new string[] { "MYDEFINE", "RESDEFINE" }; Run(); } [Test] public void Test_UsesResourceOptions() { _script.Append("package.resoptions = { 'ABC', 'XYZ' }"); _expects.Package[0].Config[0].ResOptions = "ABC XYZ"; _expects.Package[0].Config[1].ResOptions = "ABC XYZ"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_Kinds.cs0000644000000000000000000000315010446776604015767 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsLib() { _script.Replace("exe", "lib"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "lib"; Run(); } [Test] public void Test_MixedKinds() { _script.Append("package.config['Debug'].kind = 'lib'"); _script.Append("package.config['Release'].kind = 'dll'"); _expects.Package[0].Config[0].Kind = "lib"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cpp/Test_LibPaths.cs0000644000000000000000000000363210446776604016432 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cpp { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c++"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { '../src', '../include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../src", "../include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../src", "../include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../release" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { '../package' }"); _script.Append("package.config['Debug'].libpaths = { '../debug' }"); _script.Append("package.config['Release'].libpaths = { '../release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "../package", "../debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "../package", "../release" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/0000755000000000000000000000000011065434616013205 5ustar premake-3.7.orig/Tests/Vs2002/Cs/Test_Files.cs0000644000000000000000000000255510446776604015614 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_Files { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion /* Note: VS.NET *requires* backslash in source file names */ [Test] public void Test_FilesInRoot() { _script.Replace("'somefile.txt'", "'file1.cs','file2.cs'"); _expects.Package[0].File.Add("file1.cs"); _expects.Package[0].File.Add("file2.cs"); Run(); } [Test] public void Test_FilesInSubDirs() { _script.Replace("'somefile.txt'", "'Src/file1.cs','Src/Base/file2.cs'"); _expects.Package[0].File.Add("Src\\file1.cs"); _expects.Package[0].File.Add("Src\\Base\\file2.cs"); Run(); } [Test] public void Test_FilesAboveDir() { _script.Replace("'somefile.txt'", "'Src/file1.cs','../Help/file2.cs'"); _expects.Package[0].File.Add("Src\\file1.cs"); _expects.Package[0].File.Add("..\\Help\\file2.cs"); Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_Target.cs0000644000000000000000000000325710446776604016000 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_Target { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region Default Target Tests [Test] public void Test_DefaultTarget() { _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } [Test] public void Test_SetOnPackage() { _script.Append("package.target = 'MyApp'"); _expects.Package[0].Config[0].Target = "MyApp"; _expects.Package[0].Config[1].Target = "MyApp"; Run(); } [Test] public void Test_SetOnPackageConfig() { /* Config specific target not supported for C# */ _script.Append("package.config['Debug'].target = 'MyPackage-d'"); _expects.Package[0].Config[0].Target = "MyPackage-d"; _expects.Package[0].Config[1].Target = "MyPackage-d"; Run(); } [Test] public void Test_TargetIncludesPath() { _script.Append("package.target = 'MyApp/MyPackage'"); _expects.Package[0].Config[0].OutDir = "./MyApp"; _expects.Package[0].Config[0].Target = "MyPackage"; _expects.Package[0].Config[1].OutDir = "./MyApp"; _expects.Package[0].Config[1].Target = "MyPackage"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2002/Cs/Test_BuildActions.cs0000644000000000000000000000500210446776604017120 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_BuildActions { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_DefaultCodeAction() { _script.Replace("'somefile.txt'", "'file0.cs'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); Run(); } [Test] public void Test_CodeAsContent() { _script.Replace("'somefile.txt'", "'file0.cs','file1.cs'"); _script.Append("package.config['file1.cs'].buildaction = 'Content'"); _expects.Package[0].File.Add("file0.cs", "code", "Compile"); _expects.Package[0].File.Add("file1.cs", "Content"); Run(); } [Test] public void Test_AspxCodeAction() { _script.Replace("'somefile.txt'", "'file0.aspx.cs'"); _expects.Package[0].File.Add("file0.aspx.cs", "aspxcodebehind", "Compile", "file0.aspx"); Run(); } [Test] public void Test_AspxAction() { _script.Replace("'somefile.txt'", "'file0.aspx'"); _expects.Package[0].File.Add("file0.aspx", "form", "Content"); Run(); } [Test] public void Test_AsaxAction() { _script.Replace("'somefile.txt'", "'file0.asax'"); _expects.Package[0].File.Add("file0.asax", "component", "Content"); Run(); } [Test] public void Test_ResxAction() { _script.Replace("'somefile.txt'", "'file0.resx'"); _expects.Package[0].File.Add("file0.resx", null, "EmbeddedResource"); Run(); } [Test] public void Test_ResxWithDependencyAction() { _script.Replace("'somefile.txt'", "'file0.resx','file0.cs'"); _expects.Package[0].File.Add("file0.resx", null, "EmbeddedResource", "file0.cs"); _expects.Package[0].File.Add("file0.cs"); Run(); } [Test] public void Test_DefaultBuildAction() { _expects.Package[0].File.Add("somefile.txt", "None"); Run(); } [Test] public void Test_CustomBuildAction() { _script.Append("package.config['somefile.txt'].buildaction = 'EmbeddedResource'"); _expects.Package[0].File.Add("somefile.txt", "EmbeddedResource"); Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_Dependencies.cs0000644000000000000000000000221310446776604017127 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_Dependencies { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(2); _expects.Package[0].Config.Add(2); _expects.Package[1].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_ExeAndDll() { _script.Append("package.links = { 'PackageB' }"); _script.Append("package = newpackage()"); _script.Append("package.name = 'PackageB'"); _script.Append("package.kind = 'dll'"); _script.Append("package.language = 'c#'"); _script.Append("package.files = matchfiles('*.cpp')"); _expects.Package[0].Config[0].Dependencies = new string[]{ "PackageB" }; _expects.Package[0].Config[1].Dependencies = new string[]{ "PackageB" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_BuildFlags.cs0000644000000000000000000000534210446776604016563 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_BuildFlags { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_SetFlagOnPackage() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } [Test] public void Test_SetFlagOnConfig() { _script.Append("package.config['Debug'].buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } public void Test_SetFlagOnPackageAndConfig() { _script.Append("package.buildflags = { 'unsafe' }"); _script.Append("package.config['Release'].buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "fatal-warnings" }; Run(); } [Test] public void Test_FatalWarnings() { _script.Append("package.buildflags = { 'fatal-warnings' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "fatal-warnings" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "fatal-warnings", "optimize", "no-symbols" }; Run(); } [Test] public void Test_NoSymbols() { _script.Append("package.buildflags = { 'no-symbols' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "no-symbols" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Optimize() { _script.Append("package.buildflags = { 'optimize' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "optimize" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "optimize", "no-symbols" }; Run(); } [Test] public void Test_Unsafe() { _script.Append("package.buildflags = { 'unsafe' }"); _expects.Package[0].Config[0].BuildFlags = new string[] { "unsafe" }; _expects.Package[0].Config[1].BuildFlags = new string[] { "unsafe", "optimize", "no-symbols" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_Links.cs0000644000000000000000000000333010446776604015622 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_Links { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_LinksOnPackage() { _script.Append("package.links = { 'lib1', 'lib2' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1", "lib2" }; _expects.Package[0].Config[1].Links = new string[] { "lib1", "lib2" }; Run(); } [Test] public void Test_LinksOnPackageConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.config['Debug'].links = { 'lib1-d' }"); _script.Append("package.config['Release'].links = { 'lib1' }"); _expects.Package[0].Config[0].Links = new string[] { "lib1-d" }; _expects.Package[0].Config[1].Links = new string[] { "lib1-d" }; Run(); } [Test] public void Test_LinksOnPackageAndConfig() { /* .NET uses same assemblies for all configs */ _script.Append("package.links = { 'pkglib' }"); _script.Append("package.config['Debug'].links = { 'liba-d' }"); _script.Append("package.config['Release'].links = { 'liba' }"); _expects.Package[0].Config[0].Links = new string[] { "pkglib", "liba-d" }; _expects.Package[0].Config[1].Links = new string[] { "pkglib", "liba-d" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_Defines.cs0000644000000000000000000000352410446776604016124 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_Defines { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoDefines() { _expects.Package[0].Config[0].Defines = new string[] { }; _expects.Package[0].Config[1].Defines = new string[] { }; Run(); } [Test] public void Test_DefinesOnPackage() { _script.Append("package.defines = { 'TRACE', 'EXPORT' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "EXPORT" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "EXPORT" }; Run(); } [Test] public void Test_DefinesInPackageConfig() { _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "NDEBUG" }; Run(); } [Test] public void Test_DefinesOnPackageAndConfig() { _script.Append("package.defines = { 'TRACE' }"); _script.Append("package.config['Debug'].defines = { 'DEBUG' }"); _script.Append("package.config['Release'].defines = { 'NDEBUG' }"); _expects.Package[0].Config[0].Defines = new string[] { "TRACE", "DEBUG" }; _expects.Package[0].Config[1].Defines = new string[] { "TRACE", "NDEBUG" }; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_OutputDirs.cs0000644000000000000000000000251610446776604016671 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_OutputDirs { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion #region BinDir Tests [Test] public void Test_BinDir_Default() { _expects.Package[0].Config[0].BinDir = "."; _expects.Package[0].Config[1].BinDir = "."; Run(); } [Test] public void Test_BinDir_SetAtProject() { _script.Append("project.bindir = 'bin'"); _expects.Package[0].Config[0].BinDir = "bin"; _expects.Package[0].Config[1].BinDir = "bin"; Run(); } [Test] public void Test_BinDir_SetAtProjectConfig() { _script.Append("project.config['Debug'].bindir = 'bin/Debug'"); _script.Append("project.config['Release'].bindir = 'bin/Release'"); _expects.Package[0].Config[0].BinDir = "bin/Debug"; _expects.Package[0].Config[1].BinDir = "bin/Release"; Run(); } #endregion } } premake-3.7.orig/Tests/Vs2002/Cs/Test_Kinds.cs0000644000000000000000000000252610446776604015620 0ustar using System; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_Kinds { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_KindIsExe() { _expects.Package[0].Config[0].Kind = "exe"; _expects.Package[0].Config[1].Kind = "exe"; Run(); } [Test] public void Test_KindIsWinExe() { _script.Replace("exe", "winexe"); _expects.Package[0].Config[0].Kind = "winexe"; _expects.Package[0].Config[1].Kind = "winexe"; Run(); } [Test] public void Test_KindIsDll() { _script.Replace("exe", "dll"); _expects.Package[0].Config[0].Kind = "dll"; _expects.Package[0].Config[1].Kind = "dll"; Run(); } [Test] public void Test_KindIsAspNet() { _script.Replace("exe", "aspnet"); _expects.Package[0].Config[0].Kind = "aspnet"; _expects.Package[0].Config[1].Kind = "aspnet"; Run(); } } } premake-3.7.orig/Tests/Vs2002/Cs/Test_LibPaths.cs0000644000000000000000000000364310446776604016257 0ustar using System; using System.IO; using NUnit.Framework; using Premake.Tests.Framework; namespace Premake.Tests.Vs2002.Cs { [TestFixture] public class Test_LibPaths { Script _script; Project _expects; Parser _parser; #region Setup and Teardown [SetUp] public void Test_Setup() { _script = Script.MakeBasic("exe", "c#"); _expects = new Project(); _expects.Package.Add(1); _expects.Package[0].Config.Add(2); _parser = new Vs2002Parser(); } public void Run() { TestEnvironment.Run(_script, _parser, _expects, null); } #endregion [Test] public void Test_NoLibPaths() { _expects.Package[0].Config[0].LibPaths = new string[] { }; _expects.Package[0].Config[1].LibPaths = new string[] { }; Run(); } [Test] public void Test_PathsOnPackage() { _script.Append("package.libpaths = { 'src', 'include' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "src", "include" }; _expects.Package[0].Config[1].LibPaths = new string[] { "src", "include" }; Run(); } [Test] public void Test_PathsInPackageConfig() { /* C# doesn't allow per-config lib paths */ _script.Append("package.config['Debug'].libpaths = { 'debug' }"); _script.Append("package.config['Release'].libpaths = { 'release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "debug" }; Run(); } [Test] public void Test_PathsOnPackageAndConfig() { _script.Append("package.libpaths = { 'package' }"); _script.Append("package.config['Debug'].libpaths = { 'debug' }"); _script.Append("package.config['Release'].libpaths = { 'release' }"); _expects.Package[0].Config[0].LibPaths = new string[] { "package", "debug" }; _expects.Package[0].Config[1].LibPaths = new string[] { "package", "debug" }; Run(); } } } premake-3.7.orig/Makefile0000644000000000000000000000075111065434775012313 0ustar # Makefile autogenerated by premake # Don't edit this file! Instead edit `premake.lua` then rerun `make` # Options: # CONFIG=[Debug|Release] ifndef CONFIG CONFIG=Debug endif export CONFIG .PHONY: all clean Premake all: Premake Makefile: premake.lua Src/premake.lua @echo ==== Regenerating Makefiles ==== @premake --file $^ --clean --target gnu Premake: @echo ==== Building Premake ==== @$(MAKE) --no-print-directory -C Src clean: @$(MAKE) --no-print-directory -C Src clean premake-3.7.orig/Premake.dsw0000644000000000000000000000103311065435041012733 0ustar Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "Premake"=Src/Premake.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ###############################################################################