HTP2BAS konverter

44 views
Skip to first unread message

PLaci

unread,
Feb 24, 2008, 6:06:11 AM2/24/08
to Homelab/Aircomp levlista
Sziasztok!

Írtam egy Htp fájlból Basic listát készítő programot, amit htp2bas.zip
néven feltettem a fájlok közé. Benne van a program C forrása és a
futtatható állomány Linux és Windows alá, GCC 4.1-gyel, illetve Pelle
C 4.00-val lefordítva. Csak meg kell neki adni a konvertálandó fájlt/
fájlokat, és máris listázza azokat a standard kimenetre, ami át is
irányítható. A többlapos programok valamennyi lapját kilistázza.
Ismeri a Homelab 4 valamennyi kulcsszavát, és az ékezetes betűket az
1250-es kódlapra konvertálja (Windows magyar "szabvány").

PLaci

László Princz

unread,
Aug 13, 2023, 10:01:56 AM8/13/23
to Homelab/Aircomp levlista
Szia!
Nem tudom, elérhetőek-e még a fájlok valahol, én egyelőre nem találtam meg a htp2bas.zip fájlt.
Tudsz róla, hogy jelenleg hol elérhetőek, vagy elérhetővé tudod újra tenni?
Előre is köszi:
Laci

Attila

unread,
Aug 13, 2023, 10:05:20 AM8/13/23
to Homelab/Aircomp levlista
Sziasztok,

anno szerencsére learchiváltam a csoport file-jait amikor a Google megszüntette a tárhelyet. Mivel sima C kód, bemásolom ide szövegként.

üdv
Attila

Forrás:

#include <stdio.h>

#define STDERR stderr
#define peekw(a) (*(unsigned short *)(a))
#define hl_addr(a) (mem+a-0x4016)
#define wrap_pos 71

int wrap;

void wprintf(char *s,int v)
{
wrap++;
printf(s,v);
switch (s[0])
{
case ' ':
dowrap:
if (wrap>wrap_pos) wrap=0,printf("\n");
 return;
case '<':
if (s[1]=='%') {wrap++; goto countdigits;}
break;
case '%':
if (s[1]=='u') {
wrap+=2;
countdigits:
while (v>9) wrap++,v/=10;
goto dowrap;
}
else if (s[1]=='c' && (v==32 || v==44 || v==58)) goto dowrap;
}
}

int main(int argc,char **argv)
{
char tokens[]="Ţ«­ŞŻľĽ˝PéReíCňHíInkeůanäoňcuňDiíEnäFoňGotďGosuâIćConôDatáLisôReaäNexôOîPokĺExôReturîSavĺtheîLoaäRestorĺsteđPođNe÷tďBeeđPrinôRuîMoînoôPloôCalěInpuôstr¤lft¤rgh¤chr¤mid¤inôasăleîabósgîcoópeeësqňrnäsiîtaîusňvaěatîpoinôexđlo獍ŤfrĺKeůNe÷ExôEsavĺEloaäMergĺVerifůEdiôRepeaôUntiěDeletĺGosubŁGotoŁReturîform$¨hex$¨dec¨min¨max¨fsw¨mod¨Prçfra¨string$¨Ą¤var¨round¨Ujra m{retezett t|mâNem folytathatţStack-hibáT|bb READ, mint DATÁ [rtelmetleîRossz adattipuóHivatkoz s neml{tez| sorrá0-val val~ oszt óNem {rtelmezhet| sz íTul kicsi a t ňTul nagy sz íTul hosszu sz|veçRossz t|mbindeřV ltoz~k t|r|lveˇˇ% %Č(%D%L%Ž%_\x22Q!Ř";
char accents[]="{é|ö}ü~ó\x7fá©íµúĽő˝ű@Á[É\\Ö]Ü_Ó\x95Ú\x9dŰ";
int i;
fprintf(stderr,"HTP2BAS: Homelab fájlból Basic listát készít.\nÍrta Papp László, 2008.\n\n");
if (argc==1) {fprintf(stderr,"Nem tudom mit konvertáljak, nem adta meg!\n"); return(1);}
for (i=1;i<argc;i++)
{
FILE *htp=fopen(argv[i],"rb");
unsigned char buf[65536];
unsigned char *b=buf,*mem,*endofprg,*s1,*s2;
int editnum=0;
if (htp) {
fprintf(STDERR,"%s\n",argv[i]);
fseek(htp,257,SEEK_CUR);
fread(buf,65536,1,htp);
while (*(b++));
if (peekw(b)!=0x4016) { fprintf(STDERR,"A programot nem Basic-ben írták!\n"); continue;}
mem=b+4;
if (*(hl_addr(0x404c))==0) fprintf(STDERR,"A program autostartos!\n");
s2=hl_addr(peekw(hl_addr(0x4045)));
s1=hl_addr(peekw(hl_addr(0x4030)));
s2=s2<mem?s1:s2; b=s1<s2?s1:s2;
if (b-mem>0x40a0-0x4016) fprintf(stderr,"A program beágyazott gépi kódú részt, vagy adatterületet tartalmaz!\n");
endofprg=hl_addr(peekw(hl_addr(0x4018)));
for (;b<endofprg;)
{
int remark=0,quoted=0,stringflag=0;
int linenum;
wrap=0;
if (*b==0x80) printf("\n%d. lap\n\n",++editnum),b++;
linenum=b[1]+(b[0]<<8); b+=2;
if (linenum<32767)
{
wprintf("%u  ",linenum);
while (1)
{
unsigned char *a=accents;
if (stringflag && (*b>='A'+31||*b<'A'))
wprintf("$",0),stringflag=0;
if (*b == 34) quoted^=1;
if (*b==96) {printf("\n"); b++; break;}
if (*b>127 && !remark && !quoted)
{
unsigned char *t=tokens;
int n=128;
while (*t && n<*b)
{
while (*(t++)<128);
n++;
}
if (*t==0) goto nottoken;
switch(*b)
{
case 0x8d ... 0xae:
case 0xc9 ... 0xd6:
wprintf(" ",0);
}
do {
wprintf("%c",*t & 0x7f);
} while (*(t++)<128);
switch(*b)
{
case 0x8d ... 0xae:
case 0xc9 ... 0xd6:
wprintf(" ",0);
break;
case 0xaf ... 0xc8:
wprintf("(",0);
}
}
else
{
nottoken:
if (!quoted && !remark && (*b>='a'&&*b<'a'+31))
(*b)^=0x20,stringflag=1;
while (*a && *a!=*b) a+=2;
if (*a) wprintf("%c",*(a+1));
else switch(*b)
{
case 1 ... 31:
if (!quoted) {
switch(*b)
{
case 1 ... 27:
wprintf("%c",'a'+*b-1);
case 31:
wprintf("(",0);
}
break;
}
case 127 ... 255:
case 0:
wprintf("<%d>",*b);
break;
default:
wprintf("%c",*b);
}
}
if (*b == 137) remark=1;
b++;
} // while(1)
}
else
{
if (linenum>32767) {fprintf(stderr,"A program hibás!\n"); return(2);}
while (*(b++)!=96);
}
} // for b<endofprg
printf("\n");
if (argc>2) printf("--------------------\n\n");
fclose(htp);
} // if htp
} // for argc
} // vége

László Princz

unread,
Aug 13, 2023, 2:09:50 PM8/13/23
to Homelab/Aircomp levlista
Köszönöm!
Kincsek vannak Nálad! :)

László Princz

unread,
Aug 13, 2023, 2:09:54 PM8/13/23
to Homelab/Aircomp levlista
A következő sorok nem torzultak az egyszerű szöveges bemásoláskor?:
char tokens[]="Ţ«­ŞŻľĽ˝PéReíCňHíInkeůanäoňcuňDiíEnäFoňGotďGosuâIćConôDatáLisôReaäNexôOîPokĺExôReturîSavĺtheîLoaäRestorĺsteđPođNe÷tďBeeđPrinôRuîMoînoôPloôCalěInpuôstr¤lft¤rgh¤chr¤mid¤inôasăleîabósgîcoópeeësqňrnäsiîtaîusňvaěatîpoinôexđlo獍ŤfrĺKeůNe÷ExôEsavĺEloaäMergĺVerifůEdiôRepeaôUntiěDeletĺGosubŁGotoŁReturîform$¨hex$¨dec¨min¨max¨fsw¨mod¨Prçfra¨string$¨Ą¤var¨round¨Ujra m{retezett t|mâNem folytathatţStack-hibáT|bb READ, mint DATÁ [rtelmetleîRossz adattipuóHivatkoz s neml{tez| sorrá0-val val~ oszt óNem {rtelmezhet| sz íTul kicsi a t ňTul nagy sz íTul hosszu sz|veçRossz t|mbindeřV ltoz~k t|r|lveˇˇ% %Č(%D%L%Ž%_\x22Q!Ř";
char accents[]="{é|ö}ü~ó\x7fá©íµúĽő˝ű@Á[É\\Ö]Ü_Ó\x95Ú\x9dŰ";

Attila a következőt írta (2023. augusztus 13., vasárnap, 16:05:20 UTC+2):

Attila

unread,
Aug 13, 2023, 2:14:07 PM8/13/23
to Homelab/Aircomp levlista
Teszek még egy próbát. AZ a helyzet, hogy inline van benne olyan 128 feletti ASCII kód, ami vszleg UNICODE-dá kódolódik. Jobb lett volna \000 oktálisban megadni a tokeneket.

Apropó nincs kedved feliratkozni? Egyesével kell jóváhagyogatnom a posztjaidat ;) Szerintem küldtem linket a feliratkozáshoz de ha mégsem kaptad volna meg, akkor szólj nyugodtan.

László Princz

unread,
Aug 13, 2023, 4:18:57 PM8/13/23
to Homelab/Aircomp levlista
Szívesen feliratkozom, de egyelőre nem találtam ilyen levelet, a spam-ban sem. Amúgy meg azt írja a levelek végén, hogy a linkkel le tudok iratkozni, tehát azt hittem, fel vagyok iratkozva. De ezek szerint nem. :(

Attila

unread,
Aug 17, 2023, 5:43:56 PM8/17/23
to Homelab/Aircomp levlista
Megvan a bibi: moderáltra voltál állítva valamiért sok más emberrel egyetemben, rejtély miért, de most beállítottam normálisra.

üdv
Attila

László Princz

unread,
Aug 19, 2023, 5:48:50 AM8/19/23
to Homelab/Aircomp levlista
Köszönöm! :)
(Ezek szerint ez az üzenet már automatiksan meg fog jelenni ... )
Reply all
Reply to author
Forward
0 new messages