Eigenmath/memory.c

292 lines
8.7 KiB
C

/****************************************************************/
/* */
/* Memory */
/* */
/* Description: Fonctions de manipulation de la memoire */
/* Auteur: LePhenixNoir */
/* Version: 3.0 */
/* Date: 11.06.2014 */
/* Fichier: memory.c - Code des fonctions */
/* */
/****************************************************************/
#ifndef __FXLIB_H__
#include "fxlib.h"
#endif
#ifndef _STDIO
#include <stdio.h>
#endif
#ifndef _STDLIB
#include <stdlib.h>
#endif
#ifndef _STRING
#include <string.h>
#endif
#include "memory.h"
int memory_errors = 0;
void memory_seterrors(int e)
{
memory_errors = (e!=0);
}
void memory_error(char *from, char *func, int val)
{
unsigned int key;
char info[20];
if(!memory_errors) return;
sprintf(info,"%d",val);
PopUpWin(6);
locate(4,2); Print((unsigned char *)"Memory ERROR !!");
locate(3,4); Print((unsigned char *)"FROM:");
locate(8,4); Print((unsigned char *)from);
locate(3,5); Print((unsigned char *)"FUNC:");
locate(8,5); Print((unsigned char *)func);
locate(3,6); Print((unsigned char *)"INFO:");
locate(8,6); Print((unsigned char *)info);
locate(3,7); Print((unsigned char *)"META:");
locate(8,7);
switch(val)
{
case 1: Print((unsigned char *)"NotEnoughRAM"); break;
case -1: Print((unsigned char *)"Nonexisting"); break;
case -5: Print((unsigned char *)"WrongDevice"); break;
case -8: Print((unsigned char *)"AccessDenied"); break;
case -14: Print((unsigned char *)"ReadOnly"); break;
case -31: Print((unsigned char *)"DeviceError"); break;
case -35: Print((unsigned char *)"NotEmpty"); break;
default: Print((unsigned char *)"Other"); break;
}
GetKey(&key);
}
FONTCHARACTER *memory_char2font(char *adresse)
{
FONTCHARACTER *adr;
int i;
adr = calloc((strlen(adresse)+1),sizeof(FONTCHARACTER));
for(i=0;i<strlen(adresse);i++) *(adr+i) = *(adresse+i);
return adr;
}
int memory_createfile(char *adresse, int size)
{
FONTCHARACTER *adr = memory_char2font(adresse);
int i = Bfile_CreateFile(adr,size);
if(i<0) memory_error("createfile()","CreateFile()",i);
free(adr);
return i;
}
int memory_createdir(char *adresse)
{
FONTCHARACTER *adr = memory_char2font(adresse);
int i = Bfile_CreateDirectory(adr);
if(i<0) memory_error("createdir()","CreateDir.()",i);
free(adr);
return 1;
}
int memory_openfile(char *adresse, int mode)
{
FONTCHARACTER *adr = memory_char2font(adresse);
int i = Bfile_OpenFile(adr,mode);
if(i<0) memory_error("openfile()","OpenFile()",i);
free(adr);
return i;
}
int memory_deletefile(char *adresse)
{
FONTCHARACTER *adr = memory_char2font(adresse);
int i = Bfile_DeleteFile(adr);
if(i<0) memory_error("deletefil.()","DeleteFil.()",i);
free(adr);
return i;
}
char **memory_alloc(int l)
{
char **p = calloc(l,sizeof(char *));
int i; for(i=0;i<l;i++) *(p+i) = calloc(20,1);
return p;
}
void memory_free(char **p, int l)
{
int i; for(i=0;i<l;i++) free(*(p+i));
free(p);
}
int memory_find(char *adresse, char **files, int max)
{
FONTCHARACTER *adr = memory_char2font(adresse);
FONTCHARACTER found[30];
FILE_INFO fileInfo;
int searchHandle,i=1,j,x;
if(x = Bfile_FindFirst(adr,&searchHandle,found,&fileInfo)) return 0;
for(j=0;j<14 && *(found+j);j++) *(*files+j) = *(found+j);
while(Bfile_FindNext(searchHandle,found,&fileInfo)==0 && i<max) {
for(j=0;j<14 && *(found+j);j++) *(*(files+i)+j) = *(found+j);
i++; }
Bfile_FindClose(searchHandle);
free(adr);
return i;
}
int memory_exists(char *adresse)
{
char *file[1];
int x;
*file = malloc(14); **file=0;
x = memory_find(adresse,file,1);
free(*file);
return x!=0;
}
void *memory_load(char *adresse)
{
FONTCHARACTER *adr = memory_char2font(adresse);
int handle, x, size;
void *p;
if((handle=Bfile_OpenFile(adr,_OPENMODE_READ))<0) { memory_error("load()","OpenFile()",handle); return NULL; }
size = Bfile_GetFileSize(handle)+1;
p = calloc(size,1);
if(!p) {
memory_error("load()","malloc()",1);
Bfile_CloseFile(handle); free(adr); return NULL; }
if((x=Bfile_ReadFile(handle,p,size,0))<0) {
memory_error("load()","ReadFile()",x);
Bfile_CloseFile(handle); free(adr); return NULL; }
Bfile_CloseFile(handle);
free(adr);
return p;
}
int memory_save(char *adresse, void *data, int l)
{
FONTCHARACTER *adr = memory_char2font(adresse);
int x=0, handle;
if(memory_exists(adresse)) x = Bfile_DeleteFile(adr);
if(x<0) { memory_error("save()","DeleteFile()",x); free(adr); return x; }
x = Bfile_CreateFile(adr,l+1);
if(x<0) { memory_error("save()","CreateFile()",x); free(adr); return x; }
handle = Bfile_OpenFile(adr,0x02);
if(handle<0) { memory_error("save()","OpenFile()",handle); free(adr); return handle; }
x = memory_writefile(handle,data,l);
if(x<0) { memory_error("save()","WriteFile()",x); free(adr); return x; }
memory_closefile(handle);
free(adr);
return 0;
}
int memory_user_select(char **files, int n, int extension, int exit)
{
const unsigned char icons[7][32] = {
{ 0x0,0x3c,0xf,0xc4,0xf0,0x4,0x80,0x4,0x80,0x2,0x80,0x2,0x40,0x2,0x40,0x2,0x40,0x2,0x40,0x2,0x40,0x1,0x40,0x1,0x20,0x1,0x20,0xf,0x23,0xf0,0x3c,0x0 },
{ 0x0,0x3c,0xf,0xc4,0xf0,0x4,0x80,0x74,0x87,0x82,0x98,0x2,0x40,0x2,0x40,0x3a,0x43,0xc2,0x5c,0x2,0x40,0x39,0x43,0xc1,0x2c,0x1,0x20,0xf,0x23,0xf0,0x3c,0x0 },
{ 0x0,0x3c,0xf,0xc4,0xf0,0x74,0x87,0x94,0xb8,0x12,0xa0,0xa,0x63,0x8a,0x52,0x8a,0x54,0x4a,0x54,0x66,0x54,0x25,0x48,0x1d,0x29,0xe1,0x2e,0xf,0x23,0xf0,0x3c,0x0 },
{ 0x0,0x3c,0xf,0xc4,0xf0,0x4,0x87,0xc4,0x88,0x22,0x8c,0x62,0x4b,0xa2,0x44,0x42,0x42,0x82,0x42,0x82,0x42,0x81,0x44,0x41,0x2f,0xe1,0x20,0xf,0x23,0xf0,0x3c,0x0 },
{ 0x0,0x3c,0xf,0xc4,0xf0,0x4,0x87,0xe4,0x88,0x12,0x88,0x12,0x48,0x12,0x47,0xe2,0x44,0x22,0x44,0x22,0x44,0x21,0x44,0x21,0x23,0xc1,0x20,0xf,0x23,0xf0,0x3c,0x0 },
{ 0x0,0x3c,0xf,0xc4,0xf0,0x4,0x80,0x64,0x87,0xb2,0x98,0x52,0x51,0xb2,0x57,0x52,0x51,0xd2,0x4b,0xa,0x48,0x19,0x49,0xe1,0x2e,0x1,0x20,0xf,0x23,0xf0,0x3c,0x0 },
{ 0x0,0x3c,0xf,0xc4,0xf0,0x4,0x80,0xe4,0x9c,0xa2,0x90,0xa2,0x58,0xe2,0x50,0x2,0x40,0x12,0x4a,0x2a,0x4a,0x39,0x4e,0x29,0x22,0x1,0x20,0xf,0x23,0xf0,0x3c,0x0 } };
char *exts[19] = { ".txt", ".c", ".h", ".cpp", ".hpp", ".bmp",".jpg",".png",".gif", ".sav", ".g1m",".g2m",".g1r",".g2r", ".g1e",".g2e",".g1a", ".hex",".bin" };
unsigned char indexs[19] = { 1,1,1,1,1, 2,2,2,2, 3, 4,4,4,4, 5,5,5, 6,6 };
unsigned char *icoind = malloc(n);
unsigned int key;
int i,j,k,t;
int p=0, offset=0;
if(!icoind) { memory_error("user_sele.()","malloc()",1); return -2; }
for(i=0;i<n;i++)
{
for(t=-1,j=0;*(*(files+i)+j);j++) if(*(*(files+i)+j) == '.') t = j;
icoind[i] = (t==-1?1:0);
for(k=0;k<19;k++)
if(!strcmp(*(files+i)+t,exts[k])) { icoind[i]=indexs[k]; break; }
if(!extension && t+1) *(*(files+i)+t) = 0;
}
while(1)
{
Bdisp_AllClr_VRAM();
for(t=0;t<(n>3?3:n);t++)
{
if(icoind[offset+i]!=255) for(i=0;i<32;i++) {
k = icons[icoind[offset+t]][i];
for(j=0;j<8;j++) {
if(k&1) Bdisp_SetPoint_VRAM(11-j+8*(i&1),20*t+4+(i>>1),1);
k >>= 1; } }
PrintXY(24,20*t+9,(const unsigned char *)*(files+offset+t),0);
}
Bdisp_DrawLineVRAM(2,20*p+3,2,20*p+20);
Bdisp_DrawLineVRAM(3,20*p+2,99,20*p+2);
Bdisp_DrawLineVRAM(3,20*p+21,99,20*p+21);
Bdisp_DrawLineVRAM(100,20*p+3,100,20*p+20);
if(offset>0) PrintXY(114,6,(const unsigned char *)"\346\234",0);
if(offset+3<n) PrintXY(114,51,(const unsigned char *)"\346\235",0);
while(1)
{
GetKey(&key);
if(key==30002 && exit) { free(icoind); return -1; }
if(key==30004) break;
if(key==30018 && (offset||p)) { if(p==2) p--; else if(offset) offset--; else p--; break; }
if(key==30023 && (offset+p+1<n)) { if(p==0) p++; else if(offset+3<n) offset++; else p++; break; }
}
if(key==30004) break;
}
free(icoind);
return offset+p;
}
void *memory_user_autoload(char *prefix, char *selector, int l, int extension, int exit)
{
char **files = memory_alloc(l);
char *adr = malloc(strlen(prefix)+strlen(selector)+1);
void *data;
int x;
sprintf(adr,"%s%s",prefix,selector);
x = memory_find(adr,files,l);
free(adr);
x = memory_user_select(files,x,extension,exit);
adr = malloc(strlen(prefix)+strlen(files[x])+1);
sprintf(adr,"%s%s",prefix,files[x]);
data = memory_load(adr);
free(adr);
memory_free(files,l);
return data;
}