Branch: Tag:

1995-08-09

1995-08-09 10:21:55 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

ulpc dist

Rev: bin/create_testsuite:1.1.1.1
Rev: bin/hilfe.lpc:1.1.1.1
Rev: bin/rsif:1.1.1.1
Rev: bin/uhttpd.lpc:1.1.1.1
Rev: doc/README:1.1.1.1
Rev: doc/builtin/aggregate:1.1.1.1
Rev: doc/builtin/aggregate_list:1.1.1.1
Rev: doc/builtin/aggregate_mapping:1.1.1.1
Rev: doc/builtin/all_efuns:1.1.1.1
Rev: doc/builtin/allocate:1.1.1.1
Rev: doc/builtin/arrayp:1.1.1.1
Rev: doc/builtin/backtrace:1.1.1.1
Rev: doc/builtin/call_function:1.1.1.1
Rev: doc/builtin/call_out:1.1.1.1
Rev: doc/builtin/call_out_info:1.1.1.1
Rev: doc/builtin/catch:1.1.1.1
Rev: doc/builtin/clone:1.1.1.1
Rev: doc/builtin/combine_path:1.1.1.1
Rev: doc/builtin/compile_file:1.1.1.1
Rev: doc/builtin/compile_string:1.1.1.1
Rev: doc/builtin/copy_value:1.1.1.1
Rev: doc/builtin/crypt:1.1.1.1
Rev: doc/builtin/ctime:1.1.1.1
Rev: doc/builtin/destruct:1.1.1.1
Rev: doc/builtin/equal:1.1.1.1
Rev: doc/builtin/exit:1.1.1.1
Rev: doc/builtin/explode:1.1.1.1
Rev: doc/builtin/find_call_out:1.1.1.1
Rev: doc/builtin/floatp:1.1.1.1
Rev: doc/builtin/function_name:1.1.1.1
Rev: doc/builtin/function_object:1.1.1.1
Rev: doc/builtin/functionp:1.1.1.1
Rev: doc/builtin/hash:1.1.1.1
Rev: doc/builtin/implode:1.1.1.1
Rev: doc/builtin/indices:1.1.1.1
Rev: doc/builtin/intp:1.1.1.1
Rev: doc/builtin/listp:1.1.1.1
Rev: doc/builtin/lower_case:1.1.1.1
Rev: doc/builtin/m_delete:1.1.1.1
Rev: doc/builtin/mappingp:1.1.1.1
Rev: doc/builtin/mkmapping:1.1.1.1
Rev: doc/builtin/next_object:1.1.1.1
Rev: doc/builtin/object_program:1.1.1.1
Rev: doc/builtin/objectp:1.1.1.1
Rev: doc/builtin/programp:1.1.1.1
Rev: doc/builtin/query_host_name:1.1.1.1
Rev: doc/builtin/query_num_arg:1.1.1.1
Rev: doc/builtin/random:1.1.1.1
Rev: doc/builtin/regexpp:1.1.1.1
Rev: doc/builtin/remove_call_out:1.1.1.1
Rev: doc/builtin/replace:1.1.1.1
Rev: doc/builtin/reverse:1.1.1.1
Rev: doc/builtin/rusage:1.1.1.1
Rev: doc/builtin/search:1.1.1.1
Rev: doc/builtin/sizeof:1.1.1.1
Rev: doc/builtin/sscanf:1.1.1.1
Rev: doc/builtin/stringp:1.1.1.1
Rev: doc/builtin/sum:1.1.1.1
Rev: doc/builtin/this_object:1.1.1.1
Rev: doc/builtin/throw:1.1.1.1
Rev: doc/builtin/time:1.1.1.1
Rev: doc/builtin/trace:1.1.1.1
Rev: doc/builtin/upper_case:1.1.1.1
Rev: doc/builtin/values:1.1.1.1
Rev: doc/builtin/zero_type:1.1.1.1
Rev: doc/files/cd:1.1.1.1
Rev: doc/files/exec:1.1.1.1
Rev: doc/files/file:1.1.1.1
Rev: doc/files/file_stat:1.1.1.1
Rev: doc/files/fork:1.1.1.1
Rev: doc/files/get_dir:1.1.1.1
Rev: doc/files/getcwd:1.1.1.1
Rev: doc/files/mkdir:1.1.1.1
Rev: doc/files/mv:1.1.1.1
Rev: doc/files/perror:1.1.1.1
Rev: doc/files/port:1.1.1.1
Rev: doc/files/rm:1.1.1.1
Rev: doc/lpc/command_line_options:1.1.1.1
Rev: doc/lpc/control_structures:1.1.1.1
Rev: doc/lpc/hilfe.hilfe:1.1.1.1
Rev: doc/lpc/how_to_make_modules:1.1.1.1
Rev: doc/manual/i-overview.html:1.1.1.1
Rev: doc/manual/index.html:1.1.1.1
Rev: doc/manual/t-hello.html:1.1.1.1
Rev: doc/manual/ulpc-inside3.gif:1.1.1.1
Rev: doc/math/acos:1.1.1.1
Rev: doc/math/asin:1.1.1.1
Rev: doc/math/atan:1.1.1.1
Rev: doc/math/ceil:1.1.1.1
Rev: doc/math/cos:1.1.1.1
Rev: doc/math/exp:1.1.1.1
Rev: doc/math/floor:1.1.1.1
Rev: doc/math/log:1.1.1.1
Rev: doc/math/pow:1.1.1.1
Rev: doc/math/sin:1.1.1.1
Rev: doc/math/sqrt:1.1.1.1
Rev: doc/math/tan:1.1.1.1
Rev: doc/operators/addition:1.1.1.1
Rev: doc/regexp/regexp:1.1.1.1
Rev: doc/simulated/PI:1.1.1.1
Rev: doc/simulated/capitalize:1.1.1.1
Rev: doc/simulated/code_value:1.1.1.1
Rev: doc/simulated/describe_backtrace:1.1.1.1
Rev: doc/simulated/file_size:1.1.1.1
Rev: doc/simulated/filter_array:1.1.1.1
Rev: doc/simulated/get_function:1.1.1.1
Rev: doc/simulated/getenv:1.1.1.1
Rev: doc/simulated/l_sizeof:1.1.1.1
Rev: doc/simulated/m_indices:1.1.1.1
Rev: doc/simulated/m_sizeof:1.1.1.1
Rev: doc/simulated/m_values:1.1.1.1
Rev: doc/simulated/map_array:1.1.1.1
Rev: doc/simulated/master:1.1.1.1
Rev: doc/simulated/member_array:1.1.1.1
Rev: doc/simulated/popen:1.1.1.1
Rev: doc/simulated/previous_object:1.1.1.1
Rev: doc/simulated/read_bytes:1.1.1.1
Rev: doc/simulated/regexp:1.1.1.1
Rev: doc/simulated/search_array:1.1.1.1
Rev: doc/simulated/sort_array:1.1.1.1
Rev: doc/simulated/spawn:1.1.1.1
Rev: doc/simulated/strlen:1.1.1.1
Rev: doc/simulated/strstr:1.1.1.1
Rev: doc/simulated/sum_arrays:1.1.1.1
Rev: doc/simulated/this_function:1.1.1.1
Rev: doc/simulated/write:1.1.1.1
Rev: doc/simulated/write_file:1.1.1.1
Rev: doc/sprintf/sprintf:1.1.1.1
Rev: doc/types/array:1.1.1.1
Rev: doc/types/float:1.1.1.1
Rev: doc/types/function:1.1.1.1
Rev: doc/types/int:1.1.1.1
Rev: doc/types/list:1.1.1.1
Rev: doc/types/mapping:1.1.1.1
Rev: doc/types/object:1.1.1.1
Rev: doc/types/program:1.1.1.1
Rev: doc/types/string:1.1.1.1
Rev: lib/conftest.h:1.1.1.1
Rev: lib/master.lpc:1.1.1.1
Rev: lib/simulate.lpc:1.1.1.1
Rev: lib/testsuite.lpc:1.1.1.1
Rev: src/BUGS:1.1.1.1
Rev: src/COPYING:1.1.1.1
Rev: src/COPYRIGHT:1.1.1.1
Rev: src/DISCLAIMER:1.1.1.1
Rev: src/Makefile.in:1.1.1.1
Rev: src/README:1.1.1.1
Rev: src/add_efun.c:1.1.1.1
Rev: src/add_efun.h:1.1.1.1
Rev: src/alloca.c:1.1.1.1
Rev: src/array.c:1.1.1.1
Rev: src/array.h:1.1.1.1
Rev: src/backend.c:1.1.1.1
Rev: src/backend.h:1.1.1.1
Rev: src/builtin_efuns.c:1.1.1.1
Rev: src/builtin_efuns.h:1.1.1.1
Rev: src/call_out.c:1.1.1.1
Rev: src/call_out.h:1.1.1.1
Rev: src/callback.c:1.1.1.1
Rev: src/callback.h:1.1.1.1
Rev: src/config.h:1.1.1.1
Rev: src/configure.in:1.1.1.1
Rev: src/debug.c:1.1.1.1
Rev: src/debug.h:1.1.1.1
Rev: src/docode.c:1.1.1.1
Rev: src/docode.h:1.1.1.1
Rev: src/dynamic_buffer.c:1.1.1.1
Rev: src/dynamic_buffer.h:1.1.1.1
Rev: src/efun.h:1.1.1.1
Rev: src/error.c:1.1.1.1
Rev: src/error.h:1.1.1.1
Rev: src/fd_control.c:1.1.1.1
Rev: src/fd_control.h:1.1.1.1
Rev: src/fsort.c:1.1.1.1
Rev: src/fsort.h:1.1.1.1
Rev: src/global.h:1.1.1.1
Rev: src/hashtable.c:1.1.1.1
Rev: src/hashtable.h:1.1.1.1
Rev: src/install-sh:1.1.1.1
Rev: src/interpret.c:1.1.1.1
Rev: src/interpret.h:1.1.1.1
Rev: src/language.y:1.1.1.1
Rev: src/las.c:1.1.1.1
Rev: src/las.h:1.1.1.1
Rev: src/lex.c:1.1.1.1
Rev: src/lex.h:1.1.1.1
Rev: src/list.c:1.1.1.1
Rev: src/list.h:1.1.1.1
Rev: src/lpc_types.c:1.1.1.1
Rev: src/lpc_types.h:1.1.1.1
Rev: src/machine.h.in:1.1.1.1
Rev: src/macros.h:1.1.1.1
Rev: src/main.c:1.1.1.1
Rev: src/main.h:1.1.1.1
Rev: src/mapping.c:1.1.1.1
Rev: src/mapping.h:1.1.1.1
Rev: src/memory.c:1.1.1.1
Rev: src/memory.h:1.1.1.1
Rev: src/module.c:1.1.1.1
Rev: src/module.h:1.1.1.1
Rev: src/modules/efuns.c:1.1.1.1
Rev: src/modules/files/Makefile.in:1.1.1.1
Rev: src/modules/files/configure.in:1.1.1.1
Rev: src/modules/files/datagram.c:1.1.1.1
Rev: src/modules/files/efuns.c:1.1.1.1
Rev: src/modules/files/file.c:1.1.1.1
Rev: src/modules/files/file.h:1.1.1.1
Rev: src/modules/files/file_machine.h.in:1.1.1.1
Rev: src/modules/files/socket.c:1.1.1.1
Rev: src/modules/math/Makefile.in:1.1.1.1
Rev: src/modules/math/configure.in:1.1.1.1
Rev: src/modules/math/math.c:1.1.1.1
Rev: src/modules/regexp/Makefile.in:1.1.1.1
Rev: src/modules/regexp/configure.in:1.1.1.1
Rev: src/modules/regexp/glue.c:1.1.1.1
Rev: src/modules/regexp/regexp.c:1.1.1.1
Rev: src/modules/regexp/regexp.h:1.1.1.1
Rev: src/modules/sprintf/Makefile.in:1.1.1.1
Rev: src/modules/sprintf/configure.in:1.1.1.1
Rev: src/modules/sprintf/sprintf.c:1.1.1.1
Rev: src/object.c:1.1.1.1
Rev: src/object.h:1.1.1.1
Rev: src/opcodes.c:1.1.1.1
Rev: src/opcodes.h:1.1.1.1
Rev: src/operators.c:1.1.1.1
Rev: src/operators.h:1.1.1.1
Rev: src/otable.h:1.1.1.1
Rev: src/port.c:1.1.1.1
Rev: src/port.h:1.1.1.1
Rev: src/program.c:1.1.1.1
Rev: src/program.h:1.1.1.1
Rev: src/rusage.c:1.1.1.1
Rev: src/rusage.h:1.1.1.1
Rev: src/stralloc.c:1.1.1.1
Rev: src/stralloc.h:1.1.1.1
Rev: src/stuff.c:1.1.1.1
Rev: src/stuff.h:1.1.1.1
Rev: src/svalue.c:1.1.1.1
Rev: src/svalue.h:1.1.1.1
Rev: src/todo:1.1.1.1
Rev: src/types.h:1.1.1.1
Rev: src/ualarm.c:1.1.1.1

