TIGCC version 0.94 beta 18
Le code actu de la source (exscuse, je l'ai mis en français et un peut amélioré):
#define NO_CALC_DETECT
#define NO_EXIT_SUPPORT
#define OPTIMIZE_ROM_CALLS
#define USE_TI89
//#define USE_TI92PLUS
//#define USE_V200
#define NO_AMS_CHECK
#include <stdio.h>
#include <string.h>
#include <statline.h>
#include <args.h>
#include <kbd.h>
#include <alloc.h>
#include <graph.h>
#include <vat.h>
char ProcessFile(char *File);
//char _strcmp(register const char *s1 asm("a0"),register const char *s2 asm("a1"));
//char *_strtok(register char *s asm("a0"));
//char *_strtoknext(void);
int labelnb,varnb;
char prgflags;
//4096
//24576
//28672
//32768
#define BUFFER_SIZE 4096
char *labels,*vars;
long labelssize,varssize,labelsindex,varsindex;
short error;
void _main(void)
{
FILE *f2;
char mainfile[19],outfile[18];
CESI argptr = top_estack;
LCD_BUFFER buf;
char *c;
char a;
labelssize = BUFFER_SIZE;
varssize = BUFFER_SIZE;
labelsindex = 0;
varsindex = 0;
labelnb = 0;
varnb = 0;
prgflags = 0;
error = 0;
FontSetSys(0);
if ((RemainingArgCnt(argptr) == 2) || (GetArgType(argptr) == STR_TAG))
{
mainfile[0]=0;
strcpy(mainfile+1, GetStrnArg(argptr));
if (GetArgType(argptr) == STR_TAG) {
strcpy(outfile,GetStrnArg(argptr));
goto goodargs;
}
}
ST_helpMsg("Syntaxe : autosymb (source, destination)")
return;
goodargs:
if ((labels = (char *)malloc(BUFFER_SIZE)) == NULL) {
ST_helpMsg("Plus de mémoire!")
return;
}
if ((vars = (char *)malloc(BUFFER_SIZE)) == NULL) {
ST_helpMsg("Plus de mémoire!")
free(labels);
return;
}
LCD_save(buf);
clrscr();
*labels = 0;
*vars = 0;
a = ProcessFile(mainfile+1);
if (a == 0) {
puts("Impossible de charger le fichier source!n")
goto end;
} else if (a == -1) {
puts("Plus de mémoiren")
error = 1;
goto end;
}
puts("Ecriture des informations symboliques...n")
if (!(f2 = fopen(outfile,"wt"))) {
puts("Impossible de créer le fichier de sortie!n")
error = 1;
goto end;
}
fputs("_db_lab:n_l0 ",f2);
fwrite(labels,1,labelsindex,f2);
fputs("dc.w 0n_db_var:n_v0 ", f2);
fwrite(vars,1,varsindex,f2);
fputs("dc.w 0n"
"_iv dc.w _db_var-_ivn"
"_il dc.w _db_lab-_iln"
" dc.b "dinf"", f2);
fclose(f2);
if (prgflags == 0) {
static char include1[] = " ;DB92_SYMBr "
"nop: NOPr "
" dc.w $6000,endsymb-nop-4r "
" dc.l 'DB92'r "
" dc.w 0,endsymb-nopr "
" include "";
static char include2[] = ""r "
"endsymb:r "
";END DB92_SYMBr r";
HANDLE hdl = SymFindPtr(mainfile+strlen(mainfile+1)+1,0)->handle;
unsigned int len = *(unsigned int *)(HeapDeref(hdl)) + 2;
unsigned int len2 = strlen(outfile) + sizeof(include1) + sizeof(include2) - 2;
if (!(HeapRealloc(hdl,len + len2))) {
puts("Impossible de changer la taille de la sourcen")
error = 1;
goto end;
}
void * ptr = HeapDeref(hdl);
*(unsigned int *)ptr = len + len2 - 2;
ptr +=4;
memmove(ptr + len2,ptr,len - 4);
c = include1;
while ((a = *c++)) *(char *)ptr++ = a;
c = outfile;
while ((a = *c++)) *(char *)ptr++ = a;
c = include2;
while ((a = *c++)) *(char *)ptr++ = a;
}
end:
free(labels);
free(vars);
puts("nAPPUYEZ SUR UN TOUCHE POUR QUITTER")
if (error) ngetchx();
LCD_restore(buf);
}
char ProcessFile(char * File)
{
FILE *f1;
int AlreadyRead;
char dummy[512],dummy2[512],dummy3[512], dummy4[512];
char *c,*s1,*s2;
int len;
char a;
f1 = fopen(File,"rt")
if (!f1)
{
printf("Fichier %s introuvablen",File);
error = 1;
return 0;
}
printf("Analyse fichier %s...n",File);
//Recherche des labels
do
{
c=fgets(dummy, 512, f1);
if (!c) break;
s1=strtok ( c, " n" );
if (s1 == NULL) continue;
if (!strcmp(s1, ";DB92_SYMB")) {
prgflags = 1;
do {
if (!fgets(dummy, 512, f1 )) break;
if (!strcmp(dummy, ";END DB92_SYMBn")) break;
} while (1);
continue;
}
if (s1[0]==';') continue;
s2=strtok ( NULL, " n" );
if(!cmpstri(s1, "include"))
{
if((*s2 == '"') || (*s2 == ''')) s2++;
s1=strtok ( s2, " n'"" );
if (ProcessFile(s1) == -1) return -1;
}
else
{
if (s1[strlen(s1)-1]==':')
{
if (s2) {
s2[3]=0;
if(!cmpstri(s2, "dc.") || !cmpstri(s2, "ds.")) continue; // pas un vrai label
}
s1[strlen(s1)-1]=0;
sprintf(dummy2,"dc.w %s-_l%dr "
"_l%d dc.w _l%d-_l%dr "
" dc.b "%s"r "
" evenr "
"_l%d ",s1,labelnb,labelnb+1,labelnb+2,labelnb+1,s1,labelnb+2);
labelnb+=2;
len = strlen(dummy2);
if ((labelsindex + len > labelssize))
{
if ((labels = (char *)realloc(labels,labelssize += BUFFER_SIZE)) == NULL) return -1;
}
strcpy(labelsindex+labels,dummy2);
labelsindex += len;
continue;
}
}
} while (1);
rewind(f1);
//Recherche des variables
AlreadyRead = 0;
do
{
if(!AlreadyRead) c=fgets ( dummy, 512, f1 );
else {
c = strcpy(dummy, dummy4);
AlreadyRead = 0;
}
if (!c) break;
s1=strtok ( c, " n" );
if (!s1) continue;
if (!strcmp(s1, ";DB92_SYMB")) {
do {
if (!fgets(dummy, 512, f1 )) break;
if (!strcmp(dummy, ";END DB92_SYMBn")) break;
} while (1);
continue;
}
if (s1[0]==';') continue;
s2=strtok ( NULL, " " );
//AlreadyRead = 0;
if(s2 == NULL) {
c = fgets(dummy3, 512,f1);
if (!c) break;
strcpy(dummy4, dummy3);
s2=strtok ( c, " " );
AlreadyRead = 1;
}
else {
a = s2[3];
s2[3] = 0;
if (!cmpstri(s2, "dc.") || !cmpstri(s2,"ds.")) {
if (s1[strlen(s1)-1]==':') s1[strlen(s1)-1]='';
switch (a)
{
case 'b' :
case 'B' : a = '0';break;
case 'w' :
case 'W' : a = '1';break;
case 'l' :
case 'L' : a = '2';break;
default : continue;
}
sprintf(dummy2,"dc.w %s-_v%dr "
"_v%d dc.w _v%d-_v%dr "
" dc.b %c,"%s"r "
" evenr "
"_v%d ",s1,varnb,varnb+1,varnb+2,varnb+1,a,s1,varnb+2);
varnb+=2;
len = strlen(dummy2);
if (varsindex + len > varssize)
{
if ((vars = (char *)realloc(vars,varssize += BUFFER_SIZE)) == NULL) return -1;
}
strcpy(varsindex+vars,dummy2);
varsindex += len;
continue;
}
}
} while (1);
fclose(f1);
return 1;
}