Module : tbl_dir

<module title="Automatically generated module">
 
<routine name="tbl_get_dir_key" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return 0;
  return *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+0);
</routine>
 
<routine name="tbl_put_dir_key" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.key\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+0)=v_val;
</routine>
 
<routine name="tbl_add_dir_key" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.key\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+0)= 
  sadd(*(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+0), v_val);
</routine>
 
 
<routine name="tbl_get_dir_file" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return 0;
  return *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+4);
</routine>
 
<routine name="tbl_put_dir_file" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.file\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+4)=v_val;
</routine>
 
<routine name="tbl_add_dir_file" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.file\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+4)= 
  sadd(*(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+4), v_val);
</routine>
 
 
<routine name="tbl_get_dir_type" type="[File Directory Hidden]" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return -1;
  return *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+8);
</routine>
 
<routine name="tbl_put_dir_type" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.type\n");
    return;
  }
  *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+8)=v_val;
</routine>
 
<routine name="tbl_add_dir_type" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.type\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+8)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_type" parameter="rec" type="number" parameter="val" type="[File Directory Hidden]" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.type\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+8)-=v_val;
</routine>
 
<routine name="tbl_get_dir_size" type="number" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return null;
  return *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+12);
</routine>
 
<routine name="tbl_put_dir_size" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.size\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+12)=v_val;
</routine>
 
<routine name="tbl_add_dir_size" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.size\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+12)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_size" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.size\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+12)-=v_val;
</routine>
 
<routine name="tbl_get_dir_user_id" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return 0;
  return *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+16);
</routine>
 
<routine name="tbl_put_dir_user_id" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.user_id\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+16)=v_val;
</routine>
 
<routine name="tbl_add_dir_user_id" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.user_id\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+16)= 
  sadd(*(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+16), v_val);
</routine>
 
 
<routine name="tbl_get_dir_user_rights" type="[Normal Execute Readonly None]" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return -1;
  return *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+20);
</routine>
 
<routine name="tbl_put_dir_user_rights" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.user_rights\n");
    return;
  }
  *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+20)=v_val;
</routine>
 
<routine name="tbl_add_dir_user_rights" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.user_rights\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+20)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_user_rights" parameter="rec" type="number" parameter="val" type="[Normal Execute Readonly None]" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.user_rights\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+20)-=v_val;
</routine>
 
<routine name="tbl_get_dir_group_id" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return 0;
  return *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+24);
</routine>
 
<routine name="tbl_put_dir_group_id" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.group_id\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+24)=v_val;
</routine>
 
<routine name="tbl_add_dir_group_id" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.group_id\n");
    return;
  }
  *(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+24)= 
  sadd(*(char**)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+24), v_val);
</routine>
 
 
<routine name="tbl_get_dir_group_rights" type="[Normal Execute Readonly None]" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return -1;
  return *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+28);
</routine>
 
<routine name="tbl_put_dir_group_rights" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.group_rights\n");
    return;
  }
  *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+28)=v_val;
</routine>
 
<routine name="tbl_add_dir_group_rights" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.group_rights\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+28)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_group_rights" parameter="rec" type="number" parameter="val" type="[Normal Execute Readonly None]" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.group_rights\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+28)-=v_val;
</routine>
 
<routine name="tbl_get_dir_public_rights" type="[Normal Execute Readonly None]" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return -1;
  return *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+32);
</routine>
 
<routine name="tbl_put_dir_public_rights" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.public_rights\n");
    return;
  }
  *(int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+32)=v_val;
</routine>
 
<routine name="tbl_add_dir_public_rights" parameter="rec" type="number" parameter="val" type="enumerate" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.public_rights\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+32)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_public_rights" parameter="rec" type="number" parameter="val" type="[Normal Execute Readonly None]" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.public_rights\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+32)-=v_val;
</routine>
 
<routine name="tbl_get_dir_last_use" type="time" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return 0;
  return *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+36);
</routine>
 
