From fe95aab3e52df48fbe4e9d15548e7e0d395d55d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Mon, 6 Sep 1999 04:12:08 -0700
Subject: [PATCH] a bunch of new functions

Rev: src/builtin_functions.c:1.183
---
 src/builtin_functions.c | 195 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 194 insertions(+), 1 deletion(-)

diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index a34912ab9f..1a4b6363bc 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: builtin_functions.c,v 1.182 1999/08/19 23:49:46 hubbe Exp $");
+RCSID("$Id: builtin_functions.c,v 1.183 1999/09/06 11:12:08 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "pike_macros.h"
@@ -4619,6 +4619,193 @@ void f_string_count(INT32 args)
    push_int(c);
 }
 
+void f_inherit_list(INT32 args)
+{
+  struct program *p;
+  struct svalue *arg;
+  struct object *par;
+  int parid,e,q=0;
+
+  get_all_args("inherit_list",args,"%*",&arg);
+  if(sp[-args].type == T_OBJECT)
+    f_object_program(1);
+  
+  p=program_from_svalue(arg);
+  if(!p) 
+    SIMPLE_BAD_ARG_ERROR("inherit_list", 1, "program");
+
+  if(arg->type == T_FUNCTION)
+  {
+    par=arg->u.object;
+    parid=arg->subtype;
+  }else{
+    par=0;
+    parid=-1;
+  }
+
+  check_stack(p->num_inherits);
+  for(e=0;e<p->num_inherits;e++)
+  {
+    struct inherit *in=p->inherits+e;
+    if(in->inherit_level==1)
+    {
+      if(in->parent_offset)
+      {
+	struct inherit *inherit=in;
+	int accumulator;
+	struct object *o=par;
+	int i;
+
+	o=par;
+	i=in->parent_identifier;
+	accumulator=inherit->parent_offset - 1;
+	while(accumulator--)
+	{
+	  struct program *p;
+	  if(inherit->parent_offset)
+	  {
+	    i=o->parent_identifier;
+	    o=o->parent;
+	    accumulator+=inherit->parent_offset-1;
+	  }else{
+	    i=inherit->parent_identifier;
+	    o=inherit->parent;
+	  }
+	  if(!o || !o->prog || i<0) break;
+	  inherit=INHERIT_FROM_INT(o->prog, i);
+	}
+	if(o && o->prog && i>=0)
+	{
+	  ref_push_object(o);
+	  sp[-1].subtype=i;
+	  sp[-1].type=T_FUNCTION;
+#ifdef PIKE_DEBUG
+	  if(program_from_svalue(sp-1) != in->prog)
+	    fatal("Programming error in inherit_list!\n");
+#endif
+	  q++;
+	  continue;
+	}
+      }
+
+      if(in->parent && in->parent->prog)
+      {
+	ref_push_object(in->parent);
+	sp[-1].subtype=in->parent_identifier;
+	sp[-1].type=T_FUNCTION;
+#ifdef PIKE_DEBUG
+	if(program_from_svalue(sp-1) != in->prog)
+	  fatal("Programming error in inherit_list!\n");
+#endif
+      }else{
+	ref_push_program(in->prog);
+      }
+      q++;
+    }
+  }
+  f_aggregate(q);
+}
+
+
+void f_program_implements(INT32 args)
+{
+  struct program *p,*p2;
+  int ret;
+  get_all_args("Program.implements",args,"%p%p",&p,&p2);
+
+  ret=implements(p,p2);
+  pop_n_elems(args);
+  push_int(ret);
+}
+
+void f_program_inherits(INT32 args)
+{
+  struct program *p,*p2;
+  struct svalue *arg,*arg2;
+  int ret;
+  get_all_args("Program.inherits",args,"%p%p",&p,&p2);
+
+  ret=!!low_get_storage(p2,p);
+  pop_n_elems(args);
+  push_int(ret);
+}
+
+void f_program_defined(INT32 args)
+{
+  struct program *p;
+  get_all_args("Program.defined",args,"%p",&p);
+
+  if(p && p->num_linenumbers)
+  {
+    char *tmp;
+    INT32 line;
+    if((tmp=get_line(p->program, p, &line)))
+    {
+      struct pike_string *tmp2;
+      tmp2=make_shared_string(tmp);
+      pop_n_elems(args);
+
+      push_string(tmp2);
+      if(line > 1)
+      {
+	push_constant_text(":");
+	push_int(line);
+	f_add(3);
+      }
+      return;
+    }
+  }
+
+  pop_n_elems(args);
+  push_int(0);
+}
+
+void f_function_defined(INT32 args)
+{
+  check_all_args("Function.defined",args,BIT_FUNCTION, 0);
+
+  if(sp[-args].subtype != FUNCTION_BUILTIN &&
+     sp[-args].u.object->prog)
+  {
+    char *tmp;
+    INT32 line;
+    struct identifier *id=ID_FROM_INT(sp[-args].u.object->prog,
+				      sp[-args].subtype);
+    if(IDENTIFIER_IS_PIKE_FUNCTION( id->identifier_flags ) &&
+      id->func.offset != -1)
+    {
+      if((tmp=get_line(sp[-args].u.object->prog->program + id->func.offset,
+		       sp[-args].u.object->prog,
+		       &line)))
+      {
+	struct pike_string *tmp2;
+	tmp2=make_shared_string(tmp);
+	pop_n_elems(args);
+	
+	push_string(tmp2);
+	push_constant_text(":");
+	push_int(line);
+	f_add(3);
+	return;
+      }
+    }
+  }
+
+  pop_n_elems(args);
+  push_int(0);
+  
+}
+
+void f_string_width(INT32 args)
+{
+  struct pike_string *s;
+  int ret;
+  get_all_args("String.width",args,"%S",&s);
+  ret=s->size_shift;
+  pop_n_elems(args);
+  push_int(8 * (1<<ret));
+}
+
 void init_builtin_efuns(void)
 {
   ADD_EFUN("gethrtime", f_gethrtime,tFunc(tOr(tInt,tVoid),tInt), OPT_EXTERNAL_DEPEND);
@@ -4975,6 +5162,12 @@ void init_builtin_efuns(void)
 		      tFuncV(,tMix,tSetvar(1,tMix)),tArr(tVar(1)))),
 	   OPT_TRY_OPTIMIZE);
 		
+  ADD_FUNCTION("inherit_list",f_inherit_list,tFunc(tProgram,tArr(tProgram)),0);
+  ADD_FUNCTION("program_implements",f_program_implements,tFunc(tProgram tProgram,tInt),0);
+  ADD_FUNCTION("program_inherits",f_program_inherits,tFunc(tProgram tProgram,tInt),0);
+  ADD_FUNCTION("program_defined",f_program_defined,tFunc(tProgram,tString),0);
+  ADD_FUNCTION("function_defined",f_function_defined,tFunc(tFunction,tString),0);
+  ADD_FUNCTION("string_width",f_string_width,tFunc(tString,tInt),0);
 
 #ifdef DEBUG_MALLOC
   
-- 
GitLab