http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/builtins.c ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/builtins.c b/ext/kenlm/jam-files/engine/builtins.c deleted file mode 100644 index e4130bb..0000000 --- a/ext/kenlm/jam-files/engine/builtins.c +++ /dev/null @@ -1,2354 +0,0 @@ -/* - * Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc. - * - * This file is part of Jam - see jam.c for Copyright information. - */ - -#include "jam.h" -#include "builtins.h" - -#include "compile.h" -#include "constants.h" -#include "cwd.h" -#include "filesys.h" -#include "frames.h" -#include "hash.h" -#include "hdrmacro.h" -#include "lists.h" -#include "make.h" -#include "md5.h" -#include "native.h" -#include "object.h" -#include "parse.h" -#include "pathsys.h" -#include "rules.h" -#include "strings.h" -#include "subst.h" -#include "timestamp.h" -#include "variable.h" - -#include <ctype.h> - -#if defined(USE_EXECUNIX) -# include <sys/types.h> -# include <sys/wait.h> -#else -/* - * NT does not have wait() and associated macros and uses the system() return - * value instead. Status code group are documented at: - * http://msdn.microsoft.com/en-gb/library/ff565436.aspx - */ -# define WIFEXITED(w) (((w) & 0XFFFFFF00) == 0) -# define WEXITSTATUS(w)(w) -#endif - -/* - * builtins.c - builtin jam rules - * - * External routines: - * load_builtins() - define builtin rules - * unknown_rule() - reports an unknown rule occurrence to the - * user and exits - * - * Internal routines: - * append_if_exists() - if file exists, append it to the list - * builtin_calc() - CALC rule - * builtin_delete_module() - DELETE_MODULE ( MODULE ? ) - * builtin_depends() - DEPENDS/INCLUDES rule - * builtin_echo() - ECHO rule - * builtin_exit() - EXIT rule - * builtin_export() - EXPORT ( MODULE ? : RULES * ) - * builtin_flags() - NOCARE, NOTFILE, TEMPORARY rule - * builtin_glob() - GLOB rule - * builtin_glob_recursive() - ??? - * builtin_hdrmacro() - ??? - * builtin_import() - IMPORT rule - * builtin_match() - MATCH rule, regexp matching - * builtin_rebuilds() - REBUILDS rule - * builtin_rulenames() - RULENAMES ( MODULE ? ) - * builtin_split_by_characters() - splits the given string into tokens - * builtin_varnames() - VARNAMES ( MODULE ? ) - * get_source_line() - get a frame's file and line number - * information - */ - - -/* - * compile_builtin() - define builtin rules - */ - -#define P0 (PARSE *)0 -#define C0 (OBJECT *)0 - -#if defined( OS_NT ) || defined( OS_CYGWIN ) - LIST * builtin_system_registry ( FRAME *, int ); - LIST * builtin_system_registry_names( FRAME *, int ); -#endif - -int glob( char const * s, char const * c ); - -void backtrace ( FRAME * ); -void backtrace_line ( FRAME * ); -void print_source_line( FRAME * ); - - -RULE * bind_builtin( char const * name_, LIST * (* f)( FRAME *, int flags ), - int flags, char const * * args ) -{ - FUNCTION * func; - RULE * result; - OBJECT * name = object_new( name_ ); - - func = function_builtin( f, flags, args ); - - result = new_rule_body( root_module(), name, func, 1 ); - - function_free( func ); - - object_free( name ); - - return result; -} - - -RULE * duplicate_rule( char const * name_, RULE * other ) -{ - OBJECT * name = object_new( name_ ); - RULE * result = import_rule( other, root_module(), name ); - object_free( name ); - return result; -} - - -/* - * load_builtins() - define builtin rules - */ - -void load_builtins() -{ - duplicate_rule( "Always", - bind_builtin( "ALWAYS", - builtin_flags, T_FLAG_TOUCHED, 0 ) ); - - duplicate_rule( "Depends", - bind_builtin( "DEPENDS", - builtin_depends, 0, 0 ) ); - - duplicate_rule( "echo", - duplicate_rule( "Echo", - bind_builtin( "ECHO", - builtin_echo, 0, 0 ) ) ); - - { - char const * args[] = { "message", "*", ":", "result-value", "?", 0 }; - duplicate_rule( "exit", - duplicate_rule( "Exit", - bind_builtin( "EXIT", - builtin_exit, 0, args ) ) ); - } - - { - char const * args[] = { "directories", "*", ":", "patterns", "*", ":", - "case-insensitive", "?", 0 }; - duplicate_rule( "Glob", - bind_builtin( "GLOB", builtin_glob, 0, args ) ); - } - - { - char const * args[] = { "patterns", "*", 0 }; - bind_builtin( "GLOB-RECURSIVELY", - builtin_glob_recursive, 0, args ); - } - - duplicate_rule( "Includes", - bind_builtin( "INCLUDES", - builtin_depends, 1, 0 ) ); - - { - char const * args[] = { "targets", "*", ":", "targets-to-rebuild", "*", - 0 }; - bind_builtin( "REBUILDS", - builtin_rebuilds, 0, args ); - } - - duplicate_rule( "Leaves", - bind_builtin( "LEAVES", - builtin_flags, T_FLAG_LEAVES, 0 ) ); - - duplicate_rule( "Match", - bind_builtin( "MATCH", - builtin_match, 0, 0 ) ); - - { - char const * args[] = { "string", ":", "delimiters", 0 }; - bind_builtin( "SPLIT_BY_CHARACTERS", - builtin_split_by_characters, 0, args ); - } - - duplicate_rule( "NoCare", - bind_builtin( "NOCARE", - builtin_flags, T_FLAG_NOCARE, 0 ) ); - - duplicate_rule( "NOTIME", - duplicate_rule( "NotFile", - bind_builtin( "NOTFILE", - builtin_flags, T_FLAG_NOTFILE, 0 ) ) ); - - duplicate_rule( "NoUpdate", - bind_builtin( "NOUPDATE", - builtin_flags, T_FLAG_NOUPDATE, 0 ) ); - - duplicate_rule( "Temporary", - bind_builtin( "TEMPORARY", - builtin_flags, T_FLAG_TEMP, 0 ) ); - - bind_builtin( "ISFILE", - builtin_flags, T_FLAG_ISFILE, 0 ); - - duplicate_rule( "HdrMacro", - bind_builtin( "HDRMACRO", - builtin_hdrmacro, 0, 0 ) ); - - /* FAIL_EXPECTED is used to indicate that the result of a target build - * action should be inverted (ok <=> fail) this can be useful when - * performing test runs from Jamfiles. - */ - bind_builtin( "FAIL_EXPECTED", - builtin_flags, T_FLAG_FAIL_EXPECTED, 0 ); - - bind_builtin( "RMOLD", - builtin_flags, T_FLAG_RMOLD, 0 ); - - { - char const * args[] = { "targets", "*", 0 }; - bind_builtin( "UPDATE", - builtin_update, 0, args ); - } - - { - char const * args[] = { "targets", "*", - ":", "log", "?", - ":", "ignore-minus-n", "?", - ":", "ignore-minus-q", "?", 0 }; - bind_builtin( "UPDATE_NOW", - builtin_update_now, 0, args ); - } - - { - char const * args[] = { "string", "pattern", "replacements", "+", 0 }; - duplicate_rule( "subst", - bind_builtin( "SUBST", - builtin_subst, 0, args ) ); - } - - { - char const * args[] = { "module", "?", 0 }; - bind_builtin( "RULENAMES", - builtin_rulenames, 0, args ); - } - - { - char const * args[] = { "module", "?", 0 }; - bind_builtin( "VARNAMES", - builtin_varnames, 0, args ); - } - - { - char const * args[] = { "module", "?", 0 }; - bind_builtin( "DELETE_MODULE", - builtin_delete_module, 0, args ); - } - - { - char const * args[] = { "source_module", "?", - ":", "source_rules", "*", - ":", "target_module", "?", - ":", "target_rules", "*", - ":", "localize", "?", 0 }; - bind_builtin( "IMPORT", - builtin_import, 0, args ); - } - - { - char const * args[] = { "module", "?", ":", "rules", "*", 0 }; - bind_builtin( "EXPORT", - builtin_export, 0, args ); - } - - { - char const * args[] = { "levels", "?", 0 }; - bind_builtin( "CALLER_MODULE", - builtin_caller_module, 0, args ); - } - - { - char const * args[] = { "levels", "?", 0 }; - bind_builtin( "BACKTRACE", - builtin_backtrace, 0, args ); - } - - { - char const * args[] = { 0 }; - bind_builtin( "PWD", - builtin_pwd, 0, args ); - } - - { - char const * args[] = { "modules_to_import", "+", - ":", "target_module", "?", 0 }; - bind_builtin( "IMPORT_MODULE", - builtin_import_module, 0, args ); - } - - { - char const * args[] = { "module", "?", 0 }; - bind_builtin( "IMPORTED_MODULES", - builtin_imported_modules, 0, args ); - } - - { - char const * args[] = { "instance_module", ":", "class_module", 0 }; - bind_builtin( "INSTANCE", - builtin_instance, 0, args ); - } - - { - char const * args[] = { "sequence", "*", 0 }; - bind_builtin( "SORT", - builtin_sort, 0, args ); - } - - { - char const * args[] = { "path_parts", "*", 0 }; - bind_builtin( "NORMALIZE_PATH", - builtin_normalize_path, 0, args ); - } - - { - char const * args[] = { "args", "*", 0 }; - bind_builtin( "CALC", - builtin_calc, 0, args ); - } - - { - char const * args[] = { "module", ":", "rule", 0 }; - bind_builtin( "NATIVE_RULE", - builtin_native_rule, 0, args ); - } - - { - char const * args[] = { "module", ":", "rule", ":", "version", 0 }; - bind_builtin( "HAS_NATIVE_RULE", - builtin_has_native_rule, 0, args ); - } - - { - char const * args[] = { "module", "*", 0 }; - bind_builtin( "USER_MODULE", - builtin_user_module, 0, args ); - } - - { - char const * args[] = { 0 }; - bind_builtin( "NEAREST_USER_LOCATION", - builtin_nearest_user_location, 0, args ); - } - - { - char const * args[] = { "file", 0 }; - bind_builtin( "CHECK_IF_FILE", - builtin_check_if_file, 0, args ); - } - -#ifdef HAVE_PYTHON - { - char const * args[] = { "python-module", - ":", "function", - ":", "jam-module", - ":", "rule-name", 0 }; - bind_builtin( "PYTHON_IMPORT_RULE", - builtin_python_import_rule, 0, args ); - } -#endif - -# if defined( OS_NT ) || defined( OS_CYGWIN ) - { - char const * args[] = { "key_path", ":", "data", "?", 0 }; - bind_builtin( "W32_GETREG", - builtin_system_registry, 0, args ); - } - - { - char const * args[] = { "key_path", ":", "result-type", 0 }; - bind_builtin( "W32_GETREGNAMES", - builtin_system_registry_names, 0, args ); - } -# endif - - { - char const * args[] = { "command", ":", "*", 0 }; - duplicate_rule( "SHELL", - bind_builtin( "COMMAND", - builtin_shell, 0, args ) ); - } - - { - char const * args[] = { "string", 0 }; - bind_builtin( "MD5", - builtin_md5, 0, args ); - } - - { - char const * args[] = { "name", ":", "mode", 0 }; - bind_builtin( "FILE_OPEN", - builtin_file_open, 0, args ); - } - - { - char const * args[] = { "string", ":", "width", 0 }; - bind_builtin( "PAD", - builtin_pad, 0, args ); - } - - { - char const * args[] = { "targets", "*", 0 }; - bind_builtin( "PRECIOUS", - builtin_precious, 0, args ); - } - - { - char const * args [] = { 0 }; - bind_builtin( "SELF_PATH", builtin_self_path, 0, args ); - } - - { - char const * args [] = { "path", 0 }; - bind_builtin( "MAKEDIR", builtin_makedir, 0, args ); - } - - /* Initialize builtin modules. */ - init_set(); - init_path(); - init_regex(); - init_property_set(); - init_sequence(); - init_order(); -} - - -/* - * builtin_calc() - CALC rule - * - * Performs simple mathematical operations on two arguments. - */ - -LIST * builtin_calc( FRAME * frame, int flags ) -{ - LIST * arg = lol_get( frame->args, 0 ); - - LIST * result = L0; - long lhs_value; - long rhs_value; - long result_value; - char buffer[ 16 ]; - char const * lhs; - char const * op; - char const * rhs; - LISTITER iter = list_begin( arg ); - LISTITER const end = list_end( arg ); - - if ( iter == end ) return L0; - lhs = object_str( list_item( iter ) ); - - iter = list_next( iter ); - if ( iter == end ) return L0; - op = object_str( list_item( iter ) ); - - iter = list_next( iter ); - if ( iter == end ) return L0; - rhs = object_str( list_item( iter ) ); - - lhs_value = atoi( lhs ); - rhs_value = atoi( rhs ); - - if ( !strcmp( "+", op ) ) - result_value = lhs_value + rhs_value; - else if ( !strcmp( "-", op ) ) - result_value = lhs_value - rhs_value; - else - return L0; - - sprintf( buffer, "%ld", result_value ); - result = list_push_back( result, object_new( buffer ) ); - return result; -} - - -/* - * builtin_depends() - DEPENDS/INCLUDES rule - * - * The DEPENDS/INCLUDES builtin rule appends each of the listed sources on the - * dependency/includes list of each of the listed targets. It binds both the - * targets and sources as TARGETs. - */ - -LIST * builtin_depends( FRAME * frame, int flags ) -{ - LIST * const targets = lol_get( frame->args, 0 ); - LIST * const sources = lol_get( frame->args, 1 ); - - LISTITER iter = list_begin( targets ); - LISTITER end = list_end( targets ); - for ( ; iter != end; iter = list_next( iter ) ) - { - TARGET * const t = bindtarget( list_item( iter ) ); - - if ( flags ) - target_include_many( t, sources ); - else - t->depends = targetlist( t->depends, sources ); - } - - /* Enter reverse links */ - iter = list_begin( sources ); - end = list_end( sources ); - for ( ; iter != end; iter = list_next( iter ) ) - { - TARGET * const s = bindtarget( list_item( iter ) ); - if ( flags ) - { - LISTITER t_iter = list_begin( targets ); - LISTITER const t_end = list_end( targets ); - for ( ; t_iter != t_end; t_iter = list_next( t_iter ) ) - s->dependants = targetentry( s->dependants, bindtarget( - list_item( t_iter ) )->includes ); - } - else - s->dependants = targetlist( s->dependants, targets ); - } - - return L0; -} - - -/* - * builtin_rebuilds() - REBUILDS rule - * - * Appends each of the rebuild-targets listed in its second argument to the - * rebuilds list for each of the targets listed in its first argument. - */ - -LIST * builtin_rebuilds( FRAME * frame, int flags ) -{ - LIST * targets = lol_get( frame->args, 0 ); - LIST * rebuilds = lol_get( frame->args, 1 ); - LISTITER iter = list_begin( targets ); - LISTITER const end = list_end( targets ); - for ( ; iter != end; iter = list_next( iter ) ) - { - TARGET * const t = bindtarget( list_item( iter ) ); - t->rebuilds = targetlist( t->rebuilds, rebuilds ); - } - return L0; -} - - -/* - * builtin_echo() - ECHO rule - * - * Echoes the targets to the user. No other actions are taken. - */ - -LIST * builtin_echo( FRAME * frame, int flags ) -{ - list_print( lol_get( frame->args, 0 ) ); - printf( "\n" ); - fflush( stdout ); - return L0; -} - - -/* - * builtin_exit() - EXIT rule - * - * Echoes the targets to the user and exits the program with a failure status. - */ - -LIST * builtin_exit( FRAME * frame, int flags ) -{ - LIST * const code = lol_get( frame->args, 1 ); - list_print( lol_get( frame->args, 0 ) ); - printf( "\n" ); - if ( !list_empty( code ) ) - exit( atoi( object_str( list_front( code ) ) ) ); - else - exit( EXITBAD ); /* yeech */ - return L0; -} - - -/* - * builtin_flags() - NOCARE, NOTFILE, TEMPORARY rule - * - * Marks the target with the appropriate flag, for use by make0(). It binds each - * target as a TARGET. - */ - -LIST * builtin_flags( FRAME * frame, int flags ) -{ - LIST * const targets = lol_get( frame->args, 0 ); - LISTITER iter = list_begin( targets ); - LISTITER const end = list_end( targets ); - for ( ; iter != end; iter = list_next( iter ) ) - bindtarget( list_item( iter ) )->flags |= flags; - return L0; -} - - -/* - * builtin_glob() - GLOB rule - */ - -struct globbing -{ - LIST * patterns; - LIST * results; - LIST * case_insensitive; -}; - - -static void downcase_inplace( char * p ) -{ - for ( ; *p; ++p ) - *p = tolower( *p ); -} - - -static void builtin_glob_back( void * closure, OBJECT * file, int status, - timestamp const * const time ) -{ - PROFILE_ENTER( BUILTIN_GLOB_BACK ); - - struct globbing * const globbing = (struct globbing *)closure; - PATHNAME f; - string buf[ 1 ]; - LISTITER iter; - LISTITER end; - - /* Null out directory for matching. We wish we had file_dirscan() pass up a - * PATHNAME. - */ - path_parse( object_str( file ), &f ); - f.f_dir.len = 0; - - /* For globbing, we unconditionally ignore current and parent directory - * items. Since these items always exist, there is no reason why caller of - * GLOB would want to see them. We could also change file_dirscan(), but - * then paths with embedded "." and ".." would not work anywhere. - */ - if ( !strcmp( f.f_base.ptr, "." ) || !strcmp( f.f_base.ptr, ".." ) ) - { - PROFILE_EXIT( BUILTIN_GLOB_BACK ); - return; - } - - string_new( buf ); - path_build( &f, buf ); - - if ( globbing->case_insensitive ) - downcase_inplace( buf->value ); - - iter = list_begin( globbing->patterns ); - end = list_end( globbing->patterns ); - for ( ; iter != end; iter = list_next( iter ) ) - { - if ( !glob( object_str( list_item( iter ) ), buf->value ) ) - { - globbing->results = list_push_back( globbing->results, object_copy( - file ) ); - break; - } - } - - string_free( buf ); - - PROFILE_EXIT( BUILTIN_GLOB_BACK ); -} - - -static LIST * downcase_list( LIST * in ) -{ - LIST * result = L0; - LISTITER iter = list_begin( in ); - LISTITER const end = list_end( in ); - - string s[ 1 ]; - string_new( s ); - - for ( ; iter != end; iter = list_next( iter ) ) - { - string_append( s, object_str( list_item( iter ) ) ); - downcase_inplace( s->value ); - result = list_push_back( result, object_new( s->value ) ); - string_truncate( s, 0 ); - } - - string_free( s ); - return result; -} - - -LIST * builtin_glob( FRAME * frame, int flags ) -{ - LIST * const l = lol_get( frame->args, 0 ); - LIST * const r = lol_get( frame->args, 1 ); - - LISTITER iter; - LISTITER end; - struct globbing globbing; - - globbing.results = L0; - globbing.patterns = r; - - globbing.case_insensitive = -# if defined( OS_NT ) || defined( OS_CYGWIN ) - l; /* Always case-insensitive if any files can be found. */ -# else - lol_get( frame->args, 2 ); -# endif - - if ( globbing.case_insensitive ) - globbing.patterns = downcase_list( r ); - - iter = list_begin( l ); - end = list_end( l ); - for ( ; iter != end; iter = list_next( iter ) ) - file_dirscan( list_item( iter ), builtin_glob_back, &globbing ); - - if ( globbing.case_insensitive ) - list_free( globbing.patterns ); - - return globbing.results; -} - - -static int has_wildcards( char const * const str ) -{ - return str[ strcspn( str, "[]*?" ) ] ? 1 : 0; -} - - -/* - * append_if_exists() - if file exists, append it to the list - */ - -static LIST * append_if_exists( LIST * list, OBJECT * file ) -{ - return file_query( file ) - ? list_push_back( list, object_copy( file ) ) - : list ; -} - - -LIST * glob1( OBJECT * dirname, OBJECT * pattern ) -{ - LIST * const plist = list_new( object_copy( pattern ) ); - struct globbing globbing; - - globbing.results = L0; - globbing.patterns = plist; - - globbing.case_insensitive -# if defined( OS_NT ) || defined( OS_CYGWIN ) - = plist; /* always case-insensitive if any files can be found */ -# else - = L0; -# endif - - if ( globbing.case_insensitive ) - globbing.patterns = downcase_list( plist ); - - file_dirscan( dirname, builtin_glob_back, &globbing ); - - if ( globbing.case_insensitive ) - list_free( globbing.patterns ); - - list_free( plist ); - - return globbing.results; -} - - -LIST * glob_recursive( char const * pattern ) -{ - LIST * result = L0; - - /* Check if there's metacharacters in pattern */ - if ( !has_wildcards( pattern ) ) - { - /* No metacharacters. Check if the path exists. */ - OBJECT * const p = object_new( pattern ); - result = append_if_exists( result, p ); - object_free( p ); - } - else - { - /* Have metacharacters in the pattern. Split into dir/name. */ - PATHNAME path[ 1 ]; - path_parse( pattern, path ); - - if ( path->f_dir.ptr ) - { - LIST * dirs = L0; - string dirname[ 1 ]; - string basename[ 1 ]; - string_new( dirname ); - string_new( basename ); - - string_append_range( dirname, path->f_dir.ptr, - path->f_dir.ptr + path->f_dir.len ); - - path->f_grist.ptr = 0; - path->f_grist.len = 0; - path->f_dir.ptr = 0; - path->f_dir.len = 0; - path_build( path, basename ); - - dirs = has_wildcards( dirname->value ) - ? glob_recursive( dirname->value ) - : list_push_back( dirs, object_new( dirname->value ) ); - - if ( has_wildcards( basename->value ) ) - { - OBJECT * const b = object_new( basename->value ); - LISTITER iter = list_begin( dirs ); - LISTITER const end = list_end( dirs ); - for ( ; iter != end; iter = list_next( iter ) ) - result = list_append( result, glob1( list_item( iter ), b ) - ); - object_free( b ); - } - else - { - LISTITER iter = list_begin( dirs ); - LISTITER const end = list_end( dirs ); - string file_string[ 1 ]; - string_new( file_string ); - - /* No wildcard in basename. */ - for ( ; iter != end; iter = list_next( iter ) ) - { - OBJECT * p; - path->f_dir.ptr = object_str( list_item( iter ) ); - path->f_dir.len = strlen( object_str( list_item( iter ) ) ); - path_build( path, file_string ); - - p = object_new( file_string->value ); - - result = append_if_exists( result, p ); - - object_free( p ); - - string_truncate( file_string, 0 ); - } - - string_free( file_string ); - } - - string_free( dirname ); - string_free( basename ); - - list_free( dirs ); - } - else - { - /* No directory, just a pattern. */ - OBJECT * const p = object_new( pattern ); - result = list_append( result, glob1( constant_dot, p ) ); - object_free( p ); - } - } - - return result; -} - - -/* - * builtin_glob_recursive() - ??? - */ - -LIST * builtin_glob_recursive( FRAME * frame, int flags ) -{ - LIST * result = L0; - LIST * const l = lol_get( frame->args, 0 ); - LISTITER iter = list_begin( l ); - LISTITER const end = list_end( l ); - for ( ; iter != end; iter = list_next( iter ) ) - result = list_append( result, glob_recursive( object_str( list_item( - iter ) ) ) ); - return result; -} - - -/* - * builtin_match() - MATCH rule, regexp matching - */ - -LIST * builtin_match( FRAME * frame, int flags ) -{ - LIST * l; - LIST * r; - LIST * result = L0; - LISTITER l_iter; - LISTITER l_end; - LISTITER r_iter; - LISTITER r_end; - - string buf[ 1 ]; - string_new( buf ); - - /* For each pattern */ - - l = lol_get( frame->args, 0 ); - l_iter = list_begin( l ); - l_end = list_end( l ); - for ( ; l_iter != l_end; l_iter = list_next( l_iter ) ) - { - /* Result is cached and intentionally never freed. */ - regexp * re = regex_compile( list_item( l_iter ) ); - - /* For each string to match against. */ - r = lol_get( frame->args, 1 ); - r_iter = list_begin( r ); - r_end = list_end( r ); - for ( ; r_iter != r_end; r_iter = list_next( r_iter ) ) - { - if ( regexec( re, object_str( list_item( r_iter ) ) ) ) - { - int i; - int top; - - /* Find highest parameter */ - - for ( top = NSUBEXP; top-- > 1; ) - if ( re->startp[ top ] ) - break; - - /* And add all parameters up to highest onto list. */ - /* Must have parameters to have results! */ - for ( i = 1; i <= top; ++i ) - { - string_append_range( buf, re->startp[ i ], re->endp[ i ] ); - result = list_push_back( result, object_new( buf->value ) ); - string_truncate( buf, 0 ); - } - } - } - } - - string_free( buf ); - return result; -} - - -/* - * builtin_split_by_characters() - splits the given string into tokens - */ - -LIST * builtin_split_by_characters( FRAME * frame, int flags ) -{ - LIST * l1 = lol_get( frame->args, 0 ); - LIST * l2 = lol_get( frame->args, 1 ); - - LIST * result = L0; - - string buf[ 1 ]; - - char const * delimiters = object_str( list_front( l2 ) ); - char * t; - - string_copy( buf, object_str( list_front( l1 ) ) ); - - t = strtok( buf->value, delimiters ); - while ( t ) - { - result = list_push_back( result, object_new( t ) ); - t = strtok( NULL, delimiters ); - } - - string_free( buf ); - - return result; -} - - -/* - * builtin_hdrmacro() - ??? - */ - -LIST * builtin_hdrmacro( FRAME * frame, int flags ) -{ - LIST * const l = lol_get( frame->args, 0 ); - LISTITER iter = list_begin( l ); - LISTITER const end = list_end( l ); - - for ( ; iter != end; iter = list_next( iter ) ) - { - TARGET * const t = bindtarget( list_item( iter ) ); - - /* Scan file for header filename macro definitions. */ - if ( DEBUG_HEADER ) - printf( "scanning '%s' for header file macro definitions\n", - object_str( list_item( iter ) ) ); - - macro_headers( t ); - } - - return L0; -} - - -/* - * builtin_rulenames() - RULENAMES ( MODULE ? ) - * - * Returns a list of the non-local rule names in the given MODULE. If MODULE is - * not supplied, returns the list of rule names in the global module. - */ - -static void add_rule_name( void * r_, void * result_ ) -{ - RULE * const r = (RULE *)r_; - LIST * * const result = (LIST * *)result_; - if ( r->exported ) - *result = list_push_back( *result, object_copy( r->name ) ); -} - - -LIST * builtin_rulenames( FRAME * frame, int flags ) -{ - LIST * arg0 = lol_get( frame->args, 0 ); - LIST * result = L0; - module_t * const source_module = bindmodule( list_empty( arg0 ) - ? 0 - : list_front( arg0 ) ); - - if ( source_module->rules ) - hashenumerate( source_module->rules, add_rule_name, &result ); - return result; -} - - -/* - * builtin_varnames() - VARNAMES ( MODULE ? ) - * - * Returns a list of the variable names in the given MODULE. If MODULE is not - * supplied, returns the list of variable names in the global module. - */ - -/* helper function for builtin_varnames(), below. Used with hashenumerate, will - * prepend the key of each element to the list - */ -static void add_hash_key( void * np, void * result_ ) -{ - LIST * * result = (LIST * *)result_; - *result = list_push_back( *result, object_copy( *(OBJECT * *)np ) ); -} - - -LIST * builtin_varnames( FRAME * frame, int flags ) -{ - LIST * arg0 = lol_get( frame->args, 0 ); - LIST * result = L0; - module_t * source_module = bindmodule( list_empty( arg0 ) - ? 0 - : list_front( arg0 ) ); - - struct hash * const vars = source_module->variables; - if ( vars ) - hashenumerate( vars, add_hash_key, &result ); - return result; -} - - -/* - * builtin_delete_module() - DELETE_MODULE ( MODULE ? ) - * - * Clears all rules and variables from the given module. - */ - -LIST * builtin_delete_module( FRAME * frame, int flags ) -{ - LIST * const arg0 = lol_get( frame->args, 0 ); - module_t * const source_module = bindmodule( list_empty( arg0 ) ? 0 : - list_front( arg0 ) ); - delete_module( source_module ); - return L0; -} - - -/* - * unknown_rule() - reports an unknown rule occurrence to the user and exits - */ - -void unknown_rule( FRAME * frame, char const * key, module_t * module, - OBJECT * rule_name ) -{ - backtrace_line( frame->prev ); - if ( key ) - printf("%s error", key); - else - printf("ERROR"); - printf( ": rule \"%s\" unknown in ", object_str( rule_name ) ); - if ( module->name ) - printf( "module \"%s\".\n", object_str( module->name ) ); - else - printf( "root module.\n" ); - backtrace( frame->prev ); - exit( 1 ); -} - - -/* - * builtin_import() - IMPORT rule - * - * IMPORT - * ( - * SOURCE_MODULE ? : - * SOURCE_RULES * : - * TARGET_MODULE ? : - * TARGET_RULES * : - * LOCALIZE ? - * ) - * - * Imports rules from the SOURCE_MODULE into the TARGET_MODULE as local rules. - * If either SOURCE_MODULE or TARGET_MODULE is not supplied, it refers to the - * global module. SOURCE_RULES specifies which rules from the SOURCE_MODULE to - * import; TARGET_RULES specifies the names to give those rules in - * TARGET_MODULE. If SOURCE_RULES contains a name that does not correspond to - * a rule in SOURCE_MODULE, or if it contains a different number of items than - * TARGET_RULES, an error is issued. If LOCALIZE is specified, the rules will be - * executed in TARGET_MODULE, with corresponding access to its module local - * variables. - */ - -LIST * builtin_import( FRAME * frame, int flags ) -{ - LIST * source_module_list = lol_get( frame->args, 0 ); - LIST * source_rules = lol_get( frame->args, 1 ); - LIST * target_module_list = lol_get( frame->args, 2 ); - LIST * target_rules = lol_get( frame->args, 3 ); - LIST * localize = lol_get( frame->args, 4 ); - - module_t * target_module = bindmodule( list_empty( target_module_list ) - ? 0 - : list_front( target_module_list ) ); - module_t * source_module = bindmodule( list_empty( source_module_list ) - ? 0 - : list_front( source_module_list ) ); - - LISTITER source_iter = list_begin( source_rules ); - LISTITER const source_end = list_end( source_rules ); - LISTITER target_iter = list_begin( target_rules ); - LISTITER const target_end = list_end( target_rules ); - - for ( ; - source_iter != source_end && target_iter != target_end; - source_iter = list_next( source_iter ), - target_iter = list_next( target_iter ) ) - { - RULE * r; - RULE * imported; - - if ( !source_module->rules || !(r = (RULE *)hash_find( - source_module->rules, list_item( source_iter ) ) ) ) - unknown_rule( frame, "IMPORT", source_module, list_item( source_iter - ) ); - - imported = import_rule( r, target_module, list_item( target_iter ) ); - if ( !list_empty( localize ) ) - rule_localize( imported, target_module ); - /* This rule is really part of some other module. Just refer to it here, - * but do not let it out. - */ - imported->exported = 0; - } - - if ( source_iter != source_end || target_iter != target_end ) - { - backtrace_line( frame->prev ); - printf( "import error: length of source and target rule name lists " - "don't match!\n" ); - printf( " source: " ); - list_print( source_rules ); - printf( "\n target: " ); - list_print( target_rules ); - printf( "\n" ); - backtrace( frame->prev ); - exit( 1 ); - } - - return L0; -} - - -/* - * builtin_export() - EXPORT ( MODULE ? : RULES * ) - * - * The EXPORT rule marks RULES from the SOURCE_MODULE as non-local (and thus - * exportable). If an element of RULES does not name a rule in MODULE, an error - * is issued. - */ - -LIST * builtin_export( FRAME * frame, int flags ) -{ - LIST * const module_list = lol_get( frame->args, 0 ); - LIST * const rules = lol_get( frame->args, 1 ); - module_t * const m = bindmodule( list_empty( module_list ) ? 0 : list_front( - module_list ) ); - - LISTITER iter = list_begin( rules ); - LISTITER const end = list_end( rules ); - for ( ; iter != end; iter = list_next( iter ) ) - { - RULE * r; - if ( !m->rules || !( r = (RULE *)hash_find( m->rules, list_item( iter ) - ) ) ) - unknown_rule( frame, "EXPORT", m, list_item( iter ) ); - r->exported = 1; - } - return L0; -} - - -/* - * get_source_line() - get a frame's file and line number information - * - * This is the execution traceback information to be indicated for in debug - * output or an error backtrace. - */ - -static void get_source_line( FRAME * frame, char const * * file, int * line ) -{ - if ( frame->file ) - { - char const * f = object_str( frame->file ); - int l = frame->line; - if ( !strcmp( f, "+" ) ) - { - f = "jambase.c"; - l += 3; - } - *file = f; - *line = l; - } - else - { - *file = "(builtin)"; - *line = -1; - } -} - - -void print_source_line( FRAME * frame ) -{ - char const * file; - int line; - get_source_line( frame, &file, &line ); - if ( line < 0 ) - printf( "(builtin):" ); - else - printf( "%s:%d:", file, line ); -} - - -/* - * backtrace_line() - print a single line of error backtrace for the given - * frame. - */ - -void backtrace_line( FRAME * frame ) -{ - if ( frame == 0 ) - { - printf( "(no frame):" ); - } - else - { - print_source_line( frame ); - printf( " in %s\n", frame->rulename ); - } -} - - -/* - * backtrace() - Print the entire backtrace from the given frame to the Jambase - * which invoked it. - */ - -void backtrace( FRAME * frame ) -{ - if ( !frame ) return; - while ( ( frame = frame->prev ) ) - backtrace_line( frame ); -} - - -/* - * builtin_backtrace() - A Jam version of the backtrace function, taking no - * arguments and returning a list of quadruples: FILENAME LINE MODULE. RULENAME - * describing each frame. Note that the module-name is always followed by a - * period. - */ - -LIST * builtin_backtrace( FRAME * frame, int flags ) -{ - LIST * const levels_arg = lol_get( frame->args, 0 ); - int levels = list_empty( levels_arg ) - ? (int)( (unsigned int)(-1) >> 1 ) - : atoi( object_str( list_front( levels_arg ) ) ); - - LIST * result = L0; - for ( ; ( frame = frame->prev ) && levels; --levels ) - { - char const * file; - int line; - char buf[ 32 ]; - string module_name[ 1 ]; - get_source_line( frame, &file, &line ); - sprintf( buf, "%d", line ); - string_new( module_name ); - if ( frame->module->name ) - { - string_append( module_name, object_str( frame->module->name ) ); - string_append( module_name, "." ); - } - result = list_push_back( result, object_new( file ) ); - result = list_push_back( result, object_new( buf ) ); - result = list_push_back( result, object_new( module_name->value ) ); - result = list_push_back( result, object_new( frame->rulename ) ); - string_free( module_name ); - } - return result; -} - - -/* - * builtin_caller_module() - CALLER_MODULE ( levels ? ) - * - * If levels is not supplied, returns the name of the module of the rule which - * called the one calling this one. If levels is supplied, it is interpreted as - * an integer specifying a number of additional levels of call stack to traverse - * in order to locate the module in question. If no such module exists, returns - * the empty list. Also returns the empty list when the module in question is - * the global module. This rule is needed for implementing module import - * behavior. - */ - -LIST * builtin_caller_module( FRAME * frame, int flags ) -{ - LIST * const levels_arg = lol_get( frame->args, 0 ); - int const levels = list_empty( levels_arg ) - ? 0 - : atoi( object_str( list_front( levels_arg ) ) ); - - int i; - for ( i = 0; ( i < levels + 2 ) && frame->prev; ++i ) - frame = frame->prev; - - return frame->module == root_module() - ? L0 - : list_new( object_copy( frame->module->name ) ); -} - - -/* - * Return the current working directory. - * - * Usage: pwd = [ PWD ] ; - */ - -LIST * builtin_pwd( FRAME * frame, int flags ) -{ - return list_new( object_copy( cwd() ) ); -} - - -/* - * Adds targets to the list of target that jam will attempt to update. - */ - -LIST * builtin_update( FRAME * frame, int flags ) -{ - LIST * result = list_copy( targets_to_update() ); - LIST * arg1 = lol_get( frame->args, 0 ); - LISTITER iter = list_begin( arg1 ), end = list_end( arg1 ); - clear_targets_to_update(); - for ( ; iter != end; iter = list_next( iter ) ) - mark_target_for_updating( object_copy( list_item( iter ) ) ); - return result; -} - -extern int anyhow; -int last_update_now_status; - -/* Takes a list of target names and immediately updates them. - * - * Parameters: - * 1. Target list. - * 2. Optional file descriptor (converted to a string) for a log file where all - * the related build output should be redirected. - * 3. If specified, makes the build temporarily disable the -n option, i.e. - * forces all needed out-of-date targets to be rebuilt. - * 4. If specified, makes the build temporarily disable the -q option, i.e. - * forces the build to continue even if one of the targets fails to build. - */ -LIST * builtin_update_now( FRAME * frame, int flags ) -{ - LIST * targets = lol_get( frame->args, 0 ); - LIST * log = lol_get( frame->args, 1 ); - LIST * force = lol_get( frame->args, 2 ); - LIST * continue_ = lol_get( frame->args, 3 ); - int status; - int original_stdout = 0; - int original_stderr = 0; - int original_noexec = 0; - int original_quitquick = 0; - - if ( !list_empty( log ) ) - { - /* Temporarily redirect stdout and stderr to the given log file. */ - int const fd = atoi( object_str( list_front( log ) ) ); - original_stdout = dup( 0 ); - original_stderr = dup( 1 ); - dup2( fd, 0 ); - dup2( fd, 1 ); - } - - if ( !list_empty( force ) ) - { - original_noexec = globs.noexec; - globs.noexec = 0; - } - - if ( !list_empty( continue_ ) ) - { - original_quitquick = globs.quitquick; - globs.quitquick = 0; - } - - status = make( targets, anyhow ); - - if ( !list_empty( force ) ) - { - globs.noexec = original_noexec; - } - - if ( !list_empty( continue_ ) ) - { - globs.quitquick = original_quitquick; - } - - if ( !list_empty( log ) ) - { - /* Flush whatever stdio might have buffered, while descriptions 0 and 1 - * still refer to the log file. - */ - fflush( stdout ); - fflush( stderr ); - dup2( original_stdout, 0 ); - dup2( original_stderr, 1 ); - close( original_stdout ); - close( original_stderr ); - } - - last_update_now_status = status; - - return status ? L0 : list_new( object_copy( constant_ok ) ); -} - - -LIST * builtin_import_module( FRAME * frame, int flags ) -{ - LIST * const arg1 = lol_get( frame->args, 0 ); - LIST * const arg2 = lol_get( frame->args, 1 ); - module_t * const m = list_empty( arg2 ) - ? root_module() - : bindmodule( list_front( arg2 ) ); - import_module( arg1, m ); - return L0; -} - - -LIST * builtin_imported_modules( FRAME * frame, int flags ) -{ - LIST * const arg0 = lol_get( frame->args, 0 ); - OBJECT * const module = list_empty( arg0 ) ? 0 : list_front( arg0 ); - return imported_modules( bindmodule( module ) ); -} - - -LIST * builtin_instance( FRAME * frame, int flags ) -{ - LIST * arg1 = lol_get( frame->args, 0 ); - LIST * arg2 = lol_get( frame->args, 1 ); - module_t * const instance = bindmodule( list_front( arg1 ) ); - module_t * const class_module = bindmodule( list_front( arg2 ) ); - instance->class_module = class_module; - module_set_fixed_variables( instance, class_module->num_fixed_variables ); - return L0; -} - - -LIST * builtin_sort( FRAME * frame, int flags ) -{ - return list_sort( lol_get( frame->args, 0 ) ); -} - - -LIST * builtin_normalize_path( FRAME * frame, int flags ) -{ - LIST * arg = lol_get( frame->args, 0 ); - - /* First, we iterate over all '/'-separated elements, starting from the end - * of string. If we see a '..', we remove a preceeding path element. If we - * see '.', we remove it. Removal is done by overwriting data using '\1' - * characters. After the whole string has been processed, we do a second - * pass, removing any entered '\1' characters. - */ - - string in[ 1 ]; - string out[ 1 ]; - /* Last character of the part of string still to be processed. */ - char * end; - /* Working pointer. */ - char * current; - /* Number of '..' elements seen and not processed yet. */ - int dotdots = 0; - int rooted = 0; - OBJECT * result = 0; - LISTITER arg_iter = list_begin( arg ); - LISTITER arg_end = list_end( arg ); - - /* Make a copy of input: we should not change it. Prepend a '/' before it as - * a guard for the algorithm later on and remember whether it was originally - * rooted or not. - */ - string_new( in ); - string_push_back( in, '/' ); - for ( ; arg_iter != arg_end; arg_iter = list_next( arg_iter ) ) - { - if ( object_str( list_item( arg_iter ) )[ 0 ] != '\0' ) - { - if ( in->size == 1 ) - rooted = ( object_str( list_item( arg_iter ) )[ 0 ] == '/' ) || - ( object_str( list_item( arg_iter ) )[ 0 ] == '\\' ); - else - string_append( in, "/" ); - string_append( in, object_str( list_item( arg_iter ) ) ); - } - } - - /* Convert \ into /. On Windows, paths using / and \ are equivalent, and we - * want this function to obtain a canonic representation. - */ - for ( current = in->value, end = in->value + in->size; - current < end; ++current ) - if ( *current == '\\' ) - *current = '/'; - - /* Now we remove any extra path elements by overwriting them with '\1' - * characters and cound how many more unused '..' path elements there are - * remaining. Note that each remaining path element with always starts with - * a '/' character. - */ - for ( end = in->value + in->size - 1; end >= in->value; ) - { - /* Set 'current' to the next occurence of '/', which always exists. */ - for ( current = end; *current != '/'; --current ); - - if ( current == end ) - { - /* Found a trailing or duplicate '/'. Remove it. */ - *current = '\1'; - } - else if ( ( end - current == 1 ) && ( *( current + 1 ) == '.' ) ) - { - /* Found '/.'. Remove them all. */ - *current = '\1'; - *(current + 1) = '\1'; - } - else if ( ( end - current == 2 ) && ( *( current + 1 ) == '.' ) && - ( *( current + 2 ) == '.' ) ) - { - /* Found '/..'. Remove them all. */ - *current = '\1'; - *(current + 1) = '\1'; - *(current + 2) = '\1'; - ++dotdots; - } - else if ( dotdots ) - { - memset( current, '\1', end - current + 1 ); - --dotdots; - } - end = current - 1; - } - - string_new( out ); - - /* Now we know that we need to add exactly dotdots '..' path elements to the - * front and that our string is either empty or has a '/' as its first - * significant character. If we have any dotdots remaining then the passed - * path must not have been rooted or else it is invalid we return an empty - * list. - */ - if ( dotdots ) - { - if ( rooted ) - { - string_free( out ); - string_free( in ); - return L0; - } - do - string_append( out, "/.." ); - while ( --dotdots ); - } - - /* Now we actually remove all the path characters marked for removal. */ - for ( current = in->value; *current; ++current ) - if ( *current != '\1' ) - string_push_back( out, *current ); - - /* Here we know that our string contains no '\1' characters and is either - * empty or has a '/' as its initial character. If the original path was not - * rooted and we have a non-empty path we need to drop the initial '/'. If - * the original path was rooted and we have an empty path we need to add - * back the '/'. - */ - result = object_new( out->size - ? out->value + !rooted - : ( rooted ? "/" : "." ) ); - - string_free( out ); - string_free( in ); - - return list_new( result ); -} - - -LIST * builtin_native_rule( FRAME * frame, int flags ) -{ - LIST * module_name = lol_get( frame->args, 0 ); - LIST * rule_name = lol_get( frame->args, 1 ); - - module_t * module = bindmodule( list_front( module_name ) ); - - native_rule_t * np; - if ( module->native_rules && (np = (native_rule_t *)hash_find( - module->native_rules, list_front( rule_name ) ) ) ) - { - new_rule_body( module, np->name, np->procedure, 1 ); - } - else - { - backtrace_line( frame->prev ); - printf( "error: no native rule \"%s\" defined in module \"%s.\"\n", - object_str( list_front( rule_name ) ), object_str( module->name ) ); - backtrace( frame->prev ); - exit( 1 ); - } - return L0; -} - - -LIST * builtin_has_native_rule( FRAME * frame, int flags ) -{ - LIST * module_name = lol_get( frame->args, 0 ); - LIST * rule_name = lol_get( frame->args, 1 ); - LIST * version = lol_get( frame->args, 2 ); - - module_t * module = bindmodule( list_front( module_name ) ); - - native_rule_t * np; - if ( module->native_rules && (np = (native_rule_t *)hash_find( - module->native_rules, list_front( rule_name ) ) ) ) - { - int expected_version = atoi( object_str( list_front( version ) ) ); - if ( np->version == expected_version ) - return list_new( object_copy( constant_true ) ); - } - return L0; -} - - -LIST * builtin_user_module( FRAME * frame, int flags ) -{ - LIST * const module_name = lol_get( frame->args, 0 ); - LISTITER iter = list_begin( module_name ); - LISTITER const end = list_end( module_name ); - for ( ; iter != end; iter = list_next( iter ) ) - bindmodule( list_item( iter ) )->user_module = 1; - return L0; -} - - -LIST * builtin_nearest_user_location( FRAME * frame, int flags ) -{ - FRAME * const nearest_user_frame = frame->module->user_module - ? frame - : frame->prev_user; - if ( !nearest_user_frame ) - return L0; - - { - LIST * result = L0; - char const * file; - int line; - char buf[ 32 ]; - - get_source_line( nearest_user_frame, &file, &line ); - sprintf( buf, "%d", line ); - result = list_push_back( result, object_new( file ) ); - result = list_push_back( result, object_new( buf ) ); - return result; - } -} - - -LIST * builtin_check_if_file( FRAME * frame, int flags ) -{ - LIST * const name = lol_get( frame->args, 0 ); - return file_is_file( list_front( name ) ) == 1 - ? list_new( object_copy( constant_true ) ) - : L0; -} - - -LIST * builtin_md5( FRAME * frame, int flags ) -{ - LIST * l = lol_get( frame->args, 0 ); - char const * s = object_str( list_front( l ) ); - - md5_state_t state; - md5_byte_t digest[ 16 ]; - char hex_output[ 16 * 2 + 1 ]; - - int di; - - md5_init( &state ); - md5_append( &state, (md5_byte_t const *)s, strlen( s ) ); - md5_finish( &state, digest ); - - for ( di = 0; di < 16; ++di ) - sprintf( hex_output + di * 2, "%02x", digest[ di ] ); - - return list_new( object_new( hex_output ) ); -} - - -LIST * builtin_file_open( FRAME * frame, int flags ) -{ - char const * name = object_str( list_front( lol_get( frame->args, 0 ) ) ); - char const * mode = object_str( list_front( lol_get( frame->args, 1 ) ) ); - int fd; - char buffer[ sizeof( "4294967295" ) ]; - - if ( strcmp(mode, "w") == 0 ) - fd = open( name, O_WRONLY|O_CREAT|O_TRUNC, 0666 ); - else - fd = open( name, O_RDONLY ); - - if ( fd != -1 ) - { - sprintf( buffer, "%d", fd ); - return list_new( object_new( buffer ) ); - } - return L0; -} - - -LIST * builtin_pad( FRAME * frame, int flags ) -{ - OBJECT * string = list_front( lol_get( frame->args, 0 ) ); - char const * width_s = object_str( list_front( lol_get( frame->args, 1 ) ) ); - - int current = strlen( object_str( string ) ); - int desired = atoi( width_s ); - if ( current >= desired ) - return list_new( object_copy( string ) ); - else - { - char * buffer = BJAM_MALLOC( desired + 1 ); - int i; - LIST * result; - - strcpy( buffer, object_str( string ) ); - for ( i = current; i < desired; ++i ) - buffer[ i ] = ' '; - buffer[ desired ] = '\0'; - result = list_new( object_new( buffer ) ); - BJAM_FREE( buffer ); - return result; - } -} - - -LIST * builtin_precious( FRAME * frame, int flags ) -{ - LIST * targets = lol_get( frame->args, 0 ); - LISTITER iter = list_begin( targets ); - LISTITER const end = list_end( targets ); - for ( ; iter != end; iter = list_next( iter ) ) - bindtarget( list_item( iter ) )->flags |= T_FLAG_PRECIOUS; - return L0; -} - - -LIST * builtin_self_path( FRAME * frame, int flags ) -{ - extern char const * saved_argv0; - char * p = executable_path( saved_argv0 ); - if ( p ) - { - LIST * const result = list_new( object_new( p ) ); - free( p ); - return result; - } - return L0; -} - - -LIST * builtin_makedir( FRAME * frame, int flags ) -{ - LIST * const path = lol_get( frame->args, 0 ); - return file_mkdir( object_str( list_front( path ) ) ) - ? L0 - : list_new( object_copy( list_front( path ) ) ); -} - - -#ifdef HAVE_PYTHON - -LIST * builtin_python_import_rule( FRAME * frame, int flags ) -{ - static int first_time = 1; - char const * python_module = object_str( list_front( lol_get( frame->args, - 0 ) ) ); - char const * python_function = object_str( list_front( lol_get( frame->args, - 1 ) ) ); - OBJECT * jam_module = list_front( lol_get( frame->args, 2 ) ); - OBJECT * jam_rule = list_front( lol_get( frame->args, 3 ) ); - - PyObject * pName; - PyObject * pModule; - PyObject * pDict; - PyObject * pFunc; - - if ( first_time ) - { - /* At the first invocation, we add the value of the global - * EXTRA_PYTHONPATH to the sys.path Python variable. - */ - LIST * extra = 0; - module_t * outer_module = frame->module; - LISTITER iter, end; - - first_time = 0; - - extra = var_get( root_module(), constant_extra_pythonpath ); - - iter = list_begin( extra ), end = list_end( extra ); - for ( ; iter != end; iter = list_next( iter ) ) - { - string buf[ 1 ]; - string_new( buf ); - string_append( buf, "import sys\nsys.path.append(\"" ); - string_append( buf, object_str( list_item( iter ) ) ); - string_append( buf, "\")\n" ); - PyRun_SimpleString( buf->value ); - string_free( buf ); - } - } - - pName = PyString_FromString( python_module ); - pModule = PyImport_Import( pName ); - Py_DECREF( pName ); - - if ( pModule != NULL ) - { - pDict = PyModule_GetDict( pModule ); - pFunc = PyDict_GetItemString( pDict, python_function ); - - if ( pFunc && PyCallable_Check( pFunc ) ) - { - module_t * m = bindmodule( jam_module ); - new_rule_body( m, jam_rule, function_python( pFunc, 0 ), 0 ); - } - else - { - if ( PyErr_Occurred() ) - PyErr_Print(); - fprintf( stderr, "Cannot find function \"%s\"\n", python_function ); - } - Py_DECREF( pModule ); - } - else - { - PyErr_Print(); - fprintf( stderr, "Failed to load \"%s\"\n", python_module ); - } - return L0; - -} - -#endif /* #ifdef HAVE_PYTHON */ - - -void lol_build( LOL * lol, char const * * elements ) -{ - LIST * l = L0; - lol_init( lol ); - - while ( elements && *elements ) - { - if ( !strcmp( *elements, ":" ) ) - { - lol_add( lol, l ); - l = L0; - } - else - { - l = list_push_back( l, object_new( *elements ) ); - } - ++elements; - } - - if ( l != L0 ) - lol_add( lol, l ); -} - - -#ifdef HAVE_PYTHON - -/* - * Calls the bjam rule specified by name passed in 'args'. The name is looked up - * in the context of bjam's 'python_interface' module. Returns the list of - * strings returned by the rule. - */ - -PyObject * bjam_call( PyObject * self, PyObject * args ) -{ - FRAME inner[ 1 ]; - LIST * result; - PARSE * p; - OBJECT * rulename; - - /* Build up the list of arg lists. */ - frame_init( inner ); - inner->prev = 0; - inner->prev_user = 0; - inner->module = bindmodule( constant_python_interface ); - - /* Extract the rule name and arguments from 'args'. */ - - /* PyTuple_GetItem returns borrowed reference. */ - rulename = object_new( PyString_AsString( PyTuple_GetItem( args, 0 ) ) ); - { - int i = 1; - int size = PyTuple_Size( args ); - for ( ; i < size; ++i ) - { - PyObject * a = PyTuple_GetItem( args, i ); - if ( PyString_Check( a ) ) - { - lol_add( inner->args, list_new( object_new( - PyString_AsString( a ) ) ) ); - } - else if ( PySequence_Check( a ) ) - { - LIST * l = 0; - int s = PySequence_Size( a ); - int i = 0; - for ( ; i < s; ++i ) - { - /* PySequence_GetItem returns new reference. */ - PyObject * e = PySequence_GetItem( a, i ); - char * s = PyString_AsString( e ); - if ( !s ) - { - printf( "Invalid parameter type passed from Python\n" ); - exit( 1 ); - } - l = list_push_back( l, object_new( s ) ); - Py_DECREF( e ); - } - lol_add( inner->args, l ); - } - } - } - - result = evaluate_rule( bindrule( rulename, inner->module), rulename, inner ); - object_free( rulename ); - - frame_free( inner ); - - /* Convert the bjam list into a Python list result. */ - { - PyObject * const pyResult = PyList_New( list_length( result ) ); - int i = 0; - LISTITER iter = list_begin( result ); - LISTITER const end = list_end( result ); - for ( ; iter != end; iter = list_next( iter ) ) - { - PyList_SetItem( pyResult, i, PyString_FromString( object_str( - list_item( iter ) ) ) ); - i += 1; - } - list_free( result ); - return pyResult; - } -} - - -/* - * Accepts four arguments: - * - module name - * - rule name, - * - Python callable. - * - (optional) bjam language function signature. - * Creates a bjam rule with the specified name in the specified module, which - * will invoke the Python callable. - */ - -PyObject * bjam_import_rule( PyObject * self, PyObject * args ) -{ - char * module; - char * rule; - PyObject * func; - PyObject * bjam_signature = NULL; - module_t * m; - RULE * r; - OBJECT * module_name; - OBJECT * rule_name; - - if ( !PyArg_ParseTuple( args, "ssO|O:import_rule", - &module, &rule, &func, &bjam_signature ) ) - return NULL; - - if ( !PyCallable_Check( func ) ) - { - PyErr_SetString( PyExc_RuntimeError, "Non-callable object passed to " - "bjam.import_rule" ); - return NULL; - } - - module_name = *module ? object_new( module ) : 0; - m = bindmodule( module_name ); - if ( module_name ) - object_free( module_name ); - rule_name = object_new( rule ); - new_rule_body( m, rule_name, function_python( func, bjam_signature ), 0 ); - object_free( rule_name ); - - Py_INCREF( Py_None ); - return Py_None; -} - - -/* - * Accepts four arguments: - * - an action name - * - an action body - * - a list of variable that will be bound inside the action - * - integer flags. - * Defines an action on bjam side. - */ - -PyObject * bjam_define_action( PyObject * self, PyObject * args ) -{ - char * name; - char * body; - module_t * m; - PyObject * bindlist_python; - int flags; - LIST * bindlist = L0; - int n; - int i; - OBJECT * name_str; - FUNCTION * body_func; - - if ( !PyArg_ParseTuple( args, "ssO!i:define_action", &name, &body, - &PyList_Type, &bindlist_python, &flags ) ) - return NULL; - - n = PyList_Size( bindlist_python ); - for ( i = 0; i < n; ++i ) - { - PyObject * next = PyList_GetItem( bindlist_python, i ); - if ( !PyString_Check( next ) ) - { - PyErr_SetString( PyExc_RuntimeError, "bind list has non-string " - "type" ); - return NULL; - } - bindlist = list_push_back( bindlist, object_new( PyString_AsString( next - ) ) ); - } - - name_str = object_new( name ); - body_func = function_compile_actions( body, constant_builtin, -1 ); - new_rule_actions( root_module(), name_str, body_func, bindlist, flags ); - function_free( body_func ); - object_free( name_str ); - - Py_INCREF( Py_None ); - return Py_None; -} - - -/* - * Returns the value of a variable in root Jam module. - */ - -PyObject * bjam_variable( PyObject * self, PyObject * args ) -{ - char * name; - LIST * value; - PyObject * result; - int i; - OBJECT * varname; - LISTITER iter; - LISTITER end; - - if ( !PyArg_ParseTuple( args, "s", &name ) ) - return NULL; - - varname = object_new( name ); - value = var_get( root_module(), varname ); - object_free( varname ); - iter = list_begin( value ); - end = list_end( value ); - - result = PyList_New( list_length( value ) ); - for ( i = 0; iter != end; iter = list_next( iter ), ++i ) - PyList_SetItem( result, i, PyString_FromString( object_str( list_item( - iter ) ) ) ); - - return result; -} - - -PyObject * bjam_backtrace( PyObject * self, PyObject * args ) -{ - PyObject * result = PyList_New( 0 ); - struct frame * f = frame_before_python_call; - - for ( ; f = f->prev; ) - { - PyObject * tuple = PyTuple_New( 4 ); - char const * file; - int line; - char buf[ 32 ]; - string module_name[ 1 ]; - - get_source_line( f, &file, &line ); - sprintf( buf, "%d", line ); - string_new( module_name ); - if ( f->module->name ) - { - string_append( module_name, object_str( f->module->name ) ); - string_append( module_name, "." ); - } - - /* PyTuple_SetItem steals reference. */ - PyTuple_SetItem( tuple, 0, PyString_FromString( file ) ); - PyTuple_SetItem( tuple, 1, PyString_FromString( buf ) ); - PyTuple_SetItem( tuple, 2, PyString_FromString( module_name->value ) ); - PyTuple_SetItem( tuple, 3, PyString_FromString( f->rulename ) ); - - string_free( module_name ); - - PyList_Append( result, tuple ); - Py_DECREF( tuple ); - } - return result; -} - -PyObject * bjam_caller( PyObject * self, PyObject * args ) -{ - return PyString_FromString( frame_before_python_call->prev->module->name ? - object_str( frame_before_python_call->prev->module->name ) : "" ); -} - -#endif /* #ifdef HAVE_PYTHON */ - - -#ifdef HAVE_POPEN - -#if defined(_MSC_VER) || defined(__BORLANDC__) - #define popen windows_popen_wrapper - #define pclose _pclose - - /* - * This wrapper is a workaround for a funny _popen() feature on Windows - * where it eats external quotes in some cases. The bug seems to be related - * to the quote stripping functionality used by the Windows cmd.exe - * interpreter when its /S is not specified. - * - * Cleaned up quote from the cmd.exe help screen as displayed on Windows XP - * SP3: - * - * 1. If all of the following conditions are met, then quote characters on - * the command line are preserved: - * - * - no /S switch - * - exactly two quote characters - * - no special characters between the two quote characters, where - * special is one of: &<>()@^| - * - there are one or more whitespace characters between the two quote - * characters - * - the string between the two quote characters is the name of an - * executable file. - * - * 2. Otherwise, old behavior is to see if the first character is a quote - * character and if so, strip the leading character and remove the last - * quote character on the command line, preserving any text after the - * last quote character. - * - * This causes some commands containing quotes not to be executed correctly. - * For example: - * - * "\Long folder name\aaa.exe" --name="Jurko" --no-surname - * - * would get its outermost quotes stripped and would be executed as: - * - * \Long folder name\aaa.exe" --name="Jurko --no-surname - * - * which would report an error about '\Long' not being a valid command. - * - * cmd.exe help seems to indicate it would be enough to add an extra space - * character in front of the command to avoid this but this does not work, - * most likely due to the shell first stripping all leading whitespace - * characters from the command. - * - * Solution implemented here is to quote the whole command in case it - * contains any quote characters. Note thought this will not work correctly - * should Windows ever 'fix' this feature. - * (03.06.2008.) (Jurko) - */ - static FILE * windows_popen_wrapper( char const * command, - char const * mode ) - { - int const extra_command_quotes_needed = !!strchr( command, '"' ); - string quoted_command; - FILE * result; - - if ( extra_command_quotes_needed ) - { - string_new( "ed_command ); - string_append( "ed_command, "\"" ); - string_append( "ed_command, command ); - string_append( "ed_command, "\"" ); - command = quoted_command.value; - } - - result = _popen( command, "r" ); - - if ( extra_command_quotes_needed ) - string_free( "ed_command ); - - return result; - } -#endif /* defined(_MSC_VER) || defined(__BORLANDC__) */ - - -static char * rtrim( char * const s ) -{ - char * p = s; - while ( *p ) ++p; - for ( --p; p >= s && isspace( *p ); *p-- = 0 ); - return s; -} - - -LIST * builtin_shell( FRAME * frame, int flags ) -{ - LIST * command = lol_get( frame->args, 0 ); - LIST * result = L0; - string s; - int ret; - char buffer[ 1024 ]; - FILE * p = NULL; - int exit_status = -1; - int exit_status_opt = 0; - int no_output_opt = 0; - int strip_eol_opt = 0; - - /* Process the variable args options. */ - { - int a = 1; - LIST * arg = lol_get( frame->args, a ); - for ( ; !list_empty( arg ); arg = lol_get( frame->args, ++a ) ) - { - if ( !strcmp( "exit-status", object_str( list_front( arg ) ) ) ) - exit_status_opt = 1; - else if ( !strcmp( "no-output", object_str( list_front( arg ) ) ) ) - no_output_opt = 1; - else if ( !strcmp("strip-eol", object_str( list_front( arg ) ) ) ) - strip_eol_opt = 1; - } - } - - /* The following fflush() call seems to be indicated as a workaround for a - * popen() bug on POSIX implementations related to synhronizing input - * stream positions for the called and the calling process. - */ - fflush( NULL ); - - p = popen( object_str( list_front( command ) ), "r" ); - if ( p == NULL ) - return L0; - - string_new( &s ); - - while ( ( ret = fread( buffer, sizeof( char ), sizeof( buffer ) - 1, p ) ) > - 0 ) - { - buffer[ ret ] = 0; - if ( !no_output_opt ) - { - if ( strip_eol_opt ) - rtrim( buffer ); - string_append( &s, buffer ); - } - } - - exit_status = pclose( p ); - - /* The command output is returned first. */ - result = list_new( object_new( s.value ) ); - string_free( &s ); - - /* The command exit result next. */ - if ( exit_status_opt ) - { - if ( WIFEXITED( exit_status ) ) - exit_status = WEXITSTATUS( exit_status ); - else - exit_status = -1; - sprintf( buffer, "%d", exit_status ); - result = list_push_back( result, object_new( buffer ) ); - } - - return result; -} - -#else /* #ifdef HAVE_POPEN */ - -LIST * builtin_shell( FRAME * frame, int flags ) -{ - return L0; -} - -#endif /* #ifdef HAVE_POPEN */
http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/builtins.h ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/builtins.h b/ext/kenlm/jam-files/engine/builtins.h deleted file mode 100644 index b7a967c..0000000 --- a/ext/kenlm/jam-files/engine/builtins.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc. - * - * This file is part of Jam - see jam.c for Copyright information. - */ - -#ifndef JAM_BUILTINS_H -# define JAM_BUILTINS_H - -# include "frames.h" - -/* - * builtins.h - compile parsed jam statements - */ - -void load_builtins(); -void init_set(); -void init_path(); -void init_regex(); -void init_property_set(); -void init_sequence(); -void init_order(); - -void property_set_done(); - -LIST *builtin_calc( FRAME * frame, int flags ); -LIST *builtin_depends( FRAME * frame, int flags ); -LIST *builtin_rebuilds( FRAME * frame, int flags ); -LIST *builtin_echo( FRAME * frame, int flags ); -LIST *builtin_exit( FRAME * frame, int flags ); -LIST *builtin_flags( FRAME * frame, int flags ); -LIST *builtin_glob( FRAME * frame, int flags ); -LIST *builtin_glob_recursive( FRAME * frame, int flags ); -LIST *builtin_subst( FRAME * frame, int flags ); -LIST *builtin_match( FRAME * frame, int flags ); -LIST *builtin_split_by_characters( FRAME * frame, int flags ); -LIST *builtin_hdrmacro( FRAME * frame, int flags ); -LIST *builtin_rulenames( FRAME * frame, int flags ); -LIST *builtin_varnames( FRAME * frame, int flags ); -LIST *builtin_delete_module( FRAME * frame, int flags ); -LIST *builtin_import( FRAME * frame, int flags ); -LIST *builtin_export( FRAME * frame, int flags ); -LIST *builtin_caller_module( FRAME * frame, int flags ); -LIST *builtin_backtrace( FRAME * frame, int flags ); -LIST *builtin_pwd( FRAME * frame, int flags ); -LIST *builtin_update( FRAME * frame, int flags ); -LIST *builtin_update_now( FRAME * frame, int flags ); -LIST *builtin_import_module( FRAME * frame, int flags ); -LIST *builtin_imported_modules( FRAME * frame, int flags ); -LIST *builtin_instance( FRAME * frame, int flags ); -LIST *builtin_sort( FRAME * frame, int flags ); -LIST *builtin_normalize_path( FRAME * frame, int flags ); -LIST *builtin_native_rule( FRAME * frame, int flags ); -LIST *builtin_has_native_rule( FRAME * frame, int flags ); -LIST *builtin_user_module( FRAME * frame, int flags ); -LIST *builtin_nearest_user_location( FRAME * frame, int flags ); -LIST *builtin_check_if_file( FRAME * frame, int flags ); -LIST *builtin_python_import_rule( FRAME * frame, int flags ); -LIST *builtin_shell( FRAME * frame, int flags ); -LIST *builtin_md5( FRAME * frame, int flags ); -LIST *builtin_file_open( FRAME * frame, int flags ); -LIST *builtin_pad( FRAME * frame, int flags ); -LIST *builtin_precious( FRAME * frame, int flags ); -LIST *builtin_self_path( FRAME * frame, int flags ); -LIST *builtin_makedir( FRAME * frame, int flags ); - -void backtrace( FRAME *frame ); -extern int last_update_now_status; - -#endif http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/bump_version.py ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/bump_version.py b/ext/kenlm/jam-files/engine/bump_version.py deleted file mode 100644 index 1771422..0000000 --- a/ext/kenlm/jam-files/engine/bump_version.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/python - -# This script is used to bump the bjam version. It takes a single argument, e.g -# -# ./bump_version.py 3.1.9 -# -# and updates all the necessary files. -# -# Copyright 2006 Rene Rivera. -# Copyright 2005-2006 Vladimir Prus. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) - - -import os -import os.path -import re -import string -import sys - -srcdir = os.path.abspath(os.path.dirname(__file__)) -docdir = os.path.abspath(os.path.join(srcdir, "..", "doc")) - - -def edit(file, *replacements): - print(" '%s'..." % file) - f = open(file, 'r') - text = f.read() - f.close() - for (source, target) in replacements: - text, n = re.compile(source, re.MULTILINE).subn(target, text) - assert n > 0 - f = open(file, 'w') - f.write(text) - f.close() - - -def make_edits(ver): - ver03 = (list(ver) + [0] * 3)[0:3] - ver02 = ver03[0:2] - - join = lambda v, s : s.join(str(x) for x in v) - dotJoin = lambda v : join(v, ".") - - print("Setting version to %s" % str(ver03)) - - edit(os.path.join(srcdir, "boost-jam.spec"), - ('^(Version:) .*$', '\\1 %s' % dotJoin(ver03))) - - edit(os.path.join(srcdir, "build.jam"), - ('^(_VERSION_ =).* ;$', '\\1 %s ;' % join(ver03, " "))) - - edit(os.path.join(docdir, "bjam.qbk"), - ('(\[version).*(\])', '\\1: %s\\2' % dotJoin(ver03)), - ('(\[def :version:).*(\])', '\\1 %s\\2' % dotJoin(ver03))) - - edit(os.path.join(srcdir, "patchlevel.h"), - ('^(#define VERSION_MAJOR) .*$', '\\1 %s' % ver03[0]), - ('^(#define VERSION_MINOR) .*$', '\\1 %s' % ver03[1]), - ('^(#define VERSION_PATCH) .*$', '\\1 %s' % ver03[2]), - ('^(#define VERSION_MAJOR_SYM) .*$', '\\1 "%02d"' % ver03[0]), - ('^(#define VERSION_MINOR_SYM) .*$', '\\1 "%02d"' % ver03[1]), - ('^(#define VERSION_PATCH_SYM) .*$', '\\1 "%02d"' % ver03[2]), - ('^(#define VERSION) .*$', '\\1 "%s"' % dotJoin(ver)), - ('^(#define JAMVERSYM) .*$', '\\1 "JAMVERSION=%s"' % dotJoin(ver02))) - - -def main(): - if len(sys.argv) < 2: - print("Expect new version as argument.") - sys.exit(1) - if len(sys.argv) > 3: - print("Too many arguments.") - sys.exit(1) - - version = sys.argv[1].split(".") - if len(version) > 3: - print("Expect version argument in the format: <MAJOR>.<MINOR>.<PATCH>") - sys.exit(1) - - try: - version = list(int(x) for x in version) - except ValueError: - print("Version values must be valid integers.") - sys.exit(1) - - while version and version[-1] == 0: - version.pop() - - if not version: - print("At least one of the version values must be positive.") - sys.exit() - - make_edits(version) - - -if __name__ == '__main__': - main() http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/class.c ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/class.c b/ext/kenlm/jam-files/engine/class.c deleted file mode 100644 index a4abfaa..0000000 --- a/ext/kenlm/jam-files/engine/class.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright Vladimir Prus 2003. - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or copy at - * http://www.boost.org/LICENSE_1_0.txt) - */ - -#include "class.h" - -#include "constants.h" -#include "frames.h" -#include "hash.h" -#include "lists.h" -#include "object.h" -#include "rules.h" -#include "strings.h" -#include "variable.h" - -#include <stdio.h> -#include <stdlib.h> - - -static struct hash * classes = 0; - - -static void check_defined( LIST * class_names ) -{ - LISTITER iter = list_begin( class_names ); - LISTITER const end = list_end( class_names ); - for ( ; iter != end; iter = list_next( iter ) ) - { - if ( !hash_find( classes, list_item( iter ) ) ) - { - printf( "Class %s is not defined\n", object_str( list_item( iter ) ) - ); - abort(); - } - } -} - - -static OBJECT * class_module_name( OBJECT * declared_name ) -{ - string name[ 1 ]; - OBJECT * result; - - string_new( name ); - string_append( name, "class@" ); - string_append( name, object_str( declared_name ) ); - - result = object_new( name->value ); - string_free( name ); - - return result; -} - - -struct import_base_data -{ - OBJECT * base_name; - module_t * base_module; - module_t * class_module; -}; - - -static void import_base_rule( void * r_, void * d_ ) -{ - RULE * r = (RULE *)r_; - RULE * ir1; - RULE * ir2; - struct import_base_data * d = (struct import_base_data *)d_; - OBJECT * qname; - - string qualified_name[ 1 ]; - string_new ( qualified_name ); - string_append ( qualified_name, object_str( d->base_name ) ); - string_push_back( qualified_name, '.' ); - string_append ( qualified_name, object_str( r->name ) ); - qname = object_new( qualified_name->value ); - string_free( qualified_name ); - - ir1 = import_rule( r, d->class_module, r->name ); - ir2 = import_rule( r, d->class_module, qname ); - - object_free( qname ); - - /* Copy 'exported' flag. */ - ir1->exported = ir2->exported = r->exported; - - /* If we are importing a class method, localize it. */ - if ( ( r->module == d->base_module ) || ( r->module->class_module && - ( r->module->class_module == d->base_module ) ) ) - { - rule_localize( ir1, d->class_module ); - rule_localize( ir2, d->class_module ); - } -} - - -/* - * For each exported rule 'n', declared in class module for base, imports that - * rule in 'class' as 'n' and as 'base.n'. Imported rules are localized and - * marked as exported. - */ - -static void import_base_rules( module_t * class_, OBJECT * base ) -{ - OBJECT * module_name = class_module_name( base ); - module_t * base_module = bindmodule( module_name ); - LIST * imported; - struct import_base_data d; - d.base_name = base; - d.base_module = base_module; - d.class_module = class_; - object_free( module_name ); - - if ( base_module->rules ) - hashenumerate( base_module->rules, import_base_rule, &d ); - - imported = imported_modules( base_module ); - import_module( imported, class_ ); - list_free( imported ); -} - - -OBJECT * make_class_module( LIST * xname, LIST * bases, FRAME * frame ) -{ - OBJECT * name = class_module_name( list_front( xname ) ); - OBJECT * * pp; - module_t * class_module = 0; - module_t * outer_module = frame->module; - int found; - - if ( !classes ) - classes = hashinit( sizeof( OBJECT * ), "classes" ); - - pp = (OBJECT * *)hash_insert( classes, list_front( xname ), &found ); - if ( !found ) - { - *pp = object_copy( list_front( xname ) ); - } - else - { - printf( "Class %s already defined\n", object_str( list_front( xname ) ) - ); - abort(); - } - check_defined( bases ); - - class_module = bindmodule( name ); - - { - /* - Initialize variables that Boost.Build inserts in every object. - We want to avoid creating the object's hash if it isn't needed. - */ - int num = class_module->num_fixed_variables; - module_add_fixed_var( class_module, constant_name, &num ); - module_add_fixed_var( class_module, constant_class, &num ); - module_set_fixed_variables( class_module, num ); - } - - var_set( class_module, constant_name, xname, VAR_SET ); - var_set( class_module, constant_bases, bases, VAR_SET ); - - { - LISTITER iter = list_begin( bases ); - LISTITER const end = list_end( bases ); - for ( ; iter != end; iter = list_next( iter ) ) - import_base_rules( class_module, list_item( iter ) ); - } - - return name; -} - - -static void free_class( void * xclass, void * data ) -{ - object_free( *(OBJECT * *)xclass ); -} - - -void class_done( void ) -{ - if ( classes ) - { - hashenumerate( classes, free_class, (void *)0 ); - hashdone( classes ); - classes = 0; - } -} http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/class.h ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/class.h b/ext/kenlm/jam-files/engine/class.h deleted file mode 100644 index 256d298..0000000 --- a/ext/kenlm/jam-files/engine/class.h +++ /dev/null @@ -1,14 +0,0 @@ -/* Copyright Vladimir Prus 2003. Distributed under the Boost */ -/* Software License, Version 1.0. (See accompanying */ -/* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ - -#ifndef CLASS_H_VP_2003_08_01 -#define CLASS_H_VP_2003_08_01 - -#include "lists.h" -#include "frames.h" - -OBJECT * make_class_module( LIST * xname, LIST * bases, FRAME * frame ); -void class_done( void ); - -#endif http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/command.c ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/command.c b/ext/kenlm/jam-files/engine/command.c deleted file mode 100644 index 571b8b6..0000000 --- a/ext/kenlm/jam-files/engine/command.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 1993, 1995 Christopher Seiwald. - * - * This file is part of Jam - see jam.c for Copyright information. - */ - -/* This file is ALSO: - * Copyright 2001-2004 David Abrahams. - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) - */ - -/* - * command.c - maintain lists of commands - */ - -#include "jam.h" -#include "command.h" - -#include "lists.h" -#include "rules.h" - -#include <assert.h> - - -/* - * cmd_new() - return a new CMD. - */ - -CMD * cmd_new( RULE * rule, LIST * targets, LIST * sources, LIST * shell ) -{ - CMD * cmd = (CMD *)BJAM_MALLOC( sizeof( CMD ) ); - FRAME frame[ 1 ]; - - assert( cmd ); - cmd->rule = rule; - cmd->shell = shell; - cmd->next = 0; - cmd->noop = 0; - - lol_init( &cmd->args ); - lol_add( &cmd->args, targets ); - lol_add( &cmd->args, sources ); - string_new( cmd->buf ); - - frame_init( frame ); - frame->module = rule->module; - lol_init( frame->args ); - lol_add( frame->args, list_copy( targets ) ); - lol_add( frame->args, list_copy( sources ) ); - function_run_actions( rule->actions->command, frame, stack_global(), - cmd->buf ); - frame_free( frame ); - - return cmd; -} - - -/* - * cmd_free() - free a CMD - */ - -void cmd_free( CMD * cmd ) -{ - lol_free( &cmd->args ); - list_free( cmd->shell ); - string_free( cmd->buf ); - BJAM_FREE( (void *)cmd ); -} - - -/* - * cmd_release_targets_and_shell() - * - * Makes the CMD release its hold on its targets & shell lists and forget - * about them. Useful in case caller still has references to those lists and - * wants to reuse them after freeing the CMD object. - */ - -void cmd_release_targets_and_shell( CMD * cmd ) -{ - cmd->args.list[ 0 ] = L0; /* targets */ - cmd->shell = L0; /* shell */ -} http://git-wip-us.apache.org/repos/asf/incubator-joshua/blob/6da3961b/ext/kenlm/jam-files/engine/command.h ---------------------------------------------------------------------- diff --git a/ext/kenlm b/ext/kenlm new file mode 160000 index 0000000..56fdb5c --- /dev/null +++ b/ext/kenlm @@ -0,0 +1 @@ +Subproject commit 56fdb5c44fca34d5a2e07d96139c28fb163983c5 diff --git a/ext/kenlm/jam-files/engine/command.h b/ext/kenlm/jam-files/engine/command.h deleted file mode 100644 index ba65577..0000000 --- a/ext/kenlm/jam-files/engine/command.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 1994 Christopher Seiwald. - * - * This file is part of Jam - see jam.c for Copyright information. - */ - -/* - * command.h - the CMD structure and routines to manipulate them - * - * Both ACTION and CMD contain a rule, targets, and sources. An - * ACTION describes a rule to be applied to the given targets and - * sources; a CMD is what actually gets executed by the shell. The - * differences are due to: - * - * ACTIONS must be combined if 'actions together' is given. - * ACTIONS must be split if 'actions piecemeal' is given. - * ACTIONS must have current sources omitted for 'actions updated'. - * - * The CMD datatype holds a single command that is to be executed - * against a target, and they can chain together to represent the - * full collection of commands used to update a target. - * - * Structures: - * - * CMD - an action, ready to be formatted into a buffer and executed. - * - * External routines: - * - * cmd_new() - return a new CMD or 0 if too many args. - * cmd_free() - delete CMD and its parts. - * cmd_next() - walk the CMD chain. - * cmd_release_targets_and_shell() - CMD forgets about its targets & shell. - */ - - -/* - * CMD - an action, ready to be formatted into a buffer and executed. - */ - -#ifndef COMMAND_SW20111118_H -#define COMMAND_SW20111118_H - -#include "lists.h" -#include "rules.h" -#include "strings.h" - - -typedef struct _cmd CMD; -struct _cmd -{ - CMD * next; - RULE * rule; /* rule->actions contains shell script */ - LIST * shell; /* $(JAMSHELL) value */ - LOL args; /* LISTs for $(<), $(>) */ - string buf[ 1 ]; /* actual commands */ - int noop; /* no-op commands should be faked instead of executed */ -}; - -CMD * cmd_new -( - RULE * rule, /* rule (referenced) */ - LIST * targets, /* $(<) (ownership transferred) */ - LIST * sources, /* $(>) (ownership transferred) */ - LIST * shell /* $(JAMSHELL) (ownership transferred) */ -); - -void cmd_release_targets_and_shell( CMD * ); - -void cmd_free( CMD * ); - -#define cmd_next( c ) ((c)->next) - -#endif
