long tios(unsigned char *str) { unsigned char buff[20]; HANDLE handle; if(strcmp(str,"ok")==0) { strcpy(buff,"exact(ok)"); str=buff; } push_parse_text (str); handle = HS_popEStack (); if(handle==0) { printf("\nMemory err. in os()"); ngetchx(); exit(4); } NG_execute (handle, FALSE); if(handle) HeapFree (handle); switch(GetArgType(top_estack)) { case NEGINT_TAG: return -GetIntArg(top_estack); break; case POSINT_TAG: return GetIntArg(top_estack); break; case STR_TAG: return (long)GetStrnArg(top_estack); break; /* gtc ne compile pas les float case FLOAT_TAG: rsl((signed long)GetFloatArg (top_estack)); break;*/ //en supposant ci dessous que c'est un négatif (MINUS -) } return 0; } long isarchi(unsigned char *var_name) { SYM_ENTRY *SymPtr; SymPtr = DerefSym (SymFind (SYMSTR (var_name))); if (!SymPtr) { return (-1);} //si n'existe pas return (SymPtr->flags.bits.archived); } long archiv(unsigned char *var_name) { unsigned char buff[200],is_error; is_error=0; sprintf(buff,"archive %s",var_name); TRY tios(buff); ONERR is_error=1; ENDTRY if(is_error) {return 0;} //erreur tibasic en interne, (fichier n'existe pas ou autre) if(isarchi(var_name)) return 1; return 0; } long unarchiv(unsigned char *var_name) { unsigned char buff[200],is_error; is_error=0; sprintf(buff,"unarchiv %s",var_name); TRY tios(buff); ONERR is_error=1; ENDTRY if(is_error) {return 0;} //erreur tibasic en interne, (fichier n'existe pas ou autre) return 1; } HANDLE CreateFile2 (const char *FileName) //correspond à CreateFile() de newprog { HANDLE h; SYM_ENTRY *sym_entry; char str[30], *sptr = str; *sptr = 0; while ((*++sptr = *FileName++)); if (!(h = HeapAlloc (HeapMax()))) return H_NULL; //printf("\nheapmax=%ld",mem_allowed); ngetchx(); if (!(sym_entry = DerefSym (SymAdd (sptr)))) { HeapFree (h); return H_NULL; } *(long*) HeapDeref (sym_entry->handle = h) = 0x00010000; return h; } unsigned char AppendCharToFile2 (HANDLE h, unsigned char c) { char *base = HeapDeref(h); unsigned short len = *(unsigned short*)base; if (len > HeapSize(h)-10) { return 0;} *(unsigned short*)base = len + 1; base[len+1] = c; return 1; } unsigned char AppendBlockToFile2 (HANDLE h, void *addr, unsigned short len) { unsigned char rr; unsigned short i; rr=1; for (i = len; i; i--) {rr*=AppendCharToFile2 (h, *((char*)addr)++); /*printf("c=%c ",*(char*)addr);*/} return rr; } void AppendCharToFile (HANDLE h, unsigned char c) { char *base = HeapDeref(h); unsigned short len = *(unsigned short*)base; if (len > HeapSize(h) - 10) return; *(unsigned short*)base = len + 1; base[len+2] = c; } HANDLE CreateFile_with_specified_size (const char *FileName, unsigned int size) { HANDLE h; SYM_ENTRY *sym_entry; char str[30], *sptr = str; *sptr = 0; while ((*++sptr = *FileName++)); if(size>HeapMax ()) return H_NULL; if (!(h = HeapAlloc (size))) return H_NULL; if (!(sym_entry = DerefSym (SymAdd (sptr)))) { HeapFree (h); return H_NULL; } *(long*) HeapDeref (sym_entry->handle = h) = 0x00010000; return h; } void AppendBlockToFile (HANDLE h, void *addr, unsigned short len) { unsigned short i; for (i = len; i; i--) {AppendCharToFile (h, *((char*)addr)++); /*printf("c=%c ",*(char*)addr);*/} } void CloseFile_type (HANDLE h,int type) { //if(type==STR_TAG) AppendCharToFile (h,0); AppendCharToFile (h,type); if(h) HeapUnlock (h); if(h) HeapRealloc (h, *(unsigned short*)HeapDeref(h) + 3); } /* void CloseFile_type (HANDLE h,int type) { AppendCharToFile (h,type); if(h) HeapUnlock (h); if(h) HeapRealloc (h, *(unsigned short*)HeapDeref(h) + 3); } */ long toos_indir(unsigned char *dest_file,unsigned char *input_indir_str) { HANDLE handle; unsigned int len; if((len=(strlen(input_indir_str)+20))>6000) { printf("\nToos indir too long"); ngetchx(); exit(4); } handle=CreateFile_with_specified_size(dest_file,/*LCD_SIZE+100*/len); //taille max pour toos() qui est arbitraire mais qui devrait convenir dans la majorité des cas if(handle==H_NULL) { clrscr();printf("Memory Error in toos(indir)"); exit(4); } AppendCharToFile(handle,0); AppendBlockToFile (handle, input_indir_str, strlen(input_indir_str)+1); CloseFile_type (handle,STR_TAG); return (long)input_indir_str; } long toos(unsigned char *dest_file,long value) { unsigned char *p_eval,varn,*argptr_temp; unsigned int nbelem,ii,str_len_temp; HANDLE handle; ESI st_bot,st_temp,st_top; handle=CreateFile_with_specified_size(dest_file,/*LCD_SIZE+100*/30); //taille max pour toos() qui est arbitraire mais qui devrait convenir dans la majorité des cas if(handle==H_NULL) { printf("Memory error in toos"); ngetchx(); return 0; } st_bot=top_estack+1; push_longint (value); while(st_bot!=(top_estack+1)) { AppendCharToFile(handle,*st_bot); st_bot++; } delete_expression(top_estack); if(handle) HeapUnlock (handle); if(handle) HeapRealloc (handle, *(unsigned short*)HeapDeref(handle) + 3); return 1; } unsigned char *OpenFile_(unsigned char *FileName) { char *fptr, *cptr; unsigned char *filecontent; unsigned short plen; SYM_ENTRY *SymPtr; HANDLE h; SymPtr = DerefSym (SymFind (SYMSTR (FileName))); if (!SymPtr) {return 0;} h = SymPtr->handle; if (HeapGetLock (h)) { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } plen = *(short*)(cptr) + 3; if(!(filecontent=malloc(plen))) {printf("Memory error in fopen"); ngetchx();exit(2);} SymPtr = DerefSym (SymFind (SYMSTR (FileName))); if (!SymPtr) {return 0;} h = SymPtr->handle; if (HeapGetLock (h)) { cptr = fptr = HeapDeref (h); h = 0; } else { cptr = fptr = HLock (h); } memcpy(filecontent,fptr,plen); if (h) HeapUnlock (h); return filecontent; } unsigned char *f_fopen_(unsigned char *file_name) { unsigned char *f; f=OpenFile_(file_name); return f; } unsigned char f_fcreate_(unsigned char *blockptr, unsigned char *FileName) { unsigned char rr; HANDLE h; h=CreateFile_with_specified_size (FileName,(*(unsigned int*)(blockptr))+2+10); if(!h) { printf("\nMem error in fcreate"); ngetchx(); return 0; } rr=AppendBlockToFile2 (h, blockptr+2, (*(unsigned int*)(blockptr))); (*(unsigned int*)(HeapDeref(h)))--; HeapUnlock (h); HeapRealloc (h, *(unsigned short*)HeapDeref(h) + 3); return rr; } long osvar2_2(unsigned char *var_name) { unsigned char *fptr, *cptr,*lptr; long rval; SYM_ENTRY *SymPtr; HANDLE h;rval=0; SymPtr = DerefSym (SymFind (SYMSTR (var_name))); if (!SymPtr) { return 0;}; h = SymPtr->handle; lptr=HToESI (h); switch(*lptr) { case POSINT_TAG: rval=GetIntArg (lptr); return rval; break; case NEGINT_TAG: rval=(long)(-GetIntArg (lptr)); return rval; break ; case STR_TAG: rval=(long)(GetStrnArg (lptr)); return rval; break ; //case FLOAT_TAG: //return (signed long)(GetFloatArg(lptr)); break ; } } void print_ptr_execbas(unsigned char *argptr) { int i,dim; printf("\n"); dim=*(argptr+1)+(*(argptr))*256; for(i=0;iname,"0001")==0) SymPtr = SymFindNext (); strcpy (names + mu((counter-1),10), SymPtr->name); SymPtr = SymFindNext (); } strcpy (names + mu((counter),10), "0"); names=realloc(names, mu((counter+1),10)); *dest_var=names; return counter; } /* unsigned char *f_open_(unsigned char n) //narg=nbelem { unsigned char ii,*oth_str[10]; unsigned char *esq2,*oth_str[10]; esq2=all_esq_str_lists[n]; oth_str=all_oth_str_lists[n]; for(ii=0;ii<18;ii++) open_return[ii]=0; if(!HSYMtoName (VarOpen (esq2,oth_str), open_return)) rsl(0); return open_return; } */