OSSP CVS Repository

ossp - Check-in [823]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 823
Date: 2001-Sep-03 14:16:44 (local)
2001-Sep-03 12:16:44 (UTC)
User:rse
Branch:
Comment: revamped L2 stream API
Tickets:
Inspections:
Files:
ossp-pkg/l2/TODO      1.12 -> 1.13     2 inserted, 0 deleted
ossp-pkg/l2/l2-config.1      1.2 -> 1.3     236 inserted, 158 deleted
ossp-pkg/l2/l2.h      1.10 -> 1.11     6 inserted, 6 deleted
ossp-pkg/l2/l2_p.h      1.7 -> 1.8     1 inserted, 1 deleted
ossp-pkg/l2/l2_stream.c      1.5 -> 1.6     68 inserted, 29 deleted

ossp-pkg/l2/TODO 1.12 -> 1.13

--- 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


ossp-pkg/l2/l2-config.1 1.2 -> 1.3

--- 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: l2-config.1,v $$Revision: 1.3 $$Date: 2001/09/03 12:16:44 $
+'''
+''' $Log: l2-config.1,v $
+''' 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-config> - 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"
+


ossp-pkg/l2/l2.h 1.10 -> 1.11

--- 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__ */
 


ossp-pkg/l2/l2_p.h 1.7 -> 1.8

--- 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 */


ossp-pkg/l2/l2_stream.c 1.5 -> 1.6

--- 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;
 }
 

CVSTrac 2.0.1