Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/bouyer-socketcan]: src/external/bsd/bc/dist 2109041



details:   https://anonhg.NetBSD.org/src/rev/4875cbc0ef83
branches:  bouyer-socketcan
changeset: 820878:4875cbc0ef83
user:      maya <maya%NetBSD.org@localhost>
date:      Tue Apr 18 04:35:19 2017 +0000

description:
2109041

diffstat:

 external/bsd/bc/dist/execute.c |  800 ++++++++++++++++++++++++++++++++++++++
 external/bsd/bc/dist/main.c    |  363 +++++++++++++++++
 external/bsd/bc/dist/util.c    |  843 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 2006 insertions(+), 0 deletions(-)

diffs (truncated from 2018 to 300 lines):

diff -r e099295aaae0 -r 4875cbc0ef83 external/bsd/bc/dist/execute.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/external/bsd/bc/dist/execute.c    Tue Apr 18 04:35:19 2017 +0000
@@ -0,0 +1,800 @@
+/*     $NetBSD: execute.c,v 1.2.2.2 2017/04/18 04:35:19 maya Exp $ */
+
+/*
+ * Copyright (C) 1991-1994, 1997, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
+ * Copyright (C) 2016-2017 Philip A. Nelson.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The names Philip A. Nelson and Free Software Foundation may not be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY PHILIP A. NELSON ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL PHILIP A. NELSON OR THE FREE SOFTWARE FOUNDATION BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/* execute.c - run a bc program. */
+
+#include "bcdefs.h"
+#include <signal.h>
+#include "proto.h"
+
+
+/* The SIGINT interrupt handling routine. */
+
+int had_sigint;
+
+void
+stop_execution ( int sig )
+{
+  had_sigint = TRUE;
+}
+
+
+/* Get the current byte and advance the PC counter. */
+
+unsigned char
+byte ( program_counter *p )
+{
+  return (functions[p->pc_func].f_body[p->pc_addr++]);
+}
+
+
+/* The routine that actually runs the machine. */
+
+void
+execute (void)
+{
+  unsigned long label_num, l_gp, l_off;
+  bc_label_group *gp;
+  
+  char inst, ch;
+  long  new_func;
+  long  var_name;
+
+  long const_base;
+
+  bc_num temp_num;
+  arg_list *auto_list;
+
+  /* Initialize this run... */
+  pc.pc_func = 0;
+  pc.pc_addr = 0;
+  runtime_error = FALSE;
+  bc_init_num (&temp_num);
+
+  /* Set up the interrupt mechanism for an interactive session. */
+  if (interactive)
+    {
+      signal (SIGINT, stop_execution);
+    }
+   
+  had_sigint = FALSE;
+  while (pc.pc_addr < functions[pc.pc_func].f_code_size
+        && !runtime_error && !had_sigint)
+    {
+      inst = byte(&pc);
+
+#if DEBUG > 3
+      { /* Print out address and the stack before each instruction.*/
+       int depth; estack_rec *temp = ex_stack;
+       
+       printf ("func=%d addr=%d inst=%c\n",pc.pc_func, pc.pc_addr, inst);
+       if (temp == NULL) printf ("empty stack.\n", inst);
+       else
+         {
+           depth = 1;
+           while (temp != NULL)
+             {
+               printf ("  %d = ", depth);
+               bc_out_num (temp->s_num, 10, out_char, std_only);
+               depth++;
+               temp = temp->s_next;
+             }
+           out_char ('\n');
+         }
+      }
+#endif
+
+    switch ( inst )
+      {
+
+      case 'A' : /* increment array variable (Add one). */
+       var_name = byte(&pc);
+       if ((var_name & 0x80) != 0)
+         var_name = ((var_name & 0x7f) << 8) + byte(&pc);
+       incr_array (var_name);
+       break;
+
+      case 'B' : /* Branch to a label if TOS != 0. Remove value on TOS. */
+      case 'Z' : /* Branch to a label if TOS == 0. Remove value on TOS. */
+       c_code = !bc_is_zero (ex_stack->s_num);
+       pop ();
+       /*FALLTHROUGH*/ /* common branch and jump code */
+      case 'J' : /* Jump to a label. */
+       label_num = byte(&pc);  /* Low order bits first. */
+       label_num += byte(&pc) << 8;
+       if (inst == 'J' || (inst == 'B' && c_code)
+           || (inst == 'Z' && !c_code)) {
+         gp = functions[pc.pc_func].f_label;
+         l_gp  = label_num >> BC_LABEL_LOG;
+         l_off = label_num % BC_LABEL_GROUP;
+         while (l_gp-- > 0) gp = gp->l_next;
+          if (gp)
+            pc.pc_addr = gp->l_adrs[l_off];
+          else {
+            rt_error ("Internal error.");
+            break;
+          }
+       }
+       break;
+
+      case 'C' : /* Call a function. */
+       /* Get the function number. */
+       new_func = byte(&pc);
+       if ((new_func & 0x80) != 0) 
+         new_func = ((new_func & 0x7f) << 8) + byte(&pc);
+
+       /* Check to make sure it is defined. */
+       if (!functions[new_func].f_defined)
+         {
+           rt_error ("Function %s not defined.", f_names[new_func]);
+           break;
+         }
+
+       /* Check and push parameters. */
+       process_params (&pc, new_func);
+
+       /* Push auto variables. */
+       for (auto_list = functions[new_func].f_autos;
+            auto_list != NULL;
+            auto_list = auto_list->next)
+         auto_var (auto_list->av_name);
+
+       /* Push pc and ibase. */
+       fpush (pc.pc_func);
+       fpush (pc.pc_addr);
+       fpush (i_base);
+
+       /* Reset pc to start of function. */
+       pc.pc_func = new_func;
+       pc.pc_addr = 0;
+       break;
+
+      case 'D' : /* Duplicate top of stack */
+       push_copy (ex_stack->s_num);
+       break;
+
+      case 'K' : /* Push a constant */
+       /* Get the input base and convert it to a bc number. */
+       if (pc.pc_func == 0) 
+         const_base = i_base;
+       else
+         const_base = fn_stack->s_val;
+       if (const_base == 10)
+         push_b10_const (&pc);
+       else
+         push_constant (prog_char, const_base);
+       break;
+
+      case 'L' : /* load array variable */
+       var_name = byte(&pc);
+       if ((var_name & 0x80) != 0)
+         var_name = ((var_name & 0x7f) << 8) + byte(&pc);
+       load_array (var_name);
+       break;
+
+      case 'M' : /* decrement array variable (Minus!) */
+       var_name = byte(&pc);
+       if ((var_name & 0x80) != 0)
+         var_name = ((var_name & 0x7f) << 8) + byte(&pc);
+       decr_array (var_name);
+       break;
+
+      case 'O' : /* Write a string to the output with processing. */
+       while ((ch = byte(&pc)) != '"')
+         if (ch != '\\')
+           out_schar (ch);
+         else
+           {
+             ch = byte(&pc);
+             if (ch == '"') break;
+             switch (ch)
+               {
+               case 'a':  out_schar (007); break;
+               case 'b':  out_schar ('\b'); break;
+               case 'f':  out_schar ('\f'); break;
+               case 'n':  out_schar ('\n'); break;
+               case 'q':  out_schar ('"'); break;
+               case 'r':  out_schar ('\r'); break;
+               case 't':  out_schar ('\t'); break;
+               case '\\': out_schar ('\\'); break;
+               default:  break;
+               }
+           }
+       fflush (stdout);
+       break;
+
+      case 'R' : /* Return from function */
+       if (pc.pc_func != 0)
+         {
+           /* "Pop" autos and parameters. */
+           pop_vars(functions[pc.pc_func].f_autos);
+           pop_vars(functions[pc.pc_func].f_params);
+           /* reset the pc. */
+           fpop ();
+           pc.pc_addr = fpop ();
+           pc.pc_func = fpop ();
+         }
+       else
+         rt_error ("Return from main program.");
+       break;
+
+      case 'S' : /* store array variable */
+       var_name = byte(&pc);
+       if ((var_name & 0x80) != 0)
+         var_name = ((var_name & 0x7f ) << 8) + byte(&pc);
+       store_array (var_name);
+       break;
+
+      case 'T' : /* Test tos for zero */
+       c_code = bc_is_zero (ex_stack->s_num);
+       assign (c_code);
+       break;
+
+      case 'W' : /* Write the value on the top of the stack. */
+      case 'P' : /* Write the value on the top of the stack.  No newline. */
+       bc_out_num (ex_stack->s_num, o_base, out_char, std_only);
+       if (inst == 'W') out_char ('\n');
+       store_var (4);  /* Special variable "last". */
+       fflush (stdout);
+       pop ();
+       break;
+
+      case 'c' : /* Call special function. */
+       new_func = byte(&pc);
+
+      switch (new_func)
+       {
+       case 'L':  /* Length function. */
+         /* For the number 0.xxxx,  0 is not significant. */
+         if (ex_stack->s_num->n_len == 1 &&
+             ex_stack->s_num->n_scale != 0 &&
+             ex_stack->s_num->n_value[0] == 0 )
+           bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_scale);
+         else
+           bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_len
+                    + ex_stack->s_num->n_scale);
+         break;
+               
+       case 'S':  /* Scale function. */ 
+         bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_scale);
+         break;
+
+       case 'R':  /* Square Root function. */
+         if (!bc_sqrt (&ex_stack->s_num, scale))
+           rt_error ("Square root of a negative number");
+         break;
+
+       case 'I': /* Read function. */



Home | Main Index | Thread Index | Old Index