2017-11-12 01:38:50 +01:00
// Code Compiler for BlitzLLVM
// Copyright(C) 2017 Michael Fabian Dirks
//
// This program is free software : you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.If not, see <https://www.gnu.org/licenses/>.
# include <iostream>
# include "boost/program_options.hpp"
2017-11-13 02:16:33 +01:00
# include "compiler.hpp"
2017-11-12 01:38:50 +01:00
# include "version.h"
# define LICENSE "Copyright (C) 2017 Michael Fabian Dirks\n\
This program comes with ABSOLUTELY NO WARRANTY, for details launch with `--warranty`. This is free software, and you are welcome to redistribute it under certain conditions."
# define WARRANTY "\
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.EXCEPT WHEN OTHERWISE STATED IN \
WRITING THE COPYRIGHT HOLDERS AND / OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, \
EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \
A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM \
PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION."
2017-11-11 22:32:30 +01:00
int main ( int argc , char * * argv ) {
2017-11-12 01:38:50 +01:00
std : : string optInput ;
bool optQuiet , optVerbose ;
# pragma region Define Program Options
boost : : program_options : : options_description opts_help ( " Generic " ) ;
opts_help . add_options ( )
( " help,h " , " Show this help message. " )
( " warranty " , " Show warranty information. " )
( " quiet,q " , boost : : program_options : : value < bool > ( & optQuiet ) - > default_value ( false ) , " Use quieter logging. " )
( " verbose,v " , boost : : program_options : : value < bool > ( & optVerbose ) - > default_value ( false ) , " Use verbose logging (overrides quiet). " )
;
boost : : program_options : : options_description opts_param ( " Parameters " ) ;
opts_param . add_options ( )
( " input,i " , boost : : program_options : : value < std : : string > ( & optInput ) , " Input .bb file. " )
;
boost : : program_options : : options_description opts ;
opts . add ( opts_help ) . add ( opts_param ) ;
boost : : program_options : : positional_options_description opts_pos ;
opts_pos . add ( " input " , - 1 ) ;
# pragma endregion Define Program Options
# pragma region Convert ArgC / ArgV to Program Options
boost : : program_options : : variables_map vm ;
{
auto clp = boost : : program_options : : command_line_parser ( argc , argv ) ;
boost : : program_options : : store ( clp . options ( opts ) . positional ( opts_pos ) . run ( ) , vm ) ;
boost : : program_options : : notify ( vm ) ;
}
# pragma endregion Convert ArgC / ArgV to Program Options
# pragma region Header, Warranty, Help
// Header
if ( ! optQuiet | | optVerbose ) {
std : : cout
< < " BlitzLLVM Code Compiler "
< < " v " < < VERSION_MAJOR
< < " . " < < VERSION_MINOR
< < " . " < < VERSION_PATCH
< < " " < < LICENSE
< < ' \n ' < < std : : endl ;
}
// Warranty
if ( vm . count ( " warranty " ) ) {
std : : cout < < ' \n ' < < WARRANTY < < ' \n ' < < std : : endl ;
# ifdef _DEBUG
std : : cin . get ( ) ;
# endif
return 1 ;
}
// Help
if ( vm . empty ( ) | | vm . count ( " help " ) ) {
std : : cout
< < " Usage: cc [options] <file.bb> " < < ' \n '
< < opts
< < std : : endl ;
# ifdef _DEBUG
std : : cin . get ( ) ;
# endif
return 1 ;
}
# pragma endregion Header, Warranty, Help
# pragma region Process Input
2017-11-13 02:16:33 +01:00
BlitzLLVM : : Compiler comp ;
comp . Compile ( optInput , optInput + " .exe " ) ;
2017-11-12 01:38:50 +01:00
# pragma endregion Process Input
2017-11-11 22:32:30 +01:00
2017-11-12 01:38:50 +01:00
# ifdef _DEBUG
std : : cin . get ( ) ;
# endif
return 0 ;
2017-11-11 22:32:30 +01:00
}