pike.git / src / opcodes.c

version» Context lines:

pike.git/src/opcodes.c:15:   #include "opcodes.h"   #include "object.h"   #include "error.h"   #include "pike_types.h"   #include "pike_memory.h"   #include "fd_control.h"   #include "cyclic.h"   #include "builtin_functions.h"   #include "module_support.h"    - RCSID("$Id: opcodes.c,v 1.30 1998/10/09 17:56:32 hubbe Exp $"); + RCSID("$Id: opcodes.c,v 1.31 1998/10/09 23:33:39 grubba Exp $");      void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind)   {    INT32 i;    switch(what->type)    {    case T_ARRAY:    simple_array_index_no_free(to,what->u.array,ind);    break;   
pike.git/src/opcodes.c:204:       case T_FLOAT:    sprintf(buf,"%f",(double)sp[-1].u.float_number);    break;       case T_ARRAY:    {    int i;    struct array *a = sp[-1].u.array;    struct pike_string *s; +  int shift = 0;       for(i = a->size; i--; ) { -  +  unsigned INT32 val;    if (a->item[i].type != T_INT) {    error("cast: Item %d is not an integer.\n", i);    } -  if ((a->item[i].u.integer < 0) || -  (a->item[i].u.integer > 255)) { -  error("cast: Wide strings are not supported yet.\n" -  "Index %d is %d, and is out of range 0 .. 255.\n", -  i, a->item[i].u.integer); +  val = (unsigned INT32)a->item[i].u.integer; +  if (val > 0xff) { +  shift = 1; +  if (val > 0xffff) { +  shift = 2; +  break;    } -  +  while(i--) { +  if (a->item[i].type != T_INT) { +  error("cast: Item %d is not an integer.\n", i);    } -  s = begin_shared_string(a->size); +  val = (unsigned INT32)a->item[i].u.integer; +  if (val > 0xffff) { +  shift = 2; +  break; +  } +  } +  break; +  } +  } +  s = begin_wide_shared_string(a->size, shift); +  switch(shift) { +  case 0:    for(i = a->size; i--; ) {    s->str[i] = a->item[i].u.integer;    } -  +  break; +  case 1: +  { +  p_wchar1 *str1 = STR1(s); +  for(i = a->size; i--; ) { +  str1[i] = a->item[i].u.integer; +  } +  } +  break; +  case 2: +  { +  p_wchar2 *str2 = STR2(s); +  for(i = a->size; i--; ) { +  str2[i] = a->item[i].u.integer; +  } +  } +  break; +  default: +  free_string(end_shared_string(s)); +  fatal("cast: Bad shift: %d.\n", shift); +  break; +  }    s = end_shared_string(s);    pop_stack();    push_string(s);    return;    }    break;       default:    error("Cannot cast %s to string.\n",get_name_of_type(sp[-1].type));    }