//----------------------------------------------------------------------------- // name: load_internal_modules() // desc: ... //----------------------------------------------------------------------------- t_CKBOOL load_internal_modules( Chuck_Compiler * compiler ) { // log EM_log( CK_LOG_SEVERE, "loading built-in modules..." ); // push indent level EM_pushlog(); // get env Chuck_Env * env = compiler->env; // make context Chuck_Context * context = type_engine_make_context( NULL, "@[internal]" ); // reset env - not needed since we just created the env env->reset(); // load it type_engine_load_context( env, context ); // load EM_log( CK_LOG_SEVERE, "module osc..." ); load_module( env, osc_query, "osc", "global" ); EM_log( CK_LOG_SEVERE, "module xxx..." ); load_module( env, xxx_query, "xxx", "global" ); EM_log( CK_LOG_SEVERE, "module filter..." ); load_module( env, filter_query, "filter", "global" ); EM_log( CK_LOG_SEVERE, "module STK..." ); load_module( env, stk_query, "stk", "global" ); EM_log( CK_LOG_SEVERE, "module xform..." ); load_module( env, xform_query, "xform", "global" ); EM_log( CK_LOG_SEVERE, "module extract..." ); load_module( env, extract_query, "extract", "global" ); // load EM_log( CK_LOG_SEVERE, "class 'machine'..." ); if( !load_module( env, machine_query, "Machine", "global" ) ) goto error; machine_init( compiler, otf_process_msg ); EM_log( CK_LOG_SEVERE, "class 'std'..." ); if( !load_module( env, libstd_query, "Std", "global" ) ) goto error; EM_log( CK_LOG_SEVERE, "class 'math'..." ); if( !load_module( env, libmath_query, "Math", "global" ) ) goto error; EM_log( CK_LOG_SEVERE, "class 'opsc'..." ); if( !load_module( env, opensoundcontrol_query, "opsc", "global" ) ) goto error; // if( !load_module( env, net_query, "net", "global" ) ) goto error; #ifndef __DISABLE_MIDI__ if( !init_class_Midi( env ) ) goto error; if( !init_class_MidiRW( env ) ) goto error; #endif // __DISABLE_MIDI__ if( !init_class_HID( env ) ) goto error; // clear context type_engine_unload_context( env ); // commit what is in the type checker at this point env->global()->commit(); // pop indent level EM_poplog(); return TRUE; error: // probably dangerous: rollback env->global()->rollback(); // clear context type_engine_unload_context( env ); // pop indent level EM_poplog(); return FALSE; }
//----------------------------------------------------------------------------- // name: libstd_query() // desc: query entry point //----------------------------------------------------------------------------- DLL_QUERY libstd_query( Chuck_DL_Query * QUERY ) { // get global Chuck_Env * env = Chuck_Env::instance(); // set name QUERY->setname( QUERY, "Std" ); /*! \example std.rand2f( 100.0, 1000.0 ) => stdout; */ // register deprecate type_engine_register_deprecate( env, "std", "Std" ); // begin class QUERY->begin_class( QUERY, "Std", "Object" ); QUERY->doc_class( QUERY, "Std is a standard library in ChucK, which includes utility functions for random number generation, unit conversions, and absolute value." ); // add abs QUERY->add_sfun( QUERY, abs_impl, "int", "abs" ); QUERY->add_arg( QUERY, "int", "value" ); QUERY->doc_func( QUERY, "Return absolute value of integer." ); // add fabs QUERY->add_sfun( QUERY, fabs_impl, "float", "fabs" ); QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Return absolute value of float." ); // add rand QUERY->add_sfun( QUERY, rand_impl, "int", "rand"); //! return int between 0 and RAND_MAX QUERY->doc_func( QUERY, "Generates random integer between 0 and Std.RAND_MAX. (NOTE: soon-to-be-deprecated; use Math.random2())." ); // add rand2 QUERY->add_sfun( QUERY, rand2_impl, "int", "rand2" ); //! integer between [min,max] QUERY->add_arg( QUERY, "int", "min" ); QUERY->add_arg( QUERY, "int", "max" ); QUERY->doc_func( QUERY, "Generates random integer in range [min, max]. (NOTE: soon-to-be-deprecated; use Math.random2())." ); // add rand QUERY->add_sfun( QUERY, randf_impl, "float", "randf" ); //! rand between -1.0,1.0 QUERY->doc_func( QUERY, "Return random floating point number in the range [-1, 1]. (Note: soon-to-be-deprecated; use Math.randomf())" ); // add rand2 QUERY->add_sfun( QUERY, rand2f_impl, "float", "rand2f" ); //! rand between min and max QUERY->add_arg( QUERY, "float", "min" ); QUERY->add_arg( QUERY, "float", "max" ); QUERY->doc_func( QUERY, "Return random floating point number in the range [min, max]. (NOTE: soon-to-be-deprecated; use Math.random2f())" ); // add srand QUERY->add_sfun( QUERY, srand_impl, "void", "srand" ); QUERY->add_arg( QUERY, "int", "seed" ); QUERY->doc_func( QUERY, "Provide a seed to the random function. Different seeds will generate very different sequences of random numbers even if the seeds are close together. " "Alternatively, a sequence of random numbers can be repeated by setting the same seed. " ); // add sgn QUERY->add_sfun( QUERY, sgn_impl, "float", "sgn" ); //! return sign of value (-1, 0, 1) QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Computes the sign of the input as -1.0 (negative), 0 (zero), or 1.0 (positive)." ); // add system //! see \example std.ck QUERY->add_sfun( QUERY, system_impl, "int", "system" ); //! issue system command QUERY->add_arg( QUERY, "string", "cmd" ); QUERY->doc_func( QUERY, "Pass a command to be executed in the shell (requires --caution-to-the-wind command-line flag)." ); // add atoi QUERY->add_sfun( QUERY, atoi_impl, "int", "atoi" ); //! string to integer QUERY->add_arg( QUERY, "string", "value" ); QUERY->doc_func( QUERY, "Converts ascii (string) to integer (int)." ); // add atof QUERY->add_sfun( QUERY, atof_impl, "float", "atof" ); //! string to float QUERY->add_arg( QUERY, "string", "value" ); QUERY->doc_func( QUERY, "Converts ascii (string) to floating point value (float)." ); // add itoa QUERY->add_sfun( QUERY, itoa_impl, "string", "itoa" ); //! int to string QUERY->add_arg( QUERY, "int", "i" ); QUERY->doc_func( QUERY, "Converts integer (int) to ascii (string)." ); // add ftoa QUERY->add_sfun( QUERY, ftoa_impl, "string", "ftoa" ); //! float to string QUERY->add_arg( QUERY, "float", "f" ); QUERY->add_arg( QUERY, "int", "precision" ); QUERY->doc_func( QUERY, "Converts floating point value (float) to ascii (string) with specified precision (number of decimal digits)." ); // add ftoi QUERY->add_sfun( QUERY, ftoi_impl, "int", "ftoi" ); //! float to int QUERY->add_arg( QUERY, "float", "f" ); QUERY->doc_func( QUERY, "Convert float to int. " ); // add getenv QUERY->add_sfun( QUERY, getenv_impl, "string", "getenv" ); //! fetch environment variable QUERY->add_arg( QUERY, "string", "value" ); QUERY->doc_func( QUERY, "Returns the value of an environment variable, such as of PATH." ); // add setenv QUERY->add_sfun( QUERY, setenv_impl, "int", "setenv" ); //! set environment variable QUERY->add_arg( QUERY, "string", "key" ); QUERY->add_arg( QUERY, "string", "value" ); QUERY->doc_func( QUERY, "Set value of environment variable named key to value." ); // add mtof //! see \example mand-o-matic.ck QUERY->add_sfun( QUERY, mtof_impl, "float", "mtof" ); //! midi note to frequency QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert a MIDI note number to frequency (Hz). Note the input value is of type float (supports fractional note number)." ); // add ftom QUERY->add_sfun( QUERY, ftom_impl, "float", "ftom" ); //! frequency to midi note QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert frequency (Hz) to MIDI note number space." ); // add powtodb QUERY->add_sfun( QUERY, powtodb_impl, "float", "powtodb" ); //! linear power to decibel QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert signal power ratio to decibels (dB)." ); // add rmstodb QUERY->add_sfun( QUERY, rmstodb_impl, "float", "rmstodb" ); //! rms to decibel QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert rms to decibels (dB)." ); // add dbtopow QUERY->add_sfun( QUERY, dbtopow_impl, "float", "dbtopow" ); //! decibel to linear QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert decibels (dB) to signal power ratio." ); // add dbtorms QUERY->add_sfun( QUERY, dbtorms_impl, "float", "dbtorms" ); //! decibel to rms QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert decibels (dB) to rms." ); // add dbtolin QUERY->add_sfun( QUERY, dbtolin_impl, "float", "dbtolin" ); //! decibel to linear QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert decibels (dB) to linear amplitude." ); // add lintodb QUERY->add_sfun( QUERY, lintodb_impl, "float", "lintodb" ); //! linear to decibel QUERY->add_arg( QUERY, "float", "value" ); QUERY->doc_func( QUERY, "Convert linear amplitude to decibels (dB)."); // add clamp QUERY->add_sfun( QUERY, clamp_impl, "int", "clamp" ); //! clamp to range (int) QUERY->add_arg( QUERY, "int", "value" ); QUERY->add_arg( QUERY, "int", "min" ); QUERY->add_arg( QUERY, "int", "max" ); QUERY->doc_func( QUERY, "Clamp integer to range [min, max]." ); // add clampf QUERY->add_sfun( QUERY, clampf_impl, "float", "clampf" ); //! clamp to range (float) QUERY->add_arg( QUERY, "float", "value" ); QUERY->add_arg( QUERY, "float", "min" ); QUERY->add_arg( QUERY, "float", "max" ); QUERY->doc_func( QUERY, "Clamp float to range [min, max]." ); // add scalef QUERY->add_sfun( QUERY, scalef_impl, "float", "scalef" ); //! scale from source range to dest range (float) QUERY->add_arg( QUERY, "float", "value" ); QUERY->add_arg( QUERY, "float", "srcmin" ); QUERY->add_arg( QUERY, "float", "srcmax" ); QUERY->add_arg( QUERY, "float", "dstmin" ); QUERY->add_arg( QUERY, "float", "dstmax" ); QUERY->doc_func( QUERY, "Scale a float from source range to destination range." ); // finish class QUERY->end_class( QUERY ); // seed the rand srand( time( NULL ) ); Chuck_DL_Func * func = NULL; #ifndef __DISABLE_KBHIT__ // KBHit // begin class (KBHit) if( !type_engine_import_class_begin( env, "KBHit", "Event", env->global(), KBHit_ctor, KBHit_dtor ) ) return FALSE; // add member variable KBHit_offset_data = type_engine_import_mvar( env, "int", "@KBHit_data", FALSE ); if( KBHit_offset_data == CK_INVALID_OFFSET ) goto error; // add on() func = make_new_mfun( "void", "on", KBHit_on ); if( !type_engine_import_mfun( env, func ) ) goto error; // add off() func = make_new_mfun( "void", "off", KBHit_off ); if( !type_engine_import_mfun( env, func ) ) goto error; // add state() func = make_new_mfun( "void", "state", KBHit_state ); if( !type_engine_import_mfun( env, func ) ) goto error; // add hit() func = make_new_mfun( "Event", "hit", KBHit_hit ); if( !type_engine_import_mfun( env, func ) ) goto error; // add more() func = make_new_mfun( "int", "more", KBHit_more ); if( !type_engine_import_mfun( env, func ) ) goto error; // add getchar() func = make_new_mfun( "int", "getchar", KBHit_getchar ); if( !type_engine_import_mfun( env, func ) ) goto error; // add can_wait() func = make_new_mfun( "int", "can_wait", KBHit_can_wait ); if( !type_engine_import_mfun( env, func ) ) goto error; // end class type_engine_import_class_end( env ); // start it KBHitManager::init(); #endif // __DISABLE_KBHIT__ // register deprecate type_engine_register_deprecate( env, "Skot", "ConsoleInput" ); #ifndef __DISABLE_PROMPTER__ // begin class (Skot) if( !type_engine_import_class_begin( env, "ConsoleInput", "Event", env->global(), Skot_ctor, Skot_dtor ) ) return FALSE; // add member variable Skot_offset_data = type_engine_import_mvar( env, "int", "@Skot_data", FALSE ); if( Skot_offset_data == CK_INVALID_OFFSET ) goto error; // add prompt() func = make_new_mfun( "Event", "prompt", Skot_prompt ); if( !type_engine_import_mfun( env, func ) ) goto error; // add prompt() func = make_new_mfun( "Event", "prompt", Skot_prompt2 ); func->add_arg( "string", "what" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add ready() func = make_new_mfun( "int", "more", Skot_more ); if( !type_engine_import_mfun( env, func ) ) goto error; // add getString() func = make_new_mfun( "string", "getLine", Skot_getLine ); if( !type_engine_import_mfun( env, func ) ) goto error; // add can_wait() func = make_new_mfun( "int", "can_wait", Skot_can_wait ); if( !type_engine_import_mfun( env, func ) ) goto error; // end class type_engine_import_class_end( env ); #endif // __DISABLE_PROMPTER__ // register deprecate type_engine_register_deprecate( env, "PRC", "StringTokenizer" ); // begin class (StrTok) if( !type_engine_import_class_begin( env, "StringTokenizer", "Object", env->global(), StrTok_ctor, StrTok_dtor ) ) return FALSE; // add member variable StrTok_offset_data = type_engine_import_mvar( env, "int", "@StrTok_data", FALSE ); if( StrTok_offset_data == CK_INVALID_OFFSET ) goto error; // add set() func = make_new_mfun( "void", "set", StrTok_set ); func->add_arg( "string", "line" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add reset() func = make_new_mfun( "void", "reset", StrTok_reset ); if( !type_engine_import_mfun( env, func ) ) goto error; // add more() func = make_new_mfun( "int", "more", StrTok_more ); if( !type_engine_import_mfun( env, func ) ) goto error; // add next() func = make_new_mfun( "string", "next", StrTok_next ); if( !type_engine_import_mfun( env, func ) ) goto error; // add get() func = make_new_mfun( "string", "next", StrTok_next2 ); func->add_arg( "string", "out" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add get() func = make_new_mfun( "string", "get", StrTok_get ); func->add_arg( "int", "index" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add get() func = make_new_mfun( "string", "get", StrTok_get2 ); func->add_arg( "int", "index" ); func->add_arg( "string", "out" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add size() func = make_new_mfun( "int", "size", StrTok_size ); if( !type_engine_import_mfun( env, func ) ) goto error; // end class type_engine_import_class_end( env ); #ifdef AJAY // begin class // init base class if( !type_engine_import_class_begin( env, "VCR", "Object", env->global(), VCR_ctor ) ) return FALSE; // add member variable VCR_offset_data = type_engine_import_mvar( env, "int", "@me", FALSE ); if( VCR_offset_data == CK_INVALID_OFFSET ) goto error; // add load() func = make_new_mfun( "int", "load", VCR_load ); func->add_arg( "string", "filename" ); func->add_arg( "int", "column" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add reset() func = make_new_mfun( "int", "reset", VCR_reset ); if( !type_engine_import_mfun( env, func ) ) goto error; // add seek() func = make_new_mfun( "int", "seek", VCR_seek ); func->add_arg( "int", "where" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add more() func = make_new_mfun( "int", "more", VCR_more ); if( !type_engine_import_mfun( env, func ) ) goto error; // add curr() func = make_new_mfun( "float", "curr", VCR_curr ); if( !type_engine_import_mfun( env, func ) ) goto error; // add next() func = make_new_mfun( "int", "next", VCR_next ); if( !type_engine_import_mfun( env, func ) ) goto error; // add pos() func = make_new_mfun( "int", "pos", VCR_pos ); if( !type_engine_import_mfun( env, func ) ) goto error; // add size() func = make_new_mfun( "int", "size", VCR_size ); if( !type_engine_import_mfun( env, func ) ) goto error; // add name() func = make_new_mfun( "string", "name", VCR_name ); if( !type_engine_import_mfun( env, func ) ) goto error; // end the class import type_engine_import_class_end( env ); #if defined(__PLATFORM_WIN32__) // begin class (Cereal) if( !type_engine_import_class_begin( env, "Cereal", "Object", env->global(), Cereal_ctor ) ) return FALSE; // add member Cereal_offset_data = type_engine_import_mvar( env, "int", "@Cereal_data", FALSE ); if( Cereal_offset_data == CK_INVALID_OFFSET ) goto error; // add open() func = make_new_mfun( "int", "open", Cereal_open ); func->add_arg( "string", "name" ); func->add_arg( "int", "baudrate" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add close() func = make_new_mfun( "void", "close", Cereal_close ); if( !type_engine_import_mfun( env, func ) ) goto error; // add more() func = make_new_mfun( "int", "more", Cereal_more ); if( !type_engine_import_mfun( env, func ) ) goto error; // add send() func = make_new_mfun( "int", "send", Cereal_send ); func->add_arg( "int", "bite" ); if( !type_engine_import_mfun( env, func ) ) goto error; // add recv() func = make_new_mfun( "int", "recv", Cereal_recv ); if( !type_engine_import_mfun( env, func ) ) goto error; // end class type_engine_import_class_end( env ); #endif return TRUE; #else return TRUE; #endif error: // end the class import type_engine_import_class_end( env ); return FALSE; }