1: + #include "global.h" + #include "stralloc.h" + #include "macros.h" + #include "dynamic_buffer.h" + #include "macros.h" + #include "memory.h" + #include "error.h"    -  + static struct lpc_string *base_table[HTABLE_SIZE]; + static unsigned INT32 full_hash_value; +  + /* +  */ + static unsigned int StrHash(const char *s,int len) + { +  full_hash_value=hashmem((unsigned char *)s, len, 20); +  return full_hash_value % HTABLE_SIZE; + } +  + #ifdef DEBUG + void check_string(struct lpc_string *s) + { +  if(debug_findstring(s) !=s) +  fatal("Shared string not shared.\n"); +  +  checked((void *)s,1); + } +  + void verify_shared_strings_tables(int pass) + { +  unsigned int e, h; +  struct lpc_string *s; +  +  for(e=0;e<HTABLE_SIZE;e++) +  { +  h=0; +  for(s=base_table[e];s;s=s->next) +  { +  if(pass) +  { +  if(checked((void *)s,0)!=s->refs) +  { +  fatal("Shared string has wrong number of refs '%s'.\n",s->str); +  } +  continue; +  } +  h++; +  if(s->len < 0) +  fatal("Shared string shorter than zero bytes.\n"); +  +  if(s->refs <= 0) +  fatal("Shared string had too few references.\n"); +  +  if(s->str[s->len]) +  fatal("Shared string didn't end with a zero.\n"); +  +  if(StrHash(s->str, s->len) != e) +  fatal("Shared string hashed to wrong place.\n"); +  +  if(s->hval != full_hash_value) +  fatal("Shared string hashed to other number.\n"); +  +  if(h>10000) +  { +  struct lpc_string *s2; +  for(s2=s;s2;s2=s2->next) +  if(s2 == s) +  fatal("Shared string table is cyclic.\n"); +  h=0; +  } +  } +  } + } + #endif +  + /* +  * find a string in the shared string table. +  */ + static struct lpc_string *internal_findstring(const char *s,int len,int h) + { +  struct lpc_string *curr,**prev, **base; +  +  for(base = prev = base_table + h;( curr=*prev ); prev=&curr->next) +  { + #ifdef DEBUG +  if(curr->refs<1) +  fatal("String with no references.\n"); + #endif +  +  if (full_hash_value == curr->hval && +  len==curr->len && +  !MEMCMP(curr->str, s,len)) /* found it */ +  { +  *prev = curr->next; +  curr->next = *base; +  *base = curr; +  return curr; /* pointer to string */ +  } +  } +  return 0; /* not found */ + } +  + struct lpc_string *findstring(const char *foo) + { +  int l; +  l=strlen(foo); +  return internal_findstring(foo, l, StrHash(foo,l)); + } +  + /* +  * find a string that is already shared and move it to the head +  * of that list in the hastable +  */ + static struct lpc_string *propagate_shared_string(const struct lpc_string *s,int h) + { +  struct lpc_string *curr, **prev, **base; +  +  for(base = prev = base_table + h;( curr=*prev ); prev=&curr->next) +  { +  if (curr == s) /* found it */ +  { +  *prev=curr->next; +  curr->next=*base; +  *base=curr; +  return curr; +  } + #ifdef DEBUG +  if(curr->refs<1) +  fatal("String with no references.\n"); + #endif +  } +  return 0; /* not found */ + } +  + #ifdef DEBUG + struct lpc_string *debug_findstring(const struct lpc_string *foo) + { +  return propagate_shared_string(foo, StrHash(foo->str, foo->len)); + } + #endif +  + /* note that begin_shared_string expects the _exact_ size of the string, +  * not the maximum size +  */ + struct lpc_string *begin_shared_string(int len) + { +  struct lpc_string *t; +  t=(struct lpc_string *)xalloc(len + sizeof(struct lpc_string)); +  t->len=len; +  return t; + } +  + struct lpc_string *end_shared_string(struct lpc_string *s) + { +  int len,h; +  struct lpc_string *s2; +  +  len=s->len; +  h=StrHash(s->str,len); +  s2=internal_findstring(s->str,len,h); +  +  if(s2) +  { +  free((char *)s); +  s=s2; +  }else{ +  s->str[len]=0; +  s->refs = 0; +  s->next = base_table[h]; +  base_table[h] = s; +  s->hval=full_hash_value; +  } +  s->refs++; +  +  return s; + } +  + struct lpc_string * make_shared_binary_string(const char *str,int len) + { +  struct lpc_string *s; +  int h=StrHash(str,len); +  +  s = internal_findstring(str,len,h); +  if (!s) +  { +  s=begin_shared_string(len); +  MEMCPY(s->str, str, len); +  s->str[len] = 0; +  s->refs = 0; +  s->next = base_table[h]; +  base_table[h] = s; +  s->hval=full_hash_value; +  } +  +  s->refs++; +  +  return s; + } +  + struct lpc_string *make_shared_string(const char *str) + { +  return make_shared_binary_string(str, strlen(str)); + } +  + /* does not take locale into account */ + int low_quick_binary_strcmp(char *a,INT32 alen, +  char *b,INT32 blen) + { +  int tmp; +  if(alen > blen) +  { +  tmp=MEMCMP(a, b, blen); +  if(tmp) return tmp; +  return 1; +  }else if(alen < blen){ +  tmp=MEMCMP(a, b, alen); +  if(tmp) return tmp; +  return -1; +  }else{ +  return MEMCMP(a, b, alen); +  } + } +  + #ifndef HAVE_STRCOLL + /* No locale function available */ + static int low_binary_strcmp(char *a,INT32 alen, +  char *b,INT32 blen) + { +  low_quick_binary_strcmp(a,alen,b,blen); + } + #else +  + /* takes locale into account */ + static int low_binary_strcmp(char *a,INT32 alen, +  char *b,INT32 blen) + { +  INT32 tmp; +  while(alen>0 && blen>0) +  { +  tmp=strcoll(a,b); +  if(tmp) return (int)tmp; +  tmp=strlen(a)+1; +  a+=tmp; +  b+=tmp; +  alen-=tmp; +  blen-=tmp; +  } +  if(alen==blen) return 0; +  if(alen > blen) return 1; +  return -1; + } + #endif +  + /* Does not take locale into account */ + int my_quick_strcmp(struct lpc_string *a,struct lpc_string *b) + { +  if(a==b) return 0; +  +  return low_quick_binary_strcmp(a->str,a->len,b->str,b->len); + } +  + /* Does take locale into account */ + int my_strcmp(struct lpc_string *a,struct lpc_string *b) + { +  if(a==b) return 0; +  +  return low_binary_strcmp(a->str,a->len,b->str,b->len); + } +  + void really_free_string(struct lpc_string *s) + { +  int h; +  +  h=StrHash(s->str,s->len); +  propagate_shared_string(s,h); +  base_table[h]=s->next; +  free((char *)s); + } +  + /* +  * +  */ + struct lpc_string *add_string_status(int verbose) + { +  char b[200]; +  +  init_buf(); +  +  if (verbose) +  { +  int allocd_strings=0; +  int allocd_bytes=0; +  int num_distinct_strings=0; +  int bytes_distinct_strings=0; +  int overhead_bytes=0; +  int e; +  struct lpc_string *p; +  for(e=0;e<HTABLE_SIZE;e++) +  { +  for(p=base_table[e];p;p=p->next) +  { +  num_distinct_strings++; +  bytes_distinct_strings+=ALIGN(p->len); +  allocd_strings+=p->refs; +  allocd_bytes+=p->refs*ALIGN(p->len+3); +  } +  +  } +  overhead_bytes=(sizeof(struct lpc_string)-1)*num_distinct_strings; +  my_strcat("\nShared string hash table:\n"); +  my_strcat("-------------------------\t Strings Bytes\n"); +  +  sprintf(b,"Total asked for\t\t\t%8ld %8ld\n", +  (long)allocd_strings, (long)allocd_bytes); +  my_strcat(b); +  sprintf(b,"Strings malloced\t\t%8ld %8ld + %ld overhead\n", +  (long)num_distinct_strings, +  (long)bytes_distinct_strings, +  (long)overhead_bytes); +  my_strcat(b); +  sprintf(b,"Space actually required/total string bytes %d%%\n", +  (bytes_distinct_strings + overhead_bytes)*100 / allocd_bytes); +  my_strcat(b); +  } + /* +  sprintf(b,"Searches: %ld Average search length: %6.3f\n", +  (long)num_str_searches, (double)search_len / num_str_searches); +  my_strcat(b); + */ +  return free_buf(); + } +  + void dump_stralloc_strings() + { +  int e; +  struct lpc_string *p; +  for(e=0;e<HTABLE_SIZE;e++) +  for(p=base_table[e];p;p=p->next) +  printf("%ld refs \"%s\"\n",p->refs,p->str); + } +  + struct lpc_string *add_shared_strings(struct lpc_string *a, +  struct lpc_string *b) + { +  INT32 size; +  struct lpc_string *ret; +  char *buf; +  +  size = a->len + b->len; +  +  ret=begin_shared_string(size); +  buf=ret->str; +  MEMCPY(buf,a->str,a->len); +  MEMCPY(buf+a->len,b->str,b->len); +  ret=end_shared_string(ret); +  +  return ret; + } +  + struct lpc_string *string_replace(struct lpc_string *str, +  struct lpc_string *del, +  struct lpc_string *to) + { +  struct lpc_string *ret; +  INT32 delimeters; +  char *s,*tmp,*r,*end; +  +  s=str->str; +  end=s+str->len; +  delimeters=0; +  +  while((s=MEMMEM(del->str,del->len,s,end-s))) +  { +  delimeters++; +  s+=del->len; +  } +  +  if(!delimeters) +  { +  str->refs++; +  return str; +  } +  +  ret=begin_shared_string(str->len + (to->len-del->len)*delimeters); +  s=str->str; +  r=ret->str; +  +  while((tmp=MEMMEM(del->str,del->len,s,end-s))) +  { +  MEMCPY(r,s,tmp-s); +  r+=tmp-s; +  MEMCPY(r,to->str,to->len); +  r+=to->len; +  s=tmp+del->len; +  } +  MEMCPY(r,s,end-s); +  +  return end_shared_string(ret); + } +  + void cleanup_shared_string_table() + { +  int e; +  struct lpc_string *s,*next; +  for(e=0;e<HTABLE_SIZE;e++) +  { +  for(s=base_table[e];s;s=next) +  { +  next=s->next; + #ifdef REALLY_FREE +  free((char *)s); + #else +  s->next=0; + #endif +  } +  base_table[e]=0; +  } + }   Newline at end of file added.