home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / p / plbin.zip / pl / src / pl-ext.c < prev    next >
C/C++ Source or Header  |  1993-02-23  |  16KB  |  370 lines

  1. /*  pl-ext.c,v 1.8 1993/02/23 13:16:29 jan Exp
  2.  
  3.     Copyright (c) 1990 Jan Wielemaker. All rights reserved.
  4.     See ../LICENCE to find out about your rights.
  5.     jan@swi.psy.uva.nl
  6.  
  7.     Purpose: link built_in predicates
  8. */
  9.  
  10. #include "pl-incl.h"
  11. #include "pl-itf.h"
  12.  
  13. /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  14. Link all foreign language predicates.  The arguments to ADD are:
  15.  
  16.     ADD(name, arity, function, flags).
  17.  
  18. Flags almost always is TRACE_ME.  Additional common flags:
  19.  
  20.     TRANSPARENT        Predicate is module transparent
  21.     NONDETERMINISTIC    Predicate can be resatisfied
  22. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  23.  
  24. #define ADD(n, a, f, flags) { n, f, flags, a }
  25.  
  26. static struct foreign {
  27.   char    *name;
  28.   Func     function;
  29.   short     flags;
  30.   short     arity;
  31. } foreigns[] = {
  32.   ADD("nl",            0, pl_nl,            TRACE_ME),
  33.   ADD("put",            1, pl_put,            TRACE_ME),
  34.   ADD("get0",            1, pl_get0,            TRACE_ME),
  35.   ADD("get",            1, pl_get,            TRACE_ME),
  36.   ADD("get_single_char",    1, pl_get_single_char,        TRACE_ME),
  37.   ADD("seeing",            1, pl_seeing,            TRACE_ME),
  38.   ADD("telling",        1, pl_telling,            TRACE_ME),
  39.   ADD("seen",            0, pl_seen,            TRACE_ME),
  40.   ADD("tab",            1, pl_tab,            TRACE_ME),
  41.   ADD("tmp_file",        2, pl_tmp_file,            TRACE_ME),
  42.   ADD("delete_file",        1, pl_delete_file,        TRACE_ME),
  43.   ADD("access_file",        2, pl_access_file,        TRACE_ME),
  44.   ADD("exists_file",        1, pl_exists_file,        TRACE_ME),
  45.   ADD("exists_directory",    1, pl_exists_directory,        TRACE_ME),
  46.   ADD("rename_file",        2, pl_rename_file,        TRACE_ME),
  47.   ADD("same_file",        2, pl_same_file,        TRACE_ME),
  48.   ADD("time_file",        2, pl_time_file,        TRACE_ME),
  49.   ADD("told",            0, pl_told,            TRACE_ME),
  50.   ADD("see",            1, pl_see,            TRACE_ME),
  51.   ADD("tell",            1, pl_tell,            TRACE_ME),
  52.   ADD("append",            1, pl_append,            TRACE_ME),
  53.   ADD("ttyflush",        0, pl_ttyflush,            TRACE_ME),
  54.   ADD("flush",            0, pl_flush,            TRACE_ME),
  55.   ADD("tty_fold",        2, pl_tty_fold,            TRACE_ME),
  56.   ADD("prompt",            2, pl_prompt,            TRACE_ME),
  57.   ADD("expand_file_name",    2, pl_expand_file_name,        TRACE_ME),
  58.   ADD("absolute_file_name",    2, pl_absolute_file_name,    TRACE_ME),
  59.   ADD("$file_base_name",    2, pl_file_base_name,        TRACE_ME),
  60.   ADD("$file_dir_name",        2, pl_file_dir_name,        TRACE_ME),
  61.   ADD("fileerrors",        2, pl_fileerrors,        TRACE_ME),
  62.   ADD("chdir",            1, pl_chdir,            TRACE_ME),
  63.  
  64.   ADD("halt",            0, pl_halt,            TRACE_ME),
  65.   ADD("$shell",            2, pl_shell,            TRACE_ME),
  66.   ADD("getenv",            2, pl_getenv,            TRACE_ME),
  67.   ADD("setenv",            2, pl_setenv,            TRACE_ME),
  68.   ADD("unsetenv",        1, pl_unsetenv,            TRACE_ME),
  69.   ADD("wildcard_match",        2, pl_wildcard_match,        TRACE_ME),
  70.   ADD("$apropos_match",        2, pl_apropos_match,        TRACE_ME),
  71.   ADD("$argv",            1, pl_argv,            TRACE_ME),
  72.   ADD("$option",        2, pl_option,            TRACE_ME),
  73.   ADD("convert_time",        8, pl_convert_time,        TRACE_ME),
  74.   ADD("sleep",            1, pl_sleep,            TRACE_ME),
  75.   ADD("break",            0, pl_break,            TRACE_ME),
  76.   ADD("$break",            1, pl_break1,            TRACE_ME),
  77.  
  78.   ADD("display",        1, pl_display,            TRACE_ME),
  79.   ADD("displayq",        1, pl_displayq,            TRACE_ME),
  80.   ADD("write",            1, pl_write,            TRACE_ME),
  81.   ADD("writeq",            1, pl_writeq,            TRACE_ME),
  82.   ADD("print",            1, pl_print,            TRACE_ME),
  83.   ADD("$print",            2, pl_dprint,        TRANSPARENT|TRACE_ME),
  84.  
  85.   ADD("read_variables",        2, pl_read_variables,        TRACE_ME),
  86.   ADD("read_variables",        3, pl_read_variables3,        TRACE_ME),
  87.   ADD("read",            1, pl_read,            TRACE_ME),
  88.   ADD("read_clause",        1, pl_read_clause,        TRACE_ME),
  89.   ADD("read_clause",        2, pl_read_clause2,        TRACE_ME),
  90.   ADD("$raw_read",        1, pl_raw_read,            TRACE_ME),
  91.   ADD("current_op",        3, pl_current_op,    NONDETERMINISTIC|TRACE_ME),
  92.   ADD("current_atom",        1, pl_current_atom,    NONDETERMINISTIC|TRACE_ME),
  93.   ADD("current_functor",    2, pl_current_functor,    NONDETERMINISTIC|TRACE_ME),
  94.   ADD("$complete_atom",        3, pl_complete_atom,        TRACE_ME),
  95.   ADD("$atom_completions",    2, pl_atom_completions,        TRACE_ME),
  96.   ADD("$op",            3, pl_op1,            TRACE_ME),
  97.  
  98.   ADD("!",            0, pl_metacut,            TRACE_ME),
  99.   ADD("functor",        3, pl_functor,            TRACE_ME),
  100.   ADD("arg",            3, pl_arg,            TRACE_ME),
  101.   ADD("=..",            2, pl_univ,            TRACE_ME),
  102.   ADD("name",            2, pl_name,            TRACE_ME),
  103.   ADD("int_to_atom",        3, pl_int_to_atom,        TRACE_ME),
  104.   ADD("format_number",        3, pl_format_number,        TRACE_ME),
  105.   ADD("concat",            3, pl_concat,            TRACE_ME),
  106.   ADD("$concat_atom",        2, pl_concat_atom,        TRACE_ME),
  107.   ADD("atom_length",        2, pl_atom_length,        TRACE_ME),
  108.   ADD("$term_to_atom",        3, pl_term_to_atom,        TRACE_ME),
  109.   ADD("numbervars",        4, pl_numbervars,        TRACE_ME),
  110.   ADD("free_variables",        2, pl_free_variables,        TRACE_ME),
  111.   ADD("$e_free_variables",    2, pl_e_free_variables,        TRACE_ME),
  112.  
  113.   ADD("$open_wic",        1, pl_open_wic,            TRACE_ME),
  114.   ADD("$close_wic",        0, pl_close_wic,        TRACE_ME),
  115.   ADD("$add_clause_wic",    2, pl_add_clause_wic,        TRACE_ME),
  116.   ADD("$add_directive_wic",    1, pl_add_directive_wic,    TRACE_ME),
  117.   ADD("$start_module_wic",    2, pl_start_module_wic,        TRACE_ME),
  118.   ADD("$export_wic",        2, pl_export_wic,        TRACE_ME),
  119.   ADD("$import_wic",        3, pl_import_wic,        TRACE_ME),
  120.  
  121.   ADD("abolish",        2, pl_abolish,        TRANSPARENT|TRACE_ME),
  122.   ADD("$clause",        3, pl_clause,    NONDETERMINISTIC|TRANSPARENT|TRACE_ME),
  123.   ADD("retract",        1, pl_retract,    NONDETERMINISTIC|TRANSPARENT|TRACE_ME),
  124.   ADD("flag",            3, pl_flag,            TRACE_ME),
  125.   ADD("recorda",        3, pl_recorda,            TRACE_ME),
  126.   ADD("recordz",        3, pl_recordz,            TRACE_ME),
  127.   ADD("recorded",        3, pl_recorded,    NONDETERMINISTIC|TRACE_ME),
  128.   ADD("erase",            1, pl_erase,            TRACE_ME),
  129.   ADD("assert",            1, pl_assertz,        TRANSPARENT|TRACE_ME),
  130.   ADD("asserta",        1, pl_asserta,        TRANSPARENT|TRACE_ME),
  131.   ADD("assertz",        1, pl_assertz,        TRANSPARENT|TRACE_ME),
  132.   ADD("assert",            2, pl_assertz2,        TRANSPARENT|TRACE_ME),
  133.   ADD("asserta",        2, pl_asserta2,        TRANSPARENT|TRACE_ME),
  134.   ADD("assertz",        2, pl_assertz2,        TRANSPARENT|TRACE_ME),
  135.   ADD("$record_clause",        2, pl_record_clause,        TRACE_ME),
  136.  
  137.   ADD("$c_current_predicate",    2, pl_current_predicate,  NONDETERMINISTIC|TRANSPARENT|TRACE_ME),
  138.   ADD("$predicate_attribute",    3, pl_predicate_attribute,TRANSPARENT|TRACE_ME),
  139.   ADD("$source_file",        2, pl_source_file,      TRANSPARENT|TRACE_ME),
  140.   ADD("$time_source_file",    2, pl_time_source_file,      NONDETERMINISTIC|TRACE_ME),
  141.   ADD("$start_consult",        1, pl_start_consult,        TRACE_ME),
  142.   ADD("$make_system_source_files",0,pl_make_system_source_files,TRACE_ME),
  143.  
  144.   ADD("var",            1, pl_var,            TRACE_ME),
  145.   ADD("nonvar",            1, pl_nonvar,            TRACE_ME),
  146.   ADD("integer",        1, pl_integer,            TRACE_ME),
  147.   ADD("float",            1, pl_float,            TRACE_ME),
  148.   ADD("number",            1, pl_number,            TRACE_ME),
  149.   ADD("atom",            1, pl_atom,            TRACE_ME),
  150.   ADD("atomic",            1, pl_atomic,            TRACE_ME),
  151.   ADD("ground",            1, pl_ground,            TRACE_ME),
  152.  
  153.   ADD("==",            2, pl_equal,            TRACE_ME),
  154.   ADD("\\==",            2, pl_nonequal,            TRACE_ME),
  155.   ADD("=",            2, pl_unify,            TRACE_ME),
  156.   ADD("\\=",            2, pl_notunify,            TRACE_ME),
  157.   ADD("compare",        3, pl_compare,            TRACE_ME),
  158.   ADD("@<",            2, pl_lessStandard,        TRACE_ME),
  159.   ADD("@=<",            2, pl_lessEqualStandard,    TRACE_ME),
  160.   ADD("@>",            2, pl_greaterStandard,        TRACE_ME),
  161.   ADD("@>=",            2, pl_greaterEqualStandard,    TRACE_ME),
  162.   ADD("=@=",            2, pl_structural_equal,        TRACE_ME),
  163.   ADD("\\=@=",            2, pl_structural_nonequal,    TRACE_ME),
  164.  
  165.   ADD("repeat",            0, pl_repeat,    NONDETERMINISTIC|TRACE_ME),
  166.   ADD("fail",            0, pl_fail,            TRACE_ME),
  167.   ADD("$fail",            0, pl_fail,            0),
  168.   ADD("abort",            0, pl_abort,            TRACE_ME),
  169.  
  170.   ADD("statistics",        2, pl_statistics,        TRACE_ME),
  171.  
  172.   ADD("between",        3, pl_between,    NONDETERMINISTIC|TRACE_ME),
  173.   ADD("succ",            2, pl_succ,            TRACE_ME),
  174.   ADD("plus",            3, pl_plus,            TRACE_ME),
  175.   ADD("<",            2, pl_lessNumbers,        TRACE_ME),
  176.   ADD(">",            2, pl_greaterNumbers,        TRACE_ME),
  177.   ADD("=<",            2, pl_lessEqualNumbers,        TRACE_ME),
  178.   ADD(">=",            2, pl_greaterEqualNumbers,    TRACE_ME),
  179.   ADD("=\\=",            2, pl_nonEqualNumbers,        TRACE_ME),
  180.   ADD("=:=",            2, pl_equalNumbers,        TRACE_ME),
  181.   ADD("is",            2, pl_is,        TRANSPARENT|TRACE_ME),
  182.  
  183.   ADD("trace",            0, pl_trace,            0),
  184.   ADD("notrace",        0, pl_notrace,            0),
  185.   ADD("tracing",        0, pl_tracing,            0),
  186.   ADD("debug",            0, pl_debug,            0),
  187.   ADD("nodebug",        0, pl_nodebug,            0),
  188.   ADD("$debugging",        0, pl_debugging,        0),
  189.   ADD("$spy",            1, pl_spy,        TRANSPARENT|TRACE_ME),
  190.   ADD("$nospy",            1, pl_nospy,        TRANSPARENT|TRACE_ME),
  191.   ADD("$leash",            2, pl_leash,             0),
  192.   ADD("$visible",        2, pl_visible,            0),
  193.   ADD("unknown",        2, pl_unknown,        TRANSPARENT|TRACE_ME),
  194.   ADD("$style_check",        2, pl_style_check,        TRACE_ME),
  195.  
  196.   ADD("$list_references",    2, pl_list_references,        TRACE_ME),
  197.   ADD("$list_active_procedures",0, pl_list_active_procedures,    TRACE_ME),
  198. #if COUNTING
  199.   ADD("$count",            0, pl_count,            TRACE_ME),
  200. #endif /* COUNTING */
  201.  
  202.   ADD("$profile",        2, pl_profile,            TRACE_ME),
  203.   ADD("reset_profiler",        0, pl_reset_profiler,        TRACE_ME),
  204.   ADD("profile_count",        3, pl_profile_count,    TRANSPARENT|TRACE_ME),
  205.   ADD("profile_box",        5, pl_profile_box,    TRANSPARENT|TRACE_ME),
  206.  
  207.   ADD("prolog_current_frame",    1, pl_prolog_current_frame,    TRACE_ME),
  208.   ADD("prolog_frame_attribute",    3, pl_prolog_frame_attribute,    TRACE_ME),
  209.   ADD("$trace_continuation",    1, pl_trace_continuation,    TRACE_ME),
  210.   ADD("prolog_skip_level",    2, pl_skip_level,        0),
  211.  
  212.   ADD("$write_on_atom",        2, pl_write_on_atom,        TRACE_ME),
  213. #if O_STRING
  214.   ADD("$write_on_string",    2, pl_write_on_string,        TRACE_ME),
  215. #endif
  216.   ADD("$write_on_list",        2, pl_write_on_list,         TRACE_ME),
  217.   ADD("dwim_match",        3, pl_dwim_match,        TRACE_ME),
  218.   ADD("$dwim_predicate",    2, pl_dwim_predicate,    NONDETERMINISTIC|TRACE_ME),
  219.  
  220.   ADD("$novice",        2, pl_novice,            TRACE_ME),
  221.   ADD("protocol",        1, pl_protocol,            TRACE_ME),
  222.   ADD("protocola",        1, pl_protocola,        TRACE_ME),
  223.   ADD("noprotocol",        0, pl_noprotocol,        TRACE_ME),
  224.   ADD("protocolling",        1, pl_protocolling,        TRACE_ME),
  225.  
  226.   ADD("$current_module",    2, pl_current_module,    NONDETERMINISTIC|TRACE_ME),
  227.   ADD("$module",        2, pl_module,            TRACE_ME),
  228.   ADD("$set_source_module",    2, pl_set_source_module,    TRACE_ME),
  229.   ADD("$declare_module",    2, pl_declare_module,        TRACE_ME),
  230.   ADD("context_module",        1, pl_context_module,    TRANSPARENT|TRACE_ME),
  231.   ADD("$strip_module",        3, pl_strip_module,    TRANSPARENT|TRACE_ME),
  232.   ADD("import",            1, pl_import,        TRANSPARENT|TRACE_ME),
  233.   ADD("export",            1, pl_export,        TRANSPARENT|TRACE_ME),
  234.   ADD("$check_export",        0, pl_check_export,    TRANSPARENT|TRACE_ME),
  235.   ADD("export_list",        2, pl_export_list,        TRACE_ME),
  236.   ADD("index",            1, pl_index,        TRANSPARENT|TRACE_ME),
  237. #if O_AIX_FOREIGN
  238.   ADD("$load_foreign",        1, pl_load_foreign1,    TRANSPARENT|TRACE_ME),
  239. #else
  240.   ADD("$load_foreign",        5, pl_load_foreign,    TRANSPARENT|TRACE_ME),
  241. #endif
  242.  
  243. #if O_STRING
  244.   ADD("string",            1, pl_string,            TRACE_ME),
  245.   ADD("string_length",        2, pl_string_length,        TRACE_ME),
  246.   ADD("string_to_atom",        2, pl_string_to_atom,        TRACE_ME),
  247.   ADD("string_to_list",        2, pl_string_to_list,        TRACE_ME),
  248.   ADD("substring",        4, pl_substring,        TRACE_ME),
  249. #endif /* O_STRING */
  250.  
  251. #if O_SAVE
  252.   ADD("save",            2, pl_save,            TRACE_ME),
  253.   ADD("restore",        1, pl_restore,            TRACE_ME),
  254. #endif /* O_SAVE */
  255.   ADD("$save_program",        2, pl_save_program,        TRACE_ME),
  256.   ADD("$version",        1, pl_version,            TRACE_ME),
  257.  
  258.   ADD("is_list",        1, pl_is_list,            TRACE_ME),
  259.   ADD("proper_list",        1, pl_proper_list,        TRACE_ME),
  260.   ADD("$length",        2, pl_length,            TRACE_ME),
  261.   ADD("memberchk",        2, pl_memberchk,        TRACE_ME),
  262.   ADD("msort",            2, pl_msort,            TRACE_ME),
  263.   ADD("sort",            2, pl_sort,            TRACE_ME),
  264.   ADD("format",            2, pl_format,            TRACE_ME),
  265.   ADD("$collect_bag",        2, pl_collect_bag,        TRACE_ME),
  266.   ADD("$record_bag",        2, pl_record_bag,        TRACE_ME),
  267.   ADD("$please",        3, pl_please,            TRACE_ME),
  268.  
  269. #if O_COMPILE_OR
  270.   ADD("$alt",            1, pl_alt,        NONDETERMINISTIC),
  271. #endif /* O_COMPILE_OR */
  272.   ADD("$atom_hashstat",        2, pl_atom_hashstat,        TRACE_ME),
  273.   ADD("$tty",            0, pl_tty,            TRACE_ME),
  274.   ADD("$arch",            2, pl_arch,            TRACE_ME),
  275.   ADD("$grep",            3, pl_grep,    NONDETERMINISTIC|TRACE_ME),
  276.   ADD("$home",            1, pl_home,            TRACE_ME),
  277.   ADD("limit_stack",        2, pl_limit_stack,        TRACE_ME),
  278.   ADD("trim_stacks",        0, pl_trim_stacks,        TRACE_ME),
  279.   ADD("$garbage_collect",    1, pl_garbage_collect,        TRACE_ME),
  280.   ADD("$collect_parms",        2, pl_collect_parms,        TRACE_ME),
  281.   ADD("copy_term",        2, pl_copy_term,        TRACE_ME),
  282.   ADD("current_key",        1, pl_current_key,    NONDETERMINISTIC|TRACE_ME),
  283.   ADD("current_flag",        1, pl_current_flag,    NONDETERMINISTIC|TRACE_ME),
  284.  
  285.   ADD("open",            3, pl_open,            TRACE_ME),
  286.   ADD("open_null_stream",    1, pl_open_null_stream,        TRACE_ME),
  287.   ADD("close",            1, pl_close,            TRACE_ME),
  288.   ADD("current_stream",        3, pl_current_stream,    NONDETERMINISTIC|TRACE_ME),
  289.   ADD("flush_output",        1, pl_flush_output,        TRACE_ME),
  290.   ADD("stream_position",    3, pl_stream_position,        TRACE_ME),
  291.   ADD("set_input",        1, pl_set_input,        TRACE_ME),
  292.   ADD("set_output",        1, pl_set_output,        TRACE_ME),
  293.   ADD("current_input",        1, pl_current_input,        TRACE_ME),
  294.   ADD("current_output",        1, pl_current_output,        TRACE_ME),
  295.   ADD("character_count",    2, pl_character_count,        TRACE_ME),
  296.   ADD("line_count",        2, pl_line_count,        TRACE_ME),
  297.   ADD("line_position",        2, pl_line_position,        TRACE_ME),
  298.   ADD("source_location",    2, pl_source_location,        TRACE_ME),
  299.  
  300.   ADD("nl",            1, pl_nl1,            TRACE_ME),
  301.   ADD("tab",            2, pl_tab2,            TRACE_ME),
  302.   ADD("put",            2, pl_put2,            TRACE_ME),
  303.   ADD("get",            2, pl_get2,            TRACE_ME),
  304.   ADD("get0",            2, pl_get02,            TRACE_ME),
  305.   ADD("read",            2, pl_read2,            TRACE_ME),
  306.   ADD("write",            2, pl_write2,            TRACE_ME),
  307.   ADD("writeq",            2, pl_writeq2,            TRACE_ME),
  308.   ADD("print",            2, pl_print2,            TRACE_ME),
  309.   ADD("display",        2, pl_display2,            TRACE_ME),
  310.   ADD("displayq",        2, pl_displayq2,        TRACE_ME),
  311.   ADD("format",            3, pl_format3,            TRACE_ME),
  312.  
  313.   ADD("tty_get_capability",    3, pl_tty_get_capability,    TRACE_ME),
  314.   ADD("tty_goto",        2, pl_tty_goto,            TRACE_ME),
  315.   ADD("tty_put",        2, pl_tty_put,            TRACE_ME),
  316.   ADD("format_predicate",    2, pl_format_predicate,    TRANSPARENT|TRACE_ME),
  317.   ADD("set_tty",        2, pl_set_tty,            TRACE_ME),
  318.   ADD("wait_for_input",        3, pl_wait_for_input,        TRACE_ME),
  319.   ADD("get_time",        1, pl_get_time,            TRACE_ME),
  320.   ADD("size_file",        2, pl_size_file,        TRACE_ME),
  321.   ADD("$default_module",    3, pl_default_module,    TRANSPARENT|TRACE_ME),
  322. #if O_PROLOG_FUNCTIONS
  323.   ADD("$arithmetic_function",   1,pl_arithmetic_function,TRANSPARENT|TRACE_ME),
  324. #endif
  325.   ADD("current_arithmetic_function", 1, pl_current_arithmetic_function,
  326.                        NONDETERMINISTIC|TRANSPARENT|TRACE_ME),
  327.  
  328.   /* DO NOT ADD ENTRIES BELOW THIS ONE */
  329.   ADD((char *)NULL,        0, (Func)NULL,            0)
  330. };
  331.  
  332. void
  333. initBuildIns()
  334. { struct foreign *f;
  335.   register Definition def;
  336.   PL_extension *e;
  337.  
  338.   for(f = &foreigns[0]; f->name; f++)
  339.   { def = lookupProcedure(lookupFunctorDef(lookupAtom(f->name), f->arity), 
  340.                              MODULE_system)->definition;
  341.     set(def, FOREIGN|SYSTEM);
  342.     clear(def, TRACE_ME);
  343.     set(def, f->flags);
  344.     def->definition.function = f->function;
  345.     def->indexPattern = 0;
  346.     def->indexCardinality = 0;
  347.   }
  348.  
  349.   PROCEDURE_alt1 = lookupProcedure(FUNCTOR_alt1, MODULE_system);
  350.   PROCEDURE_garbage_collect0 = lookupProcedure(FUNCTOR_garbage_collect0,
  351.                            MODULE_system);
  352.  
  353.   for(e = &PL_extensions[0]; e->predicate_name; e++)
  354.   { short flags = TRACE_ME;
  355.  
  356.     if ( e->flags & PL_FA_NOTRACE )         flags &= TRACE_ME;
  357.     if ( e->flags & PL_FA_TRANSPARENT )         flags |= TRANSPARENT;
  358.     if ( e->flags & PL_FA_NONDETERMINISTIC ) flags |= NONDETERMINISTIC;
  359.  
  360.     def = lookupProcedure(lookupFunctorDef(lookupAtom(e->predicate_name),
  361.                        e->arity), 
  362.               MODULE_user)->definition;
  363.     set(def, FOREIGN);
  364.     set(def, flags);
  365.     def->definition.function = e->function;
  366.     def->indexPattern = 0;
  367.     def->indexCardinality = 0;
  368.   }    
  369. }
  370.