<routine name="tbl_put_dir_last_use" parameter="rec" type="number" parameter="val" type="time" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.last_use\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+36)=v_val;
</routine>
 
<routine name="tbl_add_dir_last_use" parameter="rec" type="number" parameter="val" type="time" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.last_use\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+36)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_last_use" parameter="rec" type="number" parameter="val" type="time" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.last_use\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+36)-=v_val;
</routine>
 
<routine name="tbl_get_dir_last_change" type="time" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[1].len) return 0;
  return *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+40);
</routine>
 
<routine name="tbl_put_dir_last_change" parameter="rec" type="number" parameter="val" type="time" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in filling field dir.last_change\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+40)=v_val;
</routine>
 
<routine name="tbl_add_dir_last_change" parameter="rec" type="number" parameter="val" type="time" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("error in adding to field dir.last_change\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+40)+=v_val;
</routine>
 
<routine name="tbl_sub_dir_last_change" parameter="rec" type="number" parameter="val" type="time" system>
  if (v_rec<0 || v_rec>=u_table[1].len) {
    printf("Error in subtraction from field dir.last_change\n");
    return;
  }
  *(long int*)(u_table[1].ptr[v_rec/250]+(v_rec%250)*u_table[1].size+40)-=v_val;
</routine>
<routine name="tbl_search_dir"
   type="^dir" 
   parameter="p_key" type="string"
   parameter="p_file" type="string" special>
  var level as byte
  var curr as number
  var branch as number
  var idx as ^dir
  var ptr as ^dir
  var brfnd as boolean
  var nxt as byte
  level=1
  curr=-1
  branch=-1
  brfnd=false
  loop
    curr=searchindex(curr, level, nxt, maxbranch(1)+1)
    idx=getpointer(curr, 0, 1)
    if curr=-1 or idx=null then break endif
    nxt=0
    nxt=check(p_key, idx.key)
    if nxt=0 then nxt=check(p_file, idx.file) endif
    if nxt<=0 then branch=curr ptr=idx endif
    if nxt=0 then brfnd=true endif
    level+=1
  do
  if branch>0 then branch-=1 endif
  if branch=-1 then branch=maxbranch(1) endif
  level=1
  curr=-1
  loop
    curr=searchindex(curr, level, nxt, maxleaf(branch, 1)+1)
    idx=getpointer(branch, curr, 1)
    if curr=-1 or idx=null then break endif
    nxt=0
    nxt=check(p_key, idx.key)
    if nxt=0 then nxt=check(p_file, idx.file) endif
    if nxt<=0 then ptr=idx endif
    level+=1
  do
  if brfnd and ptr=null then
    ptr=getpointer(branch+1, 0, 1)
  endif
  return ptr
</routine>
 
<routine name="tbl_add_dir"
 type="^dir" parameter="new" type="^dir" special>
  var idx_dir as ^dir
  var last as ^dir
  idx_dir=tbl_search_dir(new.key, new.file)
  if idx_dir=null then
    last=getpointer(maxbranch(1), maxleaf(maxbranch(1), 1), 1)
  else
    last=ptrmin1(idx_dir, 1)
  endif
  addindex(idx_dir, tablelen(1)-1, 1)
  output "add dir(1):"+new.key+"|"+new.file+"|"+new.type+"|"+new.size+"|"+new.user_id+"|"+new.user_rights+"|"+new.group_id+"|"+new.group_rights+"|"+new.public_rights+"|"+new.last_use+"|"+new.last_change+"|" to log
  flush(log)
  if last=null then return getpointer(0, 0, 1) endif
  return ptrplus1(last, 1)
</routine>
 
<routine name="tbl_delete_dir"
  parameter="delrec" type="number" special>
  var last as ^dir
  var chk as ^dir
  var del as ^dir
  del=getrecptr(delrec, 1)
  output "delete dir(1):"+del.key+"|"+del.file+"|"+del.type+"|"+del.size+"|"+del.user_id+"|"+del.user_rights+"|"+del.group_id+"|"+del.group_rights+"|"+del.public_rights+"|"+del.last_use+"|"+del.last_change+"|" to log
  flush(log)
  chk=tbl_search_dir(del.key, del.file)
  deleteindex(chk, 1)
 del.key=null
 del.file=null
 del.user_id=null
 del.group_id=null
  if getrec(del, 1)<>tablelen(1)-1 then
    last=getrecptr(tablelen(1)-1, 1)
    changeindex(tbl_search_dir(last.key, last.file), delrec, 1)
  endif
  deleterecord(delrec, 1)
  if chk=null then return endif
  chk=recalcptr(chk, 1)
</routine>
 
<routine name="tbl_update_dir"
   type="^dir" parameter="rec" type="number" special>
  var new as ^dir
  var del as ^dir
  del=getrecptr(rec, 1)
  new=tbl_search_dir(del.key, del.file)
  deleteindex(new, 1)
  deleterecord(rec, 1)
  addindex(tbl_search_dir(new.key, new.file), getrec(new, 1), 1)
  if new=null then 
    new=getpointer(0, 0, 1)
  endif
  output "update dir:"+new.key+"|"+new.file+"|"+new.type+"|"+new.size+"|"+new.user_id+"|"+new.user_rights+"|"+new.group_id+"|"+new.group_rights+"|"+new.public_rights+"|"+new.last_use+"|"+new.last_change+"|" to log
  flush(log)
  return new
</routine>
 
<routine name="tbl_clear_dir" system>
  long int r=0;
  long int branch;
  while (r < u_table[1].len) {
    if (*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+0)!=0) {free(*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+0)); *(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+0)=0;}
    if (*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+4)!=0) {free(*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+4)); *(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+4)=0;}
    if (*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+16)!=0) {free(*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+16)); *(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+16)=0;}
    if (*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+24)!=0) {free(*(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+24)); *(char**)(u_table[1].ptr[r/250]+(r%250)*u_table[1].size+24)=0;}
    r++;
  }
  free(u_table[1].ptr);
  u_table[1].ptr=0;
  u_table[1].len=0;
  for(branch=0; branch < u_index[1].scale; branch++)
  { free(u_index[1].ptr[branch]);
  }
  free(u_index[1].len);
  free(u_index[1].ptr);
  u_index[1].scale=0;
  u_index[1].len=0;
  u_index[1].ptr=0;
  fprintf(v_log, "clear dir(1)\n");
  fflush(v_log);
</routine>
 
 
<routine name="tbl_tablelength_dir" type="number" system>
  return u_table[1].len;
</routine>
 
<routine name="tbl_init_dir" system>
  u_table[1].len=0;
  u_table[1].size=44;
  u_table[1].ptr=0;
  u_index[1].tbl=1;
  u_index[1].scale=0;
  u_index[1].len=0;
  u_index[1].ptr=0;
  u_index[1].ptrs=0;
  u_index[1].padm=0;
</routine>
 
<routine name="tbl_write_dir" parameter="ptr" type="^dir" parameter="stream" type="stream">
  write(ptr.key, stream)
  write(ptr.file, stream)
  write(ptr.type, stream)
  write(ptr.size, stream)
  write(ptr.user_id, stream)
  write(ptr.user_rights, stream)
  write(ptr.group_id, stream)
  write(ptr.group_rights, stream)
  write(ptr.public_rights, stream)
  write(ptr.last_use, stream)
  write(ptr.last_change, stream)
</routine>
 
<routine name="tbl_read_dir" type="^dir" parameter="stream" type="stream">
  add dir as new
  new.key=readtext(stream)
  new.file=readtext(stream)
  new.type=read(stream)
  new.size=read(stream)
  new.user_id=readtext(stream)
  new.user_rights=read(stream)
  new.group_id=readtext(stream)
  new.group_rights=read(stream)
  new.public_rights=read(stream)
  new.last_use=read(stream)
  new.last_change=read(stream)
  update
  return new
</routine>