amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > sprintf() problem auf MOS [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

03.10.2005, 21:43 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
ich habe mir einen Crosscompiler für MOS auf Linux installiert allerdings habe ich ein Problem mit der sprintf() funktion dass ich denke das die Standart include lib (Libnix) nicht so funktioniert wie Sie soll. Folgende Zeile:

code:
sprintf(Buffer,"%s.font", FontName);


Fontname enthält nur den Namen des Fonts ohne Erweiterung, natürlich müsste bei FontName="Topaz" in Buffer danach "Topaz.font" stehen, aber unter MOS steht nur Müll drinne.

Ich habe versuch es ohne Libnix zu compilieren, dann mekkert er aber dass er eine amigastubs.lib nicht finden kann, ich Allerdings auch nicht.

Natürlich kann ich das obige auch mit strncpy() und strncat() machen, das ist aber nicht der Sinn der Sache und sprintf() benutze ich noch anderswo.

Jemand einen Rat?

gruss

Darius

[ - Antworten - Zitieren - Direktlink - ]

03.10.2005, 23:44 Uhr

geit
Posts: 332
[Ex-Mitglied]

Da ich kein Freund von nicht eigenen Linkerdateien bin. ( Da ist man immer ausgeliefert und kann bei Fehlern nichts selbst beheben.)

Daher hier meine Variante:


#include <proto/exec.h>
#include <exec/types.h>

#include "SDI_misc.h"

/* This structure keeps our sprintf vars during RawDoFmt() */

struct SPrintfStream
{
char *Target;
ULONG TargetSize;
};

/********************************************************************* *****
SPrintf_DoChar
********************************************************************** ****/
PUTCHARPROTO( SPrintf_DoChar, char c, struct SPrintfStream *s )
{
*(s->Target++) = c;
}

/********************************************************************* *****
SPrintf
********************************************************************** ****/
ULONG SPrintf(char *target, char *format, ULONG *args)
{
struct SPrintfStream s;

s.Target = target;

RawDoFmt( format, args, ENTRY( SPrintf_DoChar), &s);

return( s.Target - target);
}

Die Struktur wäre nicht nötig, aber ich hab 3 verschiedene Varianten der Routine, sowohl mit Längen als auch mit VarArgs und da ist das ganz praktisch. Ich hoffe das hilft weiter.


Geit

[ - Antworten - Zitieren - Direktlink - ]

04.10.2005, 11:32 Uhr

thomas
Posts: 7716
Nutzer
@DariusBrewka:

Also wenn man sprintf unter MorphOS benutzt (kompiliert), dann funktioniert es auch.

Naja, hier ist meine selbstgemachte Variante:

code:
#include <proto/exec.h>
#include <stdio.h>
#include <stdarg.h>

#if defined(__amigaos4__)

char type[] = "AmigaOS4";

VARARGS68K void Sprintf (char *buffer,char *format, ... )
{
va_list args;
va_startlinear (args, format);
RawDoFmt (format,va_getlinearva(args,void *),NULL,buffer);
}

#elif defined(__MORPHOS__)

char type[] = "MorphOS";

void Sprintf (char *buffer,char *format, ... ) __attribute__((varargs68k));

void Sprintf (char *buffer,char *format, ... )
{
va_list args;
va_start (args, format);
RawDoFmt (format,args->overflow_arg_area,NULL,buffer);
}

#else

char type[] = "68k";

void Sprintf (char *buffer,char *format,...)
{
static ULONG putchproc[] = {0x16c04e75};
RawDoFmt (format,(&format) + 1,(APTR)putchproc,buffer);
}

#endif


int main (void)

{
char buffer[100];

printf ("type = %s\n",type);

sprintf (buffer,"%ld %ld %ld %ld",1,2,3,4);
printf ("clib = %s\n",buffer);

Sprintf (buffer,"%ld %ld %ld %ld",1,2,3,4);
printf ("exec = %s\n",buffer);

return (0);
}


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

04.10.2005, 12:36 Uhr

gni
Posts: 1106
Nutzer
Zitat:
thomas:
code:
#if defined(__amigaos4__)
char type[] = "AmigaOS4";
VARARGS68K void Sprintf (char *buffer,char *format, ... )
{
va_list args;
va_startlinear (args, format);
RawDoFmt (format,va_getlinearva(args,void *),NULL,buffer);
}


va_end fehlt...
Zitat:
code:
#elif defined(__MORPHOS__)
char type[] = "MorphOS";
void Sprintf (char *buffer,char *format, ... ) __attribute__((varargs68k));
void Sprintf (char *buffer,char *format, ... )
{
va_list args;
va_start (args, format);
RawDoFmt (format,args->overflow_arg_area,NULL,buffer);
}


Ditto.
Zitat:
code:
#else
char type[] = "68k";
void Sprintf (char *buffer,char *format,...)
{
static ULONG putchproc[] = {0x16c04e75};
RawDoFmt (format,(&format) + 1,(APTR)putchproc,buffer);
}
#endif


Das funktioniert mit GCC 3.4+ nicht mehr, wenn die Implementation von sprintf() sich in der selben Translation-Unit befindet wie die Nutzer der Funktion. Deshalb sollte man auch hier stdarg.h benutzen.

Zudem sollte man einen Wrapperheader benutzen, der die unterschiedlichen Vorgehensweisen versteckt, zb. SDI_stdarg.h. Dann wirds zum einen lesbarer und zum anderen kommt man dann mit *einer* Funktion aus.

[ - Antworten - Zitieren - Direktlink - ]

04.10.2005, 23:56 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hmm ist alles schön und gut lieber wäre mir jedoch eine Funktionierende standard library, wer weiss was da noch kaputt ist :-(, ich werde es dennoch ersteinmal mit einem der gegebenen Konstrukte verwenden und bedanke mich dafür.

gruss

[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 01:32 Uhr

tokai
Posts: 1071
Nutzer
Da ist nichts kaputt, die frage ist vielmehr was du falsch machst. Ich hatte noch nie Probleme mit sprintf(), egal mit welcher libnix version. Vielleicht ist etwas mit deinem Compilersetup falsch?

regards,
tokai
--
http://www.christianrosentreter.com ~ MorphOS Software

[ Dieser Beitrag wurde von tokai am 05.10.2005 um 01:33 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 01:43 Uhr

tokai
Posts: 1071
Nutzer
code:
dev:tests> type sprintf.c

#include <exec/types.h>

#include <proto/exec.h>
#include <proto/dos.h>

#include <string.h>
#include <stdio.h>

int main(void)
{
    STRPTR FontName = "topaz";
    UBYTE buffer[64];

    /*   stdc lib style
     */
    sprintf(buffer, "%s.font\n", FontName);
    printf(buffer);

    /*   morphos style
     */
    (void)NewRawDoFmt("%s.font\n", NULL, buffer, FontName);
    Printf(buffer);

    return 0;
}

dev:tests> gcc -W -Wall sprintf.c -o sprintf
dev:tests> sprintf
topaz.font
topaz.font
dev:tests>

--
http://www.christianrosentreter.com ~ MorphOS Software

[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 09:13 Uhr

gni
Posts: 1106
Nutzer
Zitat:
tokai:
Ich hatte noch nie Probleme mit sprintf(), egal mit welcher libnix version.

Er versucht ja gerade _ohne_ libnix auszukommen. Die amiga.lib für AmigaOS/68k enthält eben auch ein sprintf(), das RawDoFmt() benutzt und sowas will er anscheinend unter MOS benutzen. Wenn es soetwas gibt, in welcher Bibliothek?
Zitat:
Vielleicht ist etwas mit deinem Compilersetup falsch?
Er schrieb was von "amigastubs" nicht gefunden. Gehört sowas zu MOS?

[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 10:00 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Naja ich würde schon lieber mit den Dateien arbeiten, welche zu MOS gehören, da ich diese ja auch unter AOS3.x, AOS4, AROS benutze eine Extrawurst für MOS möchte ich nicht machen, ggf. könnte ja mein Compilersetup falsch sein

(http://www.lysator.liu.se/~lcs/files/gg-cross/)


aber anders funktioniert es halt nicht, wenn man keinen Päg hat und da ist sprintf() bei mir nicht OK wenn es selbst an dieser simplen Zeile scheitert, bis zu dieser Zeile läuft Alles einwandfrei.

Wie gesagt ohne Libnix wäre es auch OK, ist dann halt länger?, aber da habe ich die amigastubs.lib nicht und die gibt's soweit ich es herausgefunden habe nur auf einem älterem MOS-SDK, man kann's also vergessen.

[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 10:05 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
dev:tests> gcc -W -Wall sprintf.c -o sprintf

mag ja sein, dass es so funktioniert bei mir jedenfalls nicht (amigastubs) und so wird ja auch nicht Libnix verwendet bzw. muss man da nicht -noixemul und den Ganzen libnix Krempel eintragen?


[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 11:00 Uhr

tokai
Posts: 1071
Nutzer
@DariusBrewka:

hast recht, hatte doch glatt den noixemul switch vergessen, das ändert aber nichts an der Tatsache, dass es einfach so funktioniert:

code:
dev:tests> gcc -W -Wall -noixemul sprintf.c -o sprintf
dev:tests> sprintf
topaz.font
topaz.font
dev:tests>


Ich empfehle Dir, dein Setup entsprechend zu aktualisieren. Anstatt der amigastubs kannst du die aboxstubs verwenden (diese enthalten aber an sich nur die #?Tags versionen diverser #?TagList funktionen). Für libamiga nimmst du libabox. Am besten schaust du mal in das Compiler Specs file vom MorphOS SDK wie es dort gelöst ist und vergleichst mit deinem Setup.

notfalls könnte sowas wie:

-L/gg/ppc-morphos/lib -lc -labox -laboxstubs

funktionieren.

Alternativ einfach eine Mail an Martin schreiben, dass er das X-development kit entsprechend aktualisiert, das scheint wohl noch auf dem MorphOS 0.4 SDK zu basieren. Obwohl wir keine grösseren Probleme hatten es für das Crosskompilieren von OpenTTD auf einer 64bit-Linux maschine zu installieren (dort gabe es auch nur das Problem mit libamiga <-> libabox). sprintf() machte keine Probleme (und wird in OpenTTD auch verwendet).

code:
dev:openttd/trunk> grep -r "sprintf" * | wc -l
     97




Und NewRawDoFmt() ist eine exec funktion, siehe clib/exec_protos.h.

regards,
tokai
--
http://www.christianrosentreter.com ~ MorphOS Software

[ - Antworten - Zitieren - Direktlink - ]

05.10.2005, 11:08 Uhr

tokai
Posts: 1071
Nutzer
@gni:

Zitat:
Er versucht ja gerade _ohne_ libnix auszukommen. Die amiga.lib für AmigaOS/68k enthält eben auch ein sprintf(), das RawDoFmt() benutzt und sowas will er anscheinend unter MOS benutzen. Wenn es soetwas gibt, in welcher Bibliothek?

Wieso verzichten? Wenn man die Library-Funktionen (RawDoFmt() bzw. NewRawDoFmt(), siehe mein Beispiel) nicht nutzen will, sollte man doch ruhig auf die Standard funktionen vertrauen. Sofern diese I/O-less sind, sehe ich da generell keine Probleme. Wobei ich es persönlich vorziehe, Amiga/MorphOS-API nicht mit std-API zu vermischen ;) Aber jeder macht das so, wie er will: solange es sauber funktioniert ist es legitim.

regards,
tokai
--
http://www.christianrosentreter.com ~ MorphOS Software

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > sprintf() problem auf MOS [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.