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>