Index: ossp-pkg/l2/TODO RCS File: /v/ossp/cvs/ossp-pkg/l2/TODO,v rcsdiff -q -kk '-r1.12' '-r1.13' -u '/v/ossp/cvs/ossp-pkg/l2/TODO,v' 2>/dev/null --- TODO 2001/09/02 15:32:21 1.12 +++ TODO 2001/09/03 12:16:44 1.13 @@ -2,6 +2,8 @@ OSSP L2 ======= +Improvement: return L2_ERR_XXX instead of just a single L2_ERROR + Idea: l2_handler_t: - function pointers Index: ossp-pkg/l2/l2-config.1 RCS File: /v/ossp/cvs/ossp-pkg/l2/Attic/l2-config.1,v rcsdiff -q -kk '-r1.2' '-r1.3' -u '/v/ossp/cvs/ossp-pkg/l2/Attic/l2-config.1,v' 2>/dev/null --- l2-config.1 2001/05/11 19:50:52 1.2 +++ l2-config.1 2001/09/03 12:16:44 1.3 @@ -1,9 +1,12 @@ -.\" Automatically generated by Pod::Man version 1.02 -.\" Fri May 11 21:45:25 2001 -.\" -.\" Standard preamble: -.\" ====================================================================== -.de Sh \" Subsection heading +.rn '' }` +''' $RCSfile$$Revision$$Date$ +''' +''' $Log$ +''' Revision 1.3 2001/09/03 12:16:44 rse +''' revamped L2 stream API +''' +''' +.de Sh .br .if t .Sp .ne 5 @@ -11,106 +14,150 @@ \fB\\$1\fR .PP .. -.de Sp \" Vertical space (when we can't use .PP) +.de Sp .if t .sp .5v .if n .sp .. -.de Ip \" List item +.de Ip .br .ie \\n(.$>=3 .ne \\$3 .el .ne 3 .IP "\\$1" \\$2 .. -.de Vb \" Begin verbatim text +.de Vb .ft CW .nf .ne \\$1 .. -.de Ve \" End verbatim text +.de Ve .ft R .fi .. -.\" Set up some character translations and predefined strings. \*(-- will -.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. | will give a -.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used -.\" to do unbreakable dashes and therefore won't be available. \*(C` and -.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' .tr \(*W-|\(bv\*(Tr -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" -. ds C` ` -. ds C' ' +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' 'br\} .el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p 'br\} -.\" -.\" If the F register is turned on, we'll generate index entries on stderr -.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and -.\" index entries marked with X<> in POD. Of course, you'll have to process -.\" the output yourself in some meaningful fashion. -.if \nF \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" -. . -. nr % 0 -. rr F -.\} -.\" -.\" For nroff, turn off justification. Always turn off hyphenation; it -.\" makes way too many mistakes in technical documents. -.hy 0 +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH L2-CONFIG 1 "08-May-2001" "L2 0.1.0" "Logging Library" +.UC +.if n .hy 0 .if n .na -.\" -.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). -.\" Fear. Run. Save yourself. No user-serviceable parts. +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions .bd B 3 -. \" fudge factors for nroff and troff +. \" fudge factors for nroff and troff .if n \{\ -. ds #H 0 -. ds #V .8m -. ds #F .3m -. ds #[ \f1 -. ds #] \fP +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP .\} .if t \{\ -. ds #H ((1u-(\\\\n(.fu%2u))*.13m) -. ds #V .6m -. ds #F 0 -. ds #[ \& -. ds #] \& +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& .\} -. \" simple accents for nroff and troff +. \" simple accents for nroff and troff .if n \{\ -. ds ' \& -. ds ` \& -. ds ^ \& -. ds , \& -. ds ~ ~ -. ds / +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q .\} .if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" -. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' -. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' -. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' -. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' -. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' .\} -. \" troff and (daisy-wheel) nroff accents +. \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' @@ -118,116 +165,100 @@ .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E -. \" corrections for vroff +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' -. \" for low resolution devices (crt and lpr) +. \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ -. ds : e -. ds 8 ss -. ds o a -. ds d- d\h'-1'\(ga -. ds D- D\h'-1'\(hy -. ds th \o'bp' -. ds Th \o'LP' -. ds ae ae -. ds Ae AE +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE .\} .rm #[ #] #H #V #F C -.\" ====================================================================== -.\" -.IX Title "L2-CONFIG 1" -.TH L2-CONFIG 1 "08-May-2001" "L2 0.1.0" "Logging Library" -.UC .SH "NAME" -\&\fBl2\-config\fR \- L2 library build utility +\fBl2-config\fR \- L2 library build utility .SH "VERSION" -.IX Header "VERSION" -\&\s-1OSSP\s0 L2 0.1.0 (08-May-2001) +OSSP L2 0.1.0 (08-May-2001) .SH "SYNOPSIS" -.IX Header "SYNOPSIS" -\&\fBl2\-config\fR -[\fB\*(--help\fR] -[\fB\*(--version\fR] -[\fB\*(--all\fR] -[\fB\*(--prefix\fR] -[\fB\*(--exec-prefix\fR] -[\fB\*(--bindir\fR] -[\fB\*(--libdir\fR] -[\fB\*(--includedir\fR] -[\fB\*(--mandir\fR] -[\fB\*(--datadir\fR] -[\fB\*(--acdir\fR] -[\fB\*(--cflags\fR] -[\fB\*(--ldflags\fR] -[\fB\*(--libs\fR] -[\fB\*(--libs++\fR] +\fBl2-config\fR +[\fB--help\fR] +[\fB--version\fR] +[\fB--all\fR] +[\fB--prefix\fR] +[\fB--exec-prefix\fR] +[\fB--bindir\fR] +[\fB--libdir\fR] +[\fB--includedir\fR] +[\fB--mandir\fR] +[\fB--datadir\fR] +[\fB--acdir\fR] +[\fB--cflags\fR] +[\fB--ldflags\fR] +[\fB--libs\fR] +[\fB--libs++\fR] .SH "DESCRIPTION" -.IX Header "DESCRIPTION" -The \fBl2\-config\fR program is a little helper utility for easy configuring and +The \fBl2-config\fR program is a little helper utility for easy configuring and building applications based on the \fIl2\fR\|(3) library. It can be used to query the C compiler and linker flags which are required to correctly compile and link the application against the \fIl2\fR\|(3) library. .SH "OPTIONS" -.IX Header "OPTIONS" -\&\fBl2\-config\fR accepts the following options: -.Ip "\fB\*(--help\fR" 4 -.IX Item "help" +\fBl2-config\fR accepts the following options: +.Ip "\fB--help\fR" 4 Prints the short usage information. -.Ip "\fB\*(--version\fR" 4 -.IX Item "version" +.Ip "\fB--version\fR" 4 Prints the version number and date of the installed \fIl2\fR\|(3) library. -.Ip "\fB\*(--all\fR" 4 -.IX Item "all" +.Ip "\fB--all\fR" 4 Forces the output of all flags, that is, including extra flags which are not -\&\fBL2\fR specific. -.Ip "\fB\*(--prefix\fR" 4 -.IX Item "prefix" +\fBL2\fR specific. +.Ip "\fB--prefix\fR" 4 Prints the installation prefix of architecture independent files -.Ip "\fB\*(--exec-prefix\fR" 4 -.IX Item "exec-prefix" +.Ip "\fB--exec-prefix\fR" 4 Prints the installation prefix of architecture dependent files. -.Ip "\fB\*(--bindir\fR" 4 -.IX Item "bindir" +.Ip "\fB--bindir\fR" 4 Prints the installation directory of binaries. -.Ip "\fB\*(--libdir\fR" 4 -.IX Item "libdir" +.Ip "\fB--libdir\fR" 4 Prints the installation directory of libraries. -.Ip "\fB\*(--includedir\fR" 4 -.IX Item "includedir" +.Ip "\fB--includedir\fR" 4 Prints the installation directory of include headers. -.Ip "\fB\*(--mandir\fR" 4 -.IX Item "mandir" +.Ip "\fB--mandir\fR" 4 Prints the installation directory of manual pages. -.Ip "\fB\*(--datadir\fR" 4 -.IX Item "datadir" +.Ip "\fB--datadir\fR" 4 Prints the installation directory of shared data. -.Ip "\fB\*(--acdir\fR" 4 -.IX Item "acdir" +.Ip "\fB--acdir\fR" 4 Prints the installation directory of \fBautoconf\fR data. -.Ip "\fB\*(--cflags\fR" 4 -.IX Item "cflags" +.Ip "\fB--cflags\fR" 4 Prints the C compiler flags which are needed to compile the \fIl2\fR\|(3)\-based -application. The output is usually added to the \f(CW\*(C`CFLAGS\*(C'\fR variable of the -applications \f(CW\*(C`Makefile\*(C'\fR. -.Ip "\fB\*(--ldflags\fR" 4 -.IX Item "ldflags" -Prints the linker flags (\f(CW\*(C`\-L\*(C'\fR) which are needed to link the application with -the \fIl2\fR\|(3) library. The output is usually added to the \f(CW\*(C`LDFLAGS\*(C'\fR variable of -the applications \f(CW\*(C`Makefile\*(C'\fR. -.Ip "\fB\*(--libs\fR" 4 -.IX Item "libs" -Prints the library flags (\f(CW\*(C`\-l\*(C'\fR) which are needed to link the application with -the C \fIl2\fR\|(3) library. The output is usually added to the \f(CW\*(C`LIBS\*(C'\fR variable of the -applications \f(CW\*(C`Makefile\*(C'\fR. -.Ip "\fB\*(--libs++\fR" 4 -.IX Item "libs++" -Prints the library flags (\f(CW\*(C`\-l\*(C'\fR) which are needed to link the +application. The output is usually added to the \f(CWCFLAGS\fR variable of the +applications \f(CWMakefile\fR. +.Ip "\fB--ldflags\fR" 4 +Prints the linker flags (\f(CW-L\fR) which are needed to link the application with +the \fIl2\fR\|(3) library. The output is usually added to the \f(CWLDFLAGS\fR variable of +the applications \f(CWMakefile\fR. +.Ip "\fB--libs\fR" 4 +Prints the library flags (\f(CW-l\fR) which are needed to link the application with +the C \fIl2\fR\|(3) library. The output is usually added to the \f(CWLIBS\fR variable of the +applications \f(CWMakefile\fR. +.Ip "\fB--libs++\fR" 4 +Prints the library flags (\f(CW-l\fR) which are needed to link the application with the \*(C+ \fIl2\fR\|(3) library. The output is usually added to -the \f(CW\*(C`LIBS\*(C'\fR variable of the applications \f(CW\*(C`Makefile\*(C'\fR. +the \f(CWLIBS\fR variable of the applications \f(CWMakefile\fR. .SH "EXAMPLE" -.IX Header "EXAMPLE" +.PP .Vb 4 \& CC = cc \& CFLAGS = -O `l2-config --cflags` @@ -242,12 +273,62 @@ \& $(CC) $(CFLAGS) -c foo.c .Ve .SH "SEE ALSO" -.IX Header "SEE ALSO" -\&\fIl2\fR\|(3), \fIcc\fR\|(1). +\fIl2\fR\|(3), \fIcc\fR\|(1). .SH "AUTHOR" -.IX Header "AUTHOR" +.PP .Vb 3 \& Ralf S. Engelschall \& rse@engelschall.com \& www.engelschall.com .Ve + +.rn }` '' +.IX Title "L2-CONFIG 1" +.IX Name "B - L2 library build utility" + +.IX Header "NAME" + +.IX Header "VERSION" + +.IX Header "SYNOPSIS" + +.IX Header "DESCRIPTION" + +.IX Header "OPTIONS" + +.IX Item "\fB--help\fR" + +.IX Item "\fB--version\fR" + +.IX Item "\fB--all\fR" + +.IX Item "\fB--prefix\fR" + +.IX Item "\fB--exec-prefix\fR" + +.IX Item "\fB--bindir\fR" + +.IX Item "\fB--libdir\fR" + +.IX Item "\fB--includedir\fR" + +.IX Item "\fB--mandir\fR" + +.IX Item "\fB--datadir\fR" + +.IX Item "\fB--acdir\fR" + +.IX Item "\fB--cflags\fR" + +.IX Item "\fB--ldflags\fR" + +.IX Item "\fB--libs\fR" + +.IX Item "\fB--libs++\fR" + +.IX Header "EXAMPLE" + +.IX Header "SEE ALSO" + +.IX Header "AUTHOR" + Index: ossp-pkg/l2/l2.h RCS File: /v/ossp/cvs/ossp-pkg/l2/Attic/l2.h,v rcsdiff -q -kk '-r1.10' '-r1.11' -u '/v/ossp/cvs/ossp-pkg/l2/Attic/l2.h,v' 2>/dev/null --- l2.h 2001/09/02 13:18:36 1.10 +++ l2.h 2001/09/03 12:16:44 1.11 @@ -165,12 +165,12 @@ /* stream operations */ l2_stream_t *l2_stream_create (void); -l2_stream_t *l2_stream_channel (l2_stream_t *st, l2_channel_t *ch, unsigned int levelmask); -l2_stream_t *l2_stream_formatter (l2_stream_t *st, l2_formatter_t *cb, l2_context_t *ctx); -unsigned int l2_stream_levels (l2_stream_t *st, unsigned int levelmask); -void l2_stream_log (l2_stream_t *st, unsigned int log_level, const char *fmt, ...); -void l2_stream_vlog (l2_stream_t *st, unsigned int log_level, const char *fmt, va_list ap); -void l2_stream_destroy (l2_stream_t *st); +l2_result_t l2_stream_channel (l2_stream_t *st, l2_channel_t *ch, unsigned int levelmask); +l2_result_t l2_stream_formatter (l2_stream_t *st, const char *name, l2_formatter_t cb, l2_context_t *ctx); +l2_result_t l2_stream_levels (l2_stream_t *st, unsigned int levelmask, unsigned int *levelmaskold); +l2_result_t l2_stream_log (l2_stream_t *st, unsigned int log_level, const char *fmt, ...); +l2_result_t l2_stream_vlog (l2_stream_t *st, unsigned int log_level, const char *fmt, va_list ap); +l2_result_t l2_stream_destroy (l2_stream_t *st); #endif /* __L2_H__ */ Index: ossp-pkg/l2/l2_p.h RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_p.h,v rcsdiff -q -kk '-r1.7' '-r1.8' -u '/v/ossp/cvs/ossp-pkg/l2/l2_p.h,v' 2>/dev/null --- l2_p.h 2001/09/02 13:18:36 1.7 +++ l2_p.h 2001/09/03 12:16:44 1.8 @@ -59,7 +59,7 @@ unsigned int levelmask; char message[L2_MAX_MSGSIZE]; l2_channel_t *channels[L2_MAX_CHANNELS]; - l2_format_t *formatters[L2_MAX_FORMATTERS]; + l2_format_t formatters[L2_MAX_FORMATTERS]; }; /* variable argument handling taking care on argument passing conventions */ Index: ossp-pkg/l2/l2_stream.c RCS File: /v/ossp/cvs/ossp-pkg/l2/Attic/l2_stream.c,v rcsdiff -q -kk '-r1.5' '-r1.6' -u '/v/ossp/cvs/ossp-pkg/l2/Attic/l2_stream.c,v' 2>/dev/null --- l2_stream.c 2001/08/15 10:36:03 1.5 +++ l2_stream.c 2001/09/03 12:16:44 1.6 @@ -34,64 +34,103 @@ l2_stream_t *l2_stream_create(void) { l2_stream_t *st; + int i; if ((st = (l2_stream_t *)malloc(sizeof(l2_stream_t))) == NULL) return NULL; - memset(st, 0, sizeof(l2_stream_t)); + st->levelmask = 0; + for (i = 0; i < L2_MAX_CHANNELS; i++) + st->channels[i] = NULL; + for (i = 0; i < L2_MAX_FORMATTERS; i++) + st->formatters[i].name = NULL; return st; } -l2_stream_t *l2_stream_channel(l2_stream_t *st, l2_channel_t *ch, unsigned int levelmask) +l2_result_t l2_stream_channel(l2_stream_t *st, l2_channel_t *ch, unsigned int levelmask) { - size_t i; + int i; - for (i = 0; i <= L2_MAX_CHANNELS && st->channels[i] != NULL; i++) + if (st == NULL || ch == NULL) + return L2_ERROR; + for (i = 0; i < L2_MAX_CHANNELS && st->channels[i] != NULL; i++) ; if (i == L2_MAX_CHANNELS) - return NULL; + return L2_ERROR; st->channels[i] = ch; - return st; + return L2_OK; } -l2_stream_t *l2_stream_formatter(l2_stream_t *st, l2_formatter_t *cb, l2_context_t *ctx) +l2_result_t l2_stream_formatter(l2_stream_t *st, const char *name, l2_formatter_t cb, l2_context_t *ctx) { - return NULL; + int i; + + if (st == NULL || name == NULL || cb != NULL) + return L2_ERROR; + for (i = 0; i < L2_MAX_FORMATTERS && st->formatters[i].name != NULL; i++) + ; + if (i == L2_MAX_FORMATTERS) + return L2_ERROR; + st->formatters[i].name = strdup(name); + st->formatters[i].context = ctx; + st->formatters[i].callback = cb; + return L2_OK; } -unsigned int l2_stream_levels(l2_stream_t *st, unsigned int levelmask) +l2_result_t l2_stream_levels(l2_stream_t *st, unsigned int levelmask, unsigned int *levelmaskold) { - return 0; + if (st == NULL) + return L2_ERROR; + if (levelmaskold != NULL) + *levelmaskold = st->levelmask; + st->levelmask = levelmask; + return L2_OK; } -void l2_stream_log(l2_stream_t *st, unsigned int log_level, const char *fmt, ...) +l2_result_t l2_stream_log(l2_stream_t *st, unsigned int log_level, const char *fmt, ...) { va_list ap; + l2_result_t rv; + + if (st == NULL || log_level == 0 || fmt == NULL) + return L2_ERROR; va_start(ap, fmt); - l2_stream_vlog(st, log_level, fmt, ap); + rv = l2_stream_vlog(st, log_level, fmt, ap); va_end(ap); - return; + return rv; } -void l2_stream_vlog(l2_stream_t *st, unsigned int log_level, const char *fmt, va_list ap) +l2_result_t l2_stream_vlog(l2_stream_t *st, unsigned int log_level, const char *fmt, va_list ap) { - size_t i, len; + int i; + size_t len; + l2_result_t rv; - len = vsnprintf(st->message, L2_MAX_MSGSIZE, fmt, ap); - for (i = 0; i <= L2_MAX_CHANNELS && st->channels[i] != NULL; i++) - st->channels[i]->handler.write(&st->channels[i]->context, - st->channels[i]->downstream, - st->message, len); - return; -} + if (st == NULL || log_level == 0 || fmt == NULL || ap == NULL) + return L2_ERROR; -void l2_stream_destroy(l2_stream_t *st) -{ - size_t i; + /* XXX use st->formatter!! XXX */ + len = vsnprintf(st->message, L2_MAX_MSGSIZE, fmt, ap); - for (i = 0; i <= L2_MAX_CHANNELS && st->channels[i] != NULL; i++) + rv = L2_OK; + for (i = 0; i < L2_MAX_CHANNELS && st->channels[i] != NULL; i++) { + /* XXX write only if st->levelmask contains log_level */ + if ((rv = l2_channel_write(st->channels[i], st->message, len)) != L2_OK) + break; + } + return rv; +} + +l2_result_t l2_stream_destroy(l2_stream_t *st) +{ + int i; + + if (st == NULL) + return L2_ERROR; + for (i = 0; i < L2_MAX_CHANNELS && st->channels[i] != NULL; i++) l2_channel_destroy(st->channels[i]); - for (i = 0; i <= L2_MAX_FORMATTERS && st->formatters[i] != NULL; i++) - free(st->formatters[i]); - return; + for (i = 0; i < L2_MAX_FORMATTERS && st->formatters[i].name != NULL; i++) + free(st->formatters[i].name); + free(st); + return L2_OK; }