typedef int (*rpnprocmkjcb_t)(int __mkjcb, rpnprocmkjval_t *, void *__userdata);
Funkce je volána z funkce rpnproc_makejob() z důvodů, které rozlišuje argument __mkjcb. Jakých tento argument nabývá hodnot a co znamenají popisuje následující tabulka.
Možností, co vrátit, tato funkce nemá mnoho:
typedef union
{
struct
{
rpnprocjobp_t jobp;
int size;
} memjob;
char linet[RPNPROC_LINE_SIZE];
} rpnprocmkjval_t;
Jak bylo uvedeno v popisu callback funkce rpnprocmkjcb_t pro různé typy rozlišení žádosti vrstvy "RPNPROC" jsou použity různé členy tohoto unionu:
typedef int (*rpnproclsjcb_t)(char __linetxt[], void *__userdata);
Voláním této funkce vrstva "RPNPROC" předá uživatelskému programu jednu řádku programu v textovém tvaru (viz popis funkce rpnproc_listjob()).
Návratové hodnoty jsou popsané zde.
typedef struct
{
int radix;
unsigned long delim;
rpnproclsjcb_t fncp;
void *userdata;
} rpnproclsjval_t;
Struktura sdružuje argumenty společné funkcím rpnproc_listjob() a rpnproc_listone(). Argumenty mají následující významy:
Název | Číselná soustava |
---|---|
RPNPROC_LIST_RADIX_SGN | desítková se znaménkem |
RPNPROC_LIST_RADIX_UNS | desítková bez znaménka |
RPNPROC_LIST_RADIX_HEX | šestnáctková |
RPNPROC_LIST_RADIX_OCT | osmičková |
Název argumentu | Význam (použití znaku) |
---|---|
n | znaky pro neexisující navěští |
a | oddělovač navěští od čísla řádku |
i | oddělovač instrukce od adresy |
p | oddělovač parametru od instrukce |
typedef int (*rpnprocexecb_t)(int __execb, rpnprocexeval_t *, void *__userdata);
Funkce je volána z funkce rpnproc_execute() z důvodů, které rozlišuje argument __execb. Jakých tento argument nabývá hodnot a co znamenají popisuje následující tabulka. (Kromě prvních dvou se jedná o chybová hlášení).
Název | Význam |
---|---|
RPNPROC_EXECB_TRACE | Pro ladění: k volání callback funkce dojde před provedením každé instrukce (viz argument __tracef pro funkci rpnproc_execute()). |
RPNPROC_EXECB_PSE | Pause: nejčastěji k zobrazení mezivýsledků (viz instrukce PSE). |
RPNPROC_EXECB_DIVBY0 | Dělění nulou. |
RPNPROC_EXECB_VARRNG | Číslo adresující proměnnou je mimo rozsah. |
RPNPROC_EXECB_LBLRNG | Číslo adresující návěští je mimo rozsah. |
RPNPROC_EXECB_LBLDUP | Duplicitní výskyt návěští. |
RPNPROC_EXECB_LBLNEX | Požadovaný skok na neexistující návěští. |
RPNPROC_EXECB_RTNOVF | Kapacita stacku pro návratové adresy vyčerpána. |
RPNPROC_EXECB_ILLTYPE | Neznýmý typ instrukce. |
Návratové hodnoty jsou popsané zde.
typedef struct
{
int lblidx;
unsigned lineno;
} rpnproctrace_t;
typedef struct
{
rpnproctrace_t tracev;
rpnprocjobp_t curjobp;
} rpnproctrcjob_t;
typedef struct
{
rpnprocvalue_t stackx;
rpnproctrcjob_t trcjobv;
} rpnprocexeval_t;
Tyto tři do sebe vnořené struktury obsahují členy, které poskytují následující informace:
Na řadě míst tohoto textu je popisován vznik programu pro RPN procesor použitím funkce rpnproc_makejob(). Není to však jediná cesta. Binární kód je možno zapsat přímo do "statického pole" tasku používajícího SW vrstvu RPNPROC. Každého samozřejmě okamžitě napadne námitka "Proč bych psal RPN kód rovnou do programu? To můžu napsat požadovaný postup/výpočet do svýho programu rovnou a na celej RPN procesor se vyfláknu, ne?!" S takovou námitkou lze pouze souhlasit, jiná cesta není. Přesto je tato možnost uživateli ponechána a přostředky pro to jsou v headeru rpnproc.h obsaženy.
K čemu to tedy opravdu je?
Uspokojivá odpověď se nachází skutečně obtížně. Přesto zde je příklad, který by mohl býti typickým:
Ukázka statického vytváření programu je zde.