Patch title: Release 89 bulk changes
Abstract:
File: /language/basic/extend.c
Key:
    Removed line
    Added line
   
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


static struct Argument *local_variable(struct Expression *e,
  struct Function *function; struct List *locals; 
  struct LocalVariable *l; struct Argument *a;
  Arrow *c; struct Str temp; Arrow la;
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


static struct Argument *local_variable(struct Expression *e,
  struct Function *function; struct List *locals; 
  struct LocalVariable *l; struct Argument *a;
  Arrow *c; struct Str temp; Arrow la;

  function=current_function();
  if(function==null) {
    error_notifyn(error_id_compile,Z,"You can define local v
    return null; }
  for(c=Module_first(e->module,name); *c!=null; c=Module_nex
    if(entry_type(*c)==G.type_LocalVariable) {
      l=(struct LocalVariable *)*c;
      if(l->function!=function)
        continue;
      a=l->body;
      if(a->where!=Argument_local) {
        error_notifyn(error_id_compile,Z,"The name is alread
        return null;
      orif(a->type!=type)
        error_notifyn(error_id_compile,Z,"The local variable
        return null; }
      if (eident!=null)
        call_active(*c,Access_read|Access_constant,eident);
      return a; }
  la=entry_new(G.type_LocalVariable);l=(struct LocalVariable
  a=argument(type,Argument_local); Str_copy(name,&a->name);
  l->function=function;
  Arrow_set((Arrow *)&l->body,a);
  l->access=Arw;
  Expression_define(e,&l->name,l,e->module);
  c=Module_first(e->module,Str_map_string(&temp,"pliant loca
  if(c==G.null_constant) {
    locals=(struct List *)entry_new(G.type_List);
    Module_define(e->module,&temp,locals);
  other
    check(entry_type(*c)==G.type_List);
    locals=(struct List *)*c; }
  List_append(locals,l);
  if (eident!=null)
    call_active(la,Access_read|Access_constant,eident);
  return a; }
  function=current_function();
  if(function==null) {
    error_notifyn(error_id_compile,Z,"You can define local v
    return null; }
  for(c=Module_first(e->module,name); *c!=null; c=Module_nex
    if(entry_type(*c)==G.type_LocalVariable) {
      l=(struct LocalVariable *)*c;
      if(l->function!=function)
        continue;
      a=l->body;
      if(a->where!=Argument_local) {
        error_notifyn(error_id_compile,Z,"The name is alread
        return null;
      orif(a->type!=type)
        error_notifyn(error_id_compile,Z,"The local variable
        return null; }
      if (eident!=null)
        call_active(*c,Access_read|Access_constant,eident);
      return a; }
  la=entry_new(G.type_LocalVariable);l=(struct LocalVariable
  a=argument(type,Argument_local); Str_copy(name,&a->name);
  l->function=function;
  Arrow_set((Arrow *)&l->body,a);
  l->access=Arw;
  Expression_define(e,&l->name,l,e->module);
  c=Module_first(e->module,Str_map_string(&temp,"pliant loca
  if(c==G.null_constant) {
    locals=(struct List *)entry_new(G.type_List);
    Module_define(e->module,&temp,locals);
  other
    check(entry_type(*c)==G.type_List);
    locals=(struct List *)*c; }
  List_append(locals,l);
  if (eident!=null)
    call_active(la,Access_read|Access_constant,eident);
  return a; }

static struct Argument *local_variable1(struct Expression *e
  return local_variable(e,null,name,type);}


static struct Argument *local_variable1(struct Expression *e
  return local_variable(e,null,name,type);}