#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2
  //     3  %integerfunction hash addr(%string (31) name)

  int HASHADDR(_imp_string31 NAME) {
    //     4    %constinteger hash table size = 1023
    //     5    %integer hash index = 0; %integer char

    int HASHINDEX;
    HASHINDEX = 0;
    int CHAR;

    //     6    %for char = 1,1,LENGTH (name) %cycle

    // %for CHAR = 1, 1, *_imp_LENGTH((_imp_string255 *)/*p*//*?*/&NAME) %cycle
    {
      int _final = *_imp_LENGTH((_imp_string255 *)/*p*/ /*?*/ &NAME);
      if (invalid_for_loop(1, 1, _final))
        _imp_signal(5, 1, 0, "Illegal cycle CHAR = 1, 1, *_imp_LENGTH((_imp_string255 *)/*p*//*?*/&NAME)");
      CHAR = 0;
    L_0001:
      if (CHAR == _final) goto L_0002;
      CHAR += 1;

      //     7      hash index =  hash index<<1 !! CHARNO(name,char)

      HASHINDEX = HASHINDEX << 1 ^ *_imp_CHARNO((_imp_string255 *)/*p*/ /*?*/ &NAME, CHAR);

      //     8    %repeat

      goto L_0001;
    }

  L_0002:;

  //     9    %result =  hash index & hash table size

    return HASHINDEX & 1023;

    //    10  %end  {of  hash code generated from string}

  } /* end of HASHADDR */

  //    11
  //    12  %endofprogram

  _imp_stop(0);
  return 0;
end_0:;
}