Module : tbl_scanstack

<module title="Automatically generated module">
 
<routine name="tbl_get_scanstack_pos" type="sort" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+0);
</routine>
 
<routine name="tbl_put_scanstack_pos" parameter="rec" type="number" parameter="val" type="sort" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.pos\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+0)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_pos" parameter="rec" type="number" parameter="val" type="sort" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.pos\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+0)+=v_val;
</routine>
 
<routine name="tbl_sub_scanstack_pos" parameter="rec" type="number" parameter="val" type="sort" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("Error in subtraction from field scanstack.pos\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+0)-=v_val;
</routine>
 
<routine name="tbl_get_scanstack_file" type="number" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return null;
  return *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+4);
</routine>
 
<routine name="tbl_put_scanstack_file" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.file\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+4)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_file" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.file\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+4)+=v_val;
</routine>
 
<routine name="tbl_sub_scanstack_file" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("Error in subtraction from field scanstack.file\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+4)-=v_val;
</routine>
 
<routine name="tbl_get_scanstack_outfile" type="number" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return null;
  return *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+8);
</routine>
 
<routine name="tbl_put_scanstack_outfile" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.outfile\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+8)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_outfile" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.outfile\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+8)+=v_val;
</routine>
 
<routine name="tbl_sub_scanstack_outfile" parameter="rec" type="number" parameter="val" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("Error in subtraction from field scanstack.outfile\n");
    return;
  }
  *(long int*)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+8)-=v_val;
</routine>
 
<routine name="tbl_get_scanstack_ch" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+12);
</routine>
 
<routine name="tbl_put_scanstack_ch" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.ch\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+12)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_ch" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.ch\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+12)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+12), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_nextch" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+16);
</routine>
 
<routine name="tbl_put_scanstack_nextch" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.nextch\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+16)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_nextch" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.nextch\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+16)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+16), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chwhat" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+20);
</routine>
 
<routine name="tbl_put_scanstack_chwhat" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chwhat\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+20)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chwhat" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chwhat\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+20)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+20), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chwhere" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+24);
</routine>
 
<routine name="tbl_put_scanstack_chwhere" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chwhere\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+24)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chwhere" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chwhere\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+24)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+24), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chmess" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+28);
</routine>
 
<routine name="tbl_put_scanstack_chmess" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chmess\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+28)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chmess" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chmess\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+28)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+28), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chline" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+32);
</routine>
 
<routine name="tbl_put_scanstack_chline" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chline\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+32)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chline" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chline\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+32)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+32), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chold" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+36);
</routine>
 
<routine name="tbl_put_scanstack_chold" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chold\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+36)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chold" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chold\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+36)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+36), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chbetween" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+40);
</routine>
 
<routine name="tbl_put_scanstack_chbetween" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chbetween\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+40)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chbetween" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chbetween\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+40)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+40), v_val);
</routine>
 
 
<routine name="tbl_get_scanstack_chnew" type="constr" parameter="rec" type="number" system>
  if (v_rec<0 || v_rec>=u_table[3].len) return 0;
  return *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+44);
</routine>
 
<routine name="tbl_put_scanstack_chnew" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in filling field scanstack.chnew\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+44)=v_val;
</routine>
 
<routine name="tbl_add_scanstack_chnew" parameter="rec" type="number" parameter="val" type="string" system>
  if (v_rec<0 || v_rec>=u_table[3].len) {
    printf("error in adding to field scanstack.chnew\n");
    return;
  }
  *(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+44)= 
  sadd(*(char**)(u_table[3].ptr[v_rec/250]+(v_rec%250)*u_table[3].size+44), v_val);
</routine>
 
<routine name="tbl_search_scanstack"
   type="^scanstack" 
   parameter="p_pos" type="number" special>
  var level as byte
  var curr as number
  var branch as number
  var idx as ^scanstack
  var ptr as ^scanstack
  var brfnd as boolean
  var nxt as byte
  level=1
  curr=-1
  branch=-1
  brfnd=false
  loop
    curr=searchindex(curr, level, nxt, maxbranch(4)+1)
    idx=getpointer(curr, 0, 4)
    if curr=-1 or idx=null then break endif
    nxt=0
    nxt=check(p_pos, idx.pos)
    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(4) endif
  level=1
  curr=-1
  loop
    curr=searchindex(curr, level, nxt, maxleaf(branch, 4)+1)
    idx=getpointer(branch, curr, 4)
    if curr=-1 or idx=null then break endif
    nxt=0
    nxt=check(p_pos, idx.pos)
    if nxt<=0 then ptr=idx endif
    level+=1
  do
  if brfnd and ptr=null then
    ptr=getpointer(branch+1, 0, 4)
  endif
  return ptr
</routine>
 
<routine name="tbl_add_scanstack"
 type="^scanstack" parameter="new" type="^scanstack" special>
  var idx_scanstack as ^scanstack
  var last as ^scanstack
  new.pos=999999999
  idx_scanstack=tbl_search_scanstack(new.pos)
  if idx_scanstack=null then
    last=getpointer(maxbranch(4), maxleaf(maxbranch(4), 4), 4)
  else
    last=ptrmin1(idx_scanstack, 4)
  endif
  if last=null then
    new.pos=1
  else
    new.pos=last.pos+1
  endif
  addindex(idx_scanstack, tablelen(3)-1, 4)
  output "add scanstack(3):"+new.pos+"|"+new.file+"|"+new.outfile+"|"+new.ch+"|"+new.nextch+"|"+new.chwhat+"|"+new.chwhere+"|"+new.chmess+"|"+new.chline+"|"+new.chold+"|"+new.chbetween+"|"+new.chnew+"|" to log
  flush(log)
  if last=null then return getpointer(0, 0, 4) endif
  return ptrplus1(last, 4)
</routine>
 
<routine name="tbl_delete_scanstack"
  parameter="delrec" type="number" special>
  var last as ^scanstack
  var chk as ^scanstack
  var del as ^scanstack
  del=getrecptr(delrec, 3)
  output "delete scanstack(3):"+del.pos+"|"+del.file+"|"+del.outfile+"|"+del.ch+"|"+del.nextch+"|"+del.chwhat+"|"+del.chwhere+"|"+del.chmess+"|"+del.chline+"|"+del.chold+"|"+del.chbetween+"|"+del.chnew+"|" to log
  flush(log)
  chk=tbl_search_scanstack(del.pos)
  deleteindex(chk, 4)
  chk=tbl_search_scanstack(del.pos+1)
 del.ch=null
 del.nextch=null
 del.chwhat=null
 del.chwhere=null
 del.chmess=null
 del.chline=null
 del.chold=null
 del.chbetween=null
 del.chnew=null
  if getrec(del, 3)<>tablelen(3)-1 then
    last=getrecptr(tablelen(3)-1, 4)
    changeindex(tbl_search_scanstack(last.pos), delrec, 4)
  endif
  deleterecord(delrec, 3)
  if chk=null then return endif
  chk=recalcptr(chk, 4)
  var rec as number
  loop
    if chk=null or chk.pos=1 then break endif
    rec=getrec(chk, 3)
    chk.pos-=1
    chk=ptrplus1(chk, 4)
  do
</routine>
 
<routine name="tbl_update_scanstack"
   type="^scanstack" parameter="rec" type="number" special>
  var new as ^scanstack
  var del as ^scanstack
  del=getrecptr(rec, 3)
  new=tbl_search_scanstack(del.pos)
  deleteindex(new, 4)
  deleterecord(rec, 3)
  addindex(tbl_search_scanstack(new.pos), getrec(new, 4), 4)
  if new=null then 
    new=getpointer(0, 0, 3)
  endif
  output "update scanstack:"+new.pos+"|"+new.file+"|"+new.outfile+"|"+new.ch+"|"+new.nextch+"|"+new.chwhat+"|"+new.chwhere+"|"+new.chmess+"|"+new.chline+"|"+new.chold+"|"+new.chbetween+"|"+new.chnew+"|" to log
  flush(log)
  return new
</routine>
 
<routine name="tbl_clear_scanstack" system>
  long int r=0;
  long int branch;
  while (r < u_table[3].len) {
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+12)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+12)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+12)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+16)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+16)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+16)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+20)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+20)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+20)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+24)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+24)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+24)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+28)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+28)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+28)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+32)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+32)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+32)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+36)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+36)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+36)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+40)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+40)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+40)=0;}
    if (*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+44)!=0) {free(*(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+44)); *(char**)(u_table[3].ptr[r/250]+(r%250)*u_table[3].size+44)=0;}
    r++;
  }
  free(u_table[3].ptr);
  u_table[3].ptr=0;
  u_table[3].len=0;
  for(branch=0; branch < u_index[4].scale; branch++)
  { free(u_index[4].ptr[branch]);
  }
  free(u_index[4].len);
  free(u_index[4].ptr);
  u_index[4].scale=0;
  u_index[4].len=0;
  u_index[4].ptr=0;
  fprintf(v_log, "clear scanstack(3)\n");
  fflush(v_log);
</routine>
 
 
<routine name="tbl_tablelength_scanstack" type="number" system>
  return u_table[3].len;
</routine>
 
<routine name="tbl_init_scanstack" system>
  u_table[3].len=0;
  u_table[3].size=48;
  u_table[3].ptr=0;
  u_index[4].tbl=3;
  u_index[4].scale=0;
  u_index[4].len=0;
  u_index[4].ptr=0;
  u_index[4].ptrs=0;
  u_index[4].padm=0;
</routine>
 
<routine name="tbl_write_scanstack" parameter="ptr" type="^scanstack" parameter="stream" type="stream">
  write(ptr.pos, stream)
  write(ptr.file, stream)
  write(ptr.outfile, stream)
  write(ptr.ch, stream)
  write(ptr.nextch, stream)
  write(ptr.chwhat, stream)
  write(ptr.chwhere, stream)
  write(ptr.chmess, stream)
  write(ptr.chline, stream)
  write(ptr.chold, stream)
  write(ptr.chbetween, stream)
  write(ptr.chnew, stream)
</routine>
 
<routine name="tbl_read_scanstack" type="^scanstack" parameter="stream" type="stream">
  add scanstack as new
  new.pos=read(stream)
  new.file=read(stream)
  new.outfile=read(stream)
  new.ch=readtext(stream)
  new.nextch=readtext(stream)
  new.chwhat=readtext(stream)
  new.chwhere=readtext(stream)
  new.chmess=readtext(stream)
  new.chline=readtext(stream)
  new.chold=readtext(stream)
  new.chbetween=readtext(stream)
  new.chnew=readtext(stream)
  update
  return new
</routine>