MSGP(3)                    Library Functions Manual                    MSGP(3)



NAME
       msgp - printf() wrapper functions

SYNOPSIS
        void pf1-3(const char* fmt, ...);
        void npf1-3(const char* fmt, ...);
        void epf(const char* fmt, ...);
        void nepf(condt char* fmt, ...);
        void dpf(condt char* fmt, ...);
        void dbg(...);
        void idbg(...);
        void sbg(s0, s1, ...[,strsz], [, cmt] );

        struct MSGP_cmndata_tag {
            int rc;        // suc/err
            char  tostr[128];   // for tostring, "stderr, stdout ..."
            //..opaque data
        } typedef MSGP_t;

        MSGP_t pfset(FILE* p1, FILE* p2, FILE* p3, FILE* dg);
        MSGP_t pfget();
        FILE* pfgetfp(int idx); //pf1-3,dbg ==  MSGP_FP_PF1-3, MSGP_FP_DBG
        FILE* pfsetfp(int idx);
        MSGP_t pfpush(MSGP_t obj);




TL_DR
        #include "msgp.h"
        int main() {
            pf1("aa");     // automatically add '\n'
            npf2("bb");         // header 'n' no newline
            pf3("cc");
            dbg("dd");     // >> disp: aa, bb, cc, dd

            pfset(NULL,stderr,NULL,PF_NOCHANGE);    //>> pf1-3,dbg setting
            npf1("aa");
            pf2("bb");
            pf3("cc");
            dbg("dbg is", 123, "var");    // >>arg support int,dbl,ptr,char,str
            idbg(1, 10)    //same as dbg() but avoid str, SEGV longjmp()
            const char* s = "hello, world";
            sbg(s,s,s)     //near to dbg(), but check for str, avoid SEGV longjmp()

            MSGP_t old = pfset(stdout, stdout, stdout, stderr);    //>> dfl setting
            pf1("info: %s", old.tostr);
            epf("epf/nepf is always disp to stderr.");
            dpf("dpf() follows dbg() i/o setting, uses for -D_DBG etc");

            old = pfset(1,NULL,NULL,NULL);     //bad fp, old.rc != 0
            puts(old.tostr);    // no change if err

            return 0;
        }
        // ~$ gcc src.c msgp.c


PARAM
       fmt    printf fmt

       p1-dg  NULL(noout)/PF_NOCHANGE/FILE*

       obj    output  setting  rtns  before  setting  obj.  use it to restore.
              obj.tostr holds state msgstr. obj.rc holds  api  action  result,
              suc/fail== 0/not0. pfset() is canceled if obj.rc != 0.

RETURN
       pfset()/pfpush()  rtns  before  setting.  pfget() rtns current setting.
       dbg() rtns some int val.

DETAILS
       dbg() is printf debug helper. not need args type(int, char* etc).

       eg)  dbg(12,num,s,"cmt",1.11);
        >>>
       DBG: src.c 7: main(): cnt:1 pid:17477 arg:(12,num,s,"comment",1.11)
       12 = i:12 / d:-1.72631 / p:0xc / c:\014 '\f' / s:(mem_err)
       num = i:678 / d:-1.72631 / p:0x2a6 / c:\246 '?' / s:(mem_err)
       s = i:4636870 / d:-1.72631 / p:0x46c0c6 / c:\306 '?' / s:abc
       "cmt" = i:4636911 / d:-1.72631 / p:0x46c0ef / c:\357 '?' / s:cmt
       1.11 = i:1546188227 / d:1.11 / p:0x5c28f5c3 / c:\303 '?' / s:(mem_err)

       the type of argument is not specified. guess type and convert.
       i/d/p/c/s == int/dbl/ptr/char/str
       dbg() are stricted output size. max 1024 byte(1024 char) at once.
       dbg() supports variable args. allows at least 1-9 args.
       dbg() uses SIGSEGV/longjmp. it may cause some troubles if your pg  uses
       signals.


NOTES
       -

CONFORMING_TO
       POSIX.1-2001+ (-D_XOPEN_SOURCE=600/_POSIX_C_SOURCE=200112L)

COPYRIGHT
       Copyright 2017 Momi-g, GPLv3+

VERSION
       2022-07-12 v1.3.9 (2017-XX-XX v1.0.0)

SEE_ALSO
       -



                                                                       MSGP(3)
