Re: Stavový automat, goto

Miroslav Mraz mrazik na volny.cz
Pátek Leden 27 18:34:44 CET 2023


Já ano - a nestydím se za to, byl k tomu důvod. V bare metal si některé 
věci musíte napsat sami, příp. opsat to odjinud. Pokud chcete aby vám 
překladač kontroloval formátovací řetězec, lze deklarovat např. printf 
takto (gcc i clang, C/C++):
extern int printf (const char *__restrict fmt, 
...)__attribute__((__format__(__printf__, 1, 2)));

Pak ovšem nastane problém, pokud máte naivní implementaci tt. funkce, 
pokud je parametr typu size_t nebo long, kontrole chybí modifikátor z 
nebo l ve formátovacím řetězci. Na 32 bitové architektuře to zpravidla 
nevadí, protože sizeof(int) == sizeof(long) == sizeof(size_t).

Takže stačí doplnit naivní implementaci vsnprintf asi takto:

       // Parse type
type_spec:
       switch (*pFormat) {
         case 'z':           // modifikatory z,l jsou zbytečné - sizeof 
long a int jsou stejne
         case 'l':
           pFormat++;
           goto type_spec;
// tohle je už původní text - specifikace formátů
         case 'd':
         case 'i':
           num = PutSignedInt (pStr, fill, width, va_arg (ap, signed int));
           break;
         case 'u':
           num = PutUnsignedInt (pStr, fill, width, va_arg (ap, unsigned 
int));
           break;
  ... atd ...

Dávám to sem, někomu to může pomoci - na ARM to funguje. Goto je zde 
použito, protože je to nejjednodušší.

Mrazík

On 27. 01. 23 15:55, Jirka Mww wrote:
> ...
> Goto jsem v tomhle stoleti 
> snad jeste nepouzil.



Další informace o konferenci Hw-list