[glibutil] Initial commit
This commit is contained in:
		
							
								
								
									
										15
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					*~
 | 
				
			||||||
 | 
					debian/files
 | 
				
			||||||
 | 
					debian/libglibutil-dev.debhelper.log
 | 
				
			||||||
 | 
					debian/libglibutil-dev.substvars
 | 
				
			||||||
 | 
					debian/libglibutil-dev
 | 
				
			||||||
 | 
					debian/libglibutil.debhelper.log
 | 
				
			||||||
 | 
					debian/libglibutil.postinst.debhelper
 | 
				
			||||||
 | 
					debian/libglibutil.postrm.debhelper
 | 
				
			||||||
 | 
					debian/libglibutil.substvars
 | 
				
			||||||
 | 
					debian/libglibutil
 | 
				
			||||||
 | 
					debian/tmp
 | 
				
			||||||
 | 
					documentation.list
 | 
				
			||||||
 | 
					installroot
 | 
				
			||||||
 | 
					build
 | 
				
			||||||
 | 
					RPMS
 | 
				
			||||||
							
								
								
									
										190
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,190 @@
 | 
				
			|||||||
 | 
					# -*- Mode: makefile-gmake -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: clean all debug release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Required packages
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKGS = glib-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Default target
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all: debug release pkgconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Library version
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VERSION_MAJOR = 1
 | 
				
			||||||
 | 
					VERSION_MINOR = 0
 | 
				
			||||||
 | 
					VERSION_RELEASE = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NAME = glibutil
 | 
				
			||||||
 | 
					LIB_NAME = lib$(NAME)
 | 
				
			||||||
 | 
					LIB_DEV_SYMLINK = $(LIB_NAME).so
 | 
				
			||||||
 | 
					LIB_SYMLINK1 = $(LIB_DEV_SYMLINK).$(VERSION_MAJOR)
 | 
				
			||||||
 | 
					LIB_SYMLINK2 = $(LIB_SYMLINK1).$(VERSION_MINOR)
 | 
				
			||||||
 | 
					LIB_SONAME = $(LIB_SYMLINK1)
 | 
				
			||||||
 | 
					LIB = $(LIB_SONAME).$(VERSION_MINOR).$(VERSION_RELEASE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Sources
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SRC = gutil_log.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Directories
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SRC_DIR = src
 | 
				
			||||||
 | 
					INCLUDE_DIR = include
 | 
				
			||||||
 | 
					BUILD_DIR = build
 | 
				
			||||||
 | 
					DEBUG_BUILD_DIR = $(BUILD_DIR)/debug
 | 
				
			||||||
 | 
					RELEASE_BUILD_DIR = $(BUILD_DIR)/release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Tools and flags
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CC = $(CROSS_COMPILE)gcc
 | 
				
			||||||
 | 
					LD = $(CC)
 | 
				
			||||||
 | 
					WARNINGS = -Wall
 | 
				
			||||||
 | 
					INCLUDES = -I$(INCLUDE_DIR)
 | 
				
			||||||
 | 
					BASE_FLAGS = -fPIC
 | 
				
			||||||
 | 
					FULL_CFLAGS = $(BASE_FLAGS) $(CFLAGS) $(DEFINES) $(WARNINGS) $(INCLUDES) \
 | 
				
			||||||
 | 
					  -MMD -MP $(shell pkg-config --cflags $(PKGS))
 | 
				
			||||||
 | 
					FULL_LDFLAGS = $(BASE_FLAGS) $(LDFLAGS) -shared -Wl,-soname,$(LIB_SONAME) \
 | 
				
			||||||
 | 
					  $(shell pkg-config --libs $(PKGS))
 | 
				
			||||||
 | 
					DEBUG_FLAGS = -g
 | 
				
			||||||
 | 
					RELEASE_FLAGS =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifndef KEEP_SYMBOLS
 | 
				
			||||||
 | 
					KEEP_SYMBOLS = 0
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(KEEP_SYMBOLS),0)
 | 
				
			||||||
 | 
					RELEASE_FLAGS += -g
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEBUG_LDFLAGS = $(FULL_LDFLAGS) $(DEBUG_FLAGS)
 | 
				
			||||||
 | 
					RELEASE_LDFLAGS = $(FULL_LDFLAGS) $(RELEASE_FLAGS)
 | 
				
			||||||
 | 
					DEBUG_CFLAGS = $(FULL_CFLAGS) $(DEBUG_FLAGS) -DDEBUG
 | 
				
			||||||
 | 
					RELEASE_CFLAGS = $(FULL_CFLAGS) $(RELEASE_FLAGS) -O2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Files
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKGCONFIG = $(BUILD_DIR)/$(LIB_NAME).pc
 | 
				
			||||||
 | 
					DEBUG_OBJS = $(SRC:%.c=$(DEBUG_BUILD_DIR)/%.o)
 | 
				
			||||||
 | 
					RELEASE_OBJS = $(SRC:%.c=$(RELEASE_BUILD_DIR)/%.o)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Dependencies
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPS = $(DEBUG_OBJS:%.o=%.d) $(RELEASE_OBJS:%.o=%.d)
 | 
				
			||||||
 | 
					ifneq ($(MAKECMDGOALS),clean)
 | 
				
			||||||
 | 
					ifneq ($(strip $(DEPS)),)
 | 
				
			||||||
 | 
					-include $(DEPS)
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DEBUG_OBJS) $(DEBUG_LIB): | $(DEBUG_BUILD_DIR)
 | 
				
			||||||
 | 
					$(RELEASE_OBJS) $(RELEASE_LIB): | $(RELEASE_BUILD_DIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Rules
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEBUG_LIB = $(DEBUG_BUILD_DIR)/$(LIB)
 | 
				
			||||||
 | 
					RELEASE_LIB = $(RELEASE_BUILD_DIR)/$(LIB)
 | 
				
			||||||
 | 
					DEBUG_LINK = $(DEBUG_BUILD_DIR)/$(LIB_SYMLINK1)
 | 
				
			||||||
 | 
					RELEASE_LINK = $(RELEASE_BUILD_DIR)/$(LIB_SYMLINK1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					debug: $(DEBUG_LIB) $(DEBUG_LINK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					release: $(RELEASE_LIB) $(RELEASE_LINK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pkgconfig: $(PKGCONFIG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
						rm -f *~ $(SRC_DIR)/*~ $(INCLUDE_DIR)/*~
 | 
				
			||||||
 | 
						rm -fr $(BUILD_DIR) RPMS installroot
 | 
				
			||||||
 | 
						rm -fr debian/tmp debian/libglibutil debian/libglibutil-dev
 | 
				
			||||||
 | 
						rm -f documentation.list debian/files debian/*.substvars
 | 
				
			||||||
 | 
						rm -f debian/*.debhelper.log debian/*.debhelper debian/*~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(GEN_DIR):
 | 
				
			||||||
 | 
						mkdir -p $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DEBUG_BUILD_DIR):
 | 
				
			||||||
 | 
						mkdir -p $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(RELEASE_BUILD_DIR):
 | 
				
			||||||
 | 
						mkdir -p $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DEBUG_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
 | 
				
			||||||
 | 
						$(CC) -c $(DEBUG_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(RELEASE_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
 | 
				
			||||||
 | 
						$(CC) -c $(RELEASE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DEBUG_LIB): $(DEBUG_OBJS)
 | 
				
			||||||
 | 
						$(LD) $(DEBUG_OBJS) $(DEBUG_LDFLAGS) -o $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(RELEASE_LIB): $(RELEASE_OBJS)
 | 
				
			||||||
 | 
						$(LD) $(RELEASE_OBJS) $(RELEASE_LDFLAGS) -o $@
 | 
				
			||||||
 | 
					ifeq ($(KEEP_SYMBOLS),0)
 | 
				
			||||||
 | 
						strip $@
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(DEBUG_LINK):
 | 
				
			||||||
 | 
						ln -sf $(LIB) $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(RELEASE_LINK):
 | 
				
			||||||
 | 
						ln -sf $(LIB) $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(PKGCONFIG): $(LIB_NAME).pc.in
 | 
				
			||||||
 | 
						sed -e 's/\[version\]/'$(VERSION_MAJOR).$(VERSION_MINOR)/g $< > $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Install
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INSTALL_PERM  = 644
 | 
				
			||||||
 | 
					INSTALL_OWNER = $(shell id -u)
 | 
				
			||||||
 | 
					INSTALL_GROUP = $(shell id -g)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INSTALL = install
 | 
				
			||||||
 | 
					INSTALL_DIRS = $(INSTALL) -d
 | 
				
			||||||
 | 
					INSTALL_FILES = $(INSTALL) -m $(INSTALL_PERM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INSTALL_LIB_DIR = $(DESTDIR)/usr/lib
 | 
				
			||||||
 | 
					INSTALL_INCLUDE_DIR = $(DESTDIR)/usr/include/$(NAME)
 | 
				
			||||||
 | 
					INSTALL_PKGCONFIG_DIR = $(DESTDIR)/usr/lib/pkgconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INSTALL_ALIAS = $(INSTALL_LIB_DIR)/$(LIB_SHORTCUT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install: $(INSTALL_LIB_DIR)
 | 
				
			||||||
 | 
						$(INSTALL_FILES) $(RELEASE_LIB) $(INSTALL_LIB_DIR)
 | 
				
			||||||
 | 
						ln -sf $(LIB) $(INSTALL_LIB_DIR)/$(LIB_SYMLINK2)
 | 
				
			||||||
 | 
						ln -sf $(LIB_SYMLINK2) $(INSTALL_LIB_DIR)/$(LIB_SYMLINK1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install-dev: install $(INSTALL_INCLUDE_DIR) $(INSTALL_PKGCONFIG_DIR)
 | 
				
			||||||
 | 
						$(INSTALL_FILES) $(INCLUDE_DIR)/*.h $(INSTALL_INCLUDE_DIR)
 | 
				
			||||||
 | 
						$(INSTALL_FILES) $(PKGCONFIG) $(INSTALL_PKGCONFIG_DIR)
 | 
				
			||||||
 | 
						ln -sf $(LIB_SYMLINK1) $(INSTALL_LIB_DIR)/$(LIB_DEV_SYMLINK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(INSTALL_LIB_DIR):
 | 
				
			||||||
 | 
						$(INSTALL_DIRS) $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(INSTALL_INCLUDE_DIR):
 | 
				
			||||||
 | 
						$(INSTALL_DIRS) $@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(INSTALL_PKGCONFIG_DIR):
 | 
				
			||||||
 | 
						$(INSTALL_DIRS) $@
 | 
				
			||||||
							
								
								
									
										5
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								debian/changelog
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					libglibutil (1.0.0) unstable; urgency=low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * Initial release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 -- Slava Monich <slava.monich@jolla.com>  Sat, 27 Dec 2014 22:36:32 +0200
 | 
				
			||||||
							
								
								
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					5
 | 
				
			||||||
							
								
								
									
										18
									
								
								debian/control
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								debian/control
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					Source: libglibutil
 | 
				
			||||||
 | 
					Section: libs
 | 
				
			||||||
 | 
					Priority: optional
 | 
				
			||||||
 | 
					Maintainer: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					Build-Depends: debhelper (>= 7), libglib2.0-dev (>= 2.0)
 | 
				
			||||||
 | 
					Standards-Version: 3.8.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Package: libglibutil
 | 
				
			||||||
 | 
					Section: libs
 | 
				
			||||||
 | 
					Architecture: any
 | 
				
			||||||
 | 
					Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
				
			||||||
 | 
					Description: Library of glib utilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Package: libglibutil-dev
 | 
				
			||||||
 | 
					Section: libdevel
 | 
				
			||||||
 | 
					Architecture: any
 | 
				
			||||||
 | 
					Depends: libglibutil (= ${binary:Version}), ${misc:Depends}
 | 
				
			||||||
 | 
					Description: Development files for libglibutil
 | 
				
			||||||
							
								
								
									
										29
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					Copyright (C) 2014-2015 Jolla Ltd.
 | 
				
			||||||
 | 
					Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					     notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					  2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					     notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					     documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					  3. Neither the name of the Jolla Ltd nor the names of its contributors
 | 
				
			||||||
 | 
					     may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					     without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
							
								
								
									
										3
									
								
								debian/libglibutil-dev.install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								debian/libglibutil-dev.install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					debian/tmp/usr/lib/libglibutil.so usr/lib
 | 
				
			||||||
 | 
					include/*.h usr/include/glibutil
 | 
				
			||||||
 | 
					build/libglibutil.pc usr/lib/pkgconfig
 | 
				
			||||||
							
								
								
									
										1
									
								
								debian/libglibutil.install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								debian/libglibutil.install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					debian/tmp/usr/lib/libglibutil.so.* usr/lib
 | 
				
			||||||
							
								
								
									
										11
									
								
								debian/rules
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								debian/rules
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/make -f
 | 
				
			||||||
 | 
					# -*- makefile -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Uncomment this to turn on verbose mode.
 | 
				
			||||||
 | 
					#export DH_VERBOSE=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					override_dh_auto_install:
 | 
				
			||||||
 | 
						dh_auto_install -- install-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%:
 | 
				
			||||||
 | 
						dh $@
 | 
				
			||||||
							
								
								
									
										343
									
								
								include/gutil_log.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										343
									
								
								include/gutil_log.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,343 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2014-2015 Jolla Ltd.
 | 
				
			||||||
 | 
					 * Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *      documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   3. Neither the name of the Jolla Ltd nor the names of its contributors
 | 
				
			||||||
 | 
					 *      may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *      without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					 * THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GUTIL_LOG_H
 | 
				
			||||||
 | 
					#define GUTIL_LOG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gutil_types.h"
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Log levels */
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_ALWAYS         (-2)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_INHERIT        (-1)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_NONE           (0)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_ERR            (1)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_WARN           (2)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_INFO           (3)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_DEBUG          (4)
 | 
				
			||||||
 | 
					#define GLOG_LEVEL_VERBOSE        (5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Allow these to be redefined */
 | 
				
			||||||
 | 
					#ifndef GLOG_LEVEL_MAX
 | 
				
			||||||
 | 
					#  ifdef DEBUG
 | 
				
			||||||
 | 
					#    define GLOG_LEVEL_MAX        GLOG_LEVEL_VERBOSE
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GLOG_LEVEL_MAX        GLOG_LEVEL_DEBUG
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					#endif /* GLOG_LEVEL_MAX */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLOG_LEVEL_DEFAULT
 | 
				
			||||||
 | 
					#  ifdef DEBUG
 | 
				
			||||||
 | 
					#    define GLOG_LEVEL_DEFAULT    GLOG_LEVEL_DEBUG
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GLOG_LEVEL_DEFAULT    GLOG_LEVEL_INFO
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					#endif /* GLOG_LEVEL_DEFAULT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Do we need a separate log level for ASSERTs? */
 | 
				
			||||||
 | 
					#ifndef GLOG_LEVEL_ASSERT
 | 
				
			||||||
 | 
					#  ifdef DEBUG
 | 
				
			||||||
 | 
					#    define GLOG_LEVEL_ASSERT     GLOG_LEVEL_ERR
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					     /* No asserts in release build */
 | 
				
			||||||
 | 
					#    define GLOG_LEVEL_ASSERT     (GLOG_LEVEL_MAX+1)
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Log module */
 | 
				
			||||||
 | 
					struct glog_module {
 | 
				
			||||||
 | 
					    const char* name;               /* Name (used as prefix) */
 | 
				
			||||||
 | 
					    const GLogModule* parent;       /* Parent log module (optional) */
 | 
				
			||||||
 | 
					    void* reserved;                 /* Reserved for future expansion */
 | 
				
			||||||
 | 
					    const int max_level;            /* Maximum level defined at compile time */
 | 
				
			||||||
 | 
					    int level;                      /* Current log level */
 | 
				
			||||||
 | 
					    int flags;                      /* Flags (should be zero) */
 | 
				
			||||||
 | 
					    int reserved2;                  /* Reserved for future expansion */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Command line parsing helper. Option format is [module]:level
 | 
				
			||||||
 | 
					 * where level can be either a number or log level name ("none", err etc.) */
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_parse_option(
 | 
				
			||||||
 | 
					    const char* opt,                /* String to parse */
 | 
				
			||||||
 | 
					    GLogModule** modules,           /* Known modules */
 | 
				
			||||||
 | 
					    int count,                      /* Number of known modules */
 | 
				
			||||||
 | 
					    GError** error);                /* Optional error message */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set log type by name ("syslog", "stdout" or "glib"). This is also
 | 
				
			||||||
 | 
					 * primarily for parsing command line options */
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_set_type(
 | 
				
			||||||
 | 
					    const char* type,
 | 
				
			||||||
 | 
					    const char* default_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					gutil_log_get_type(
 | 
				
			||||||
 | 
					    void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Generates the string containg description of log levels and list of
 | 
				
			||||||
 | 
					 * log modules. The caller must deallocate the string with g_free */
 | 
				
			||||||
 | 
					char*
 | 
				
			||||||
 | 
					gutil_log_description(
 | 
				
			||||||
 | 
					    GLogModule** modules,           /* Known modules */
 | 
				
			||||||
 | 
					    int count);                     /* Number of known modules */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Logging function */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log(
 | 
				
			||||||
 | 
					    const GLogModule* module,       /* Calling module (NULL for default) */
 | 
				
			||||||
 | 
					    int level,                      /* Message log level */
 | 
				
			||||||
 | 
					    const char* format,             /* Message format */
 | 
				
			||||||
 | 
					    ...) G_GNUC_PRINTF(3,4);        /* Followed by arguments */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_logv(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Check if logging is enabled for the specified log level */
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_enabled(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Known log types */
 | 
				
			||||||
 | 
					extern const char GLOG_TYPE_STDOUT[];
 | 
				
			||||||
 | 
					extern const char GLOG_TYPE_STDERR[];
 | 
				
			||||||
 | 
					extern const char GLOG_TYPE_GLIB[];
 | 
				
			||||||
 | 
					extern const char GLOG_TYPE_CUSTOM[];
 | 
				
			||||||
 | 
					extern const char GLOG_TYPE_SYSLOG[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Available log handlers */
 | 
				
			||||||
 | 
					#define GUTIL_DEFINE_LOG_FN(fn)  void fn(const char* name, int level, \
 | 
				
			||||||
 | 
					    const char* format, va_list va)
 | 
				
			||||||
 | 
					GUTIL_DEFINE_LOG_FN(gutil_log_stdout);
 | 
				
			||||||
 | 
					GUTIL_DEFINE_LOG_FN(gutil_log_stderr);
 | 
				
			||||||
 | 
					GUTIL_DEFINE_LOG_FN(gutil_log_glib);
 | 
				
			||||||
 | 
					GUTIL_DEFINE_LOG_FN(gutil_log_syslog);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Log configuration */
 | 
				
			||||||
 | 
					#define GLOG_MODULE_DECL(m) extern GLogModule m;
 | 
				
			||||||
 | 
					GLOG_MODULE_DECL(gutil_log_default)
 | 
				
			||||||
 | 
					typedef GUTIL_DEFINE_LOG_FN((*GLogProc));
 | 
				
			||||||
 | 
					extern GLogProc gutil_log_func;
 | 
				
			||||||
 | 
					extern gboolean gutil_log_timestamp; /* Only affects stdout and stderr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Log module (optional) */
 | 
				
			||||||
 | 
					#define GLOG_MODULE_DEFINE_(var,name) \
 | 
				
			||||||
 | 
					  GLogModule var = {name, NULL, NULL, \
 | 
				
			||||||
 | 
					  GLOG_LEVEL_MAX, GLOG_LEVEL_INHERIT, 0, 0}
 | 
				
			||||||
 | 
					#define GLOG_MODULE_DEFINE2_(var,name,parent) \
 | 
				
			||||||
 | 
					  GLogModule var = {name, &(parent), NULL, \
 | 
				
			||||||
 | 
					  GLOG_LEVEL_MAX, GLOG_LEVEL_INHERIT, 0, 0}
 | 
				
			||||||
 | 
					#ifdef GLOG_MODULE_NAME
 | 
				
			||||||
 | 
					extern GLogModule GLOG_MODULE_NAME;
 | 
				
			||||||
 | 
					#  define GLOG_MODULE_CURRENT   (&GLOG_MODULE_NAME)
 | 
				
			||||||
 | 
					#  define GLOG_MODULE_DEFINE(name) \
 | 
				
			||||||
 | 
					    GLOG_MODULE_DEFINE_(GLOG_MODULE_NAME,name)
 | 
				
			||||||
 | 
					#  define GLOG_MODULE_DEFINE2(name,parent) \
 | 
				
			||||||
 | 
					    GLOG_MODULE_DEFINE2_(GLOG_MODULE_NAME,name,parent)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GLOG_MODULE_CURRENT   NULL
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Logging macros */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GLOG_NOTHING ((void)0)
 | 
				
			||||||
 | 
					#define GLOG_ENABLED(level)   gutil_log_enabled(GLOG_MODULE_CURRENT,level)
 | 
				
			||||||
 | 
					#define GERRMSG(err) (((err) && (err)->message) ? (err)->message : \
 | 
				
			||||||
 | 
					  "Unknown error")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(GLOG_VARARGS) && defined(__GNUC__)
 | 
				
			||||||
 | 
					#  define GLOG_VARARGS
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLOG_VARARGS
 | 
				
			||||||
 | 
					#  define GLOG_VA_NONE(x) static inline void GUTIL_##x(const char* f, ...) {}
 | 
				
			||||||
 | 
					#  define GLOG_VA(x) static inline void GUTIL_##x(const char* f, ...) { \
 | 
				
			||||||
 | 
					    if (f && f[0]) {                                                    \
 | 
				
			||||||
 | 
					        va_list va; va_start(va,f);                                     \
 | 
				
			||||||
 | 
					        gutil_logv(GLOG_MODULE_CURRENT, GLOG_LEVEL_##x, f, va);         \
 | 
				
			||||||
 | 
					        va_end(va);                                                     \
 | 
				
			||||||
 | 
					    }                                                                   \
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* GLOG_VARARGS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define GUTIL_LOG_ANY           (GLOG_LEVEL_MAX >= GLOG_LEVEL_NONE)
 | 
				
			||||||
 | 
					#define GUTIL_LOG_ERR           (GLOG_LEVEL_MAX >= GLOG_LEVEL_ERR)
 | 
				
			||||||
 | 
					#define GUTIL_LOG_WARN          (GLOG_LEVEL_MAX >= GLOG_LEVEL_WARN)
 | 
				
			||||||
 | 
					#define GUTIL_LOG_INFO          (GLOG_LEVEL_MAX >= GLOG_LEVEL_INFO)
 | 
				
			||||||
 | 
					#define GUTIL_LOG_DEBUG         (GLOG_LEVEL_MAX >= GLOG_LEVEL_DEBUG)
 | 
				
			||||||
 | 
					#define GUTIL_LOG_VERBOSE       (GLOG_LEVEL_MAX >= GLOG_LEVEL_VERBOSE)
 | 
				
			||||||
 | 
					#define GUTIL_LOG_ASSERT        (GLOG_LEVEL_MAX >= GLOG_LEVEL_ASSERT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if GUTIL_LOG_ASSERT
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_assert(
 | 
				
			||||||
 | 
					    const GLogModule* module, /* Calling module (NULL for default) */
 | 
				
			||||||
 | 
					    int level,                /* Assert log level */
 | 
				
			||||||
 | 
					    const char* expr,         /* Assert expression */
 | 
				
			||||||
 | 
					    const char* file,         /* File name */
 | 
				
			||||||
 | 
					    int line);                /* Line number */
 | 
				
			||||||
 | 
					#  define GASSERT(expr)         ((expr) ? GLOG_NOTHING : \
 | 
				
			||||||
 | 
					   gutil_log_assert(GLOG_MODULE_CURRENT, GLOG_LEVEL_ASSERT, \
 | 
				
			||||||
 | 
					   #expr, __FILE__, __LINE__))
 | 
				
			||||||
 | 
					#  define GVERIFY(expr)         GASSERT(expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_FALSE(expr)   GASSERT(!(expr))
 | 
				
			||||||
 | 
					#  define GVERIFY_EQ(expr,val)  GASSERT((expr) == (val))
 | 
				
			||||||
 | 
					#  define GVERIFY_NE(expr,val)  GASSERT((expr) != (val))
 | 
				
			||||||
 | 
					#  define GVERIFY_GE(expr,val)  GASSERT((expr) >= (val))
 | 
				
			||||||
 | 
					#  define GVERIFY_GT(expr,val)  GASSERT((expr) >  (val))
 | 
				
			||||||
 | 
					#  define GVERIFY_LE(expr,val)  GASSERT((expr) <= (val))
 | 
				
			||||||
 | 
					#  define GVERIFY_LT(expr,val)  GASSERT((expr) <  (val))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GASSERT(expr)
 | 
				
			||||||
 | 
					#  define GVERIFY(expr)         (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_FALSE(expr)   (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_EQ(expr,val)  (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_NE(expr,val)  (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_GE(expr,val)  (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_GT(expr,val)  (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_LE(expr,val)  (expr)
 | 
				
			||||||
 | 
					#  define GVERIFY_LT(expr,val)  (expr)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLOG_VARARGS
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_ERR
 | 
				
			||||||
 | 
					#    define GERR(f,args...)     gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_ERR, f, ##args)
 | 
				
			||||||
 | 
					#    define GERR_(f,args...)    gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_ERR, "%s() " f, __FUNCTION__, ##args)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GERR(f,args...)     GLOG_NOTHING
 | 
				
			||||||
 | 
					#    define GERR_(f,args...)    GLOG_NOTHING
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_ERR */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GERR_                 GERR
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_ERR
 | 
				
			||||||
 | 
					     GLOG_VA(ERR)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					     GLOG_VA_NONE(ERR)
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_ERR */
 | 
				
			||||||
 | 
					#endif /* GLOG_VARARGS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLOG_VARARGS
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_WARN
 | 
				
			||||||
 | 
					#    define GWARN(f,args...)    gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_WARN, f, ##args)
 | 
				
			||||||
 | 
					#    define GWARN_(f,args...)   gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_WARN, "%s() " f, __FUNCTION__, ##args)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GWARN(f,args...)    GLOG_NOTHING
 | 
				
			||||||
 | 
					#    define GWARN_(f,args...)   GLOG_NOTHING
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOGL_WARN */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GWARN_                GWARN
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_WARN
 | 
				
			||||||
 | 
					     GLOG_VA(WARN)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					     GLOG_VA_NONE(WARN)
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOGL_WARN */
 | 
				
			||||||
 | 
					#  endif /* GLOG_VARARGS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLOG_VARARGS
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_INFO
 | 
				
			||||||
 | 
					#    define GINFO(f,args...)    gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_INFO, f, ##args)
 | 
				
			||||||
 | 
					#    define GINFO_(f,args...)   gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_INFO, "%s() " f, __FUNCTION__, ##args)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GINFO(f,args...)    GLOG_NOTHING
 | 
				
			||||||
 | 
					#    define GINFO_(f,args...)   GLOG_NOTHING
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_INFO */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GINFO_                GINFO
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_INFO
 | 
				
			||||||
 | 
					     GLOG_VA(INFO)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					     GLOG_VA_NONE(INFO)
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_INFO */
 | 
				
			||||||
 | 
					#endif /* GLOG_VARARGS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLOG_VARARGS
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_DEBUG
 | 
				
			||||||
 | 
					#    define GDEBUG(f,args...)   gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_DEBUG, f, ##args)
 | 
				
			||||||
 | 
					#    define GDEBUG_(f,args...)  gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_DEBUG, "%s() " f, __FUNCTION__, ##args)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GDEBUG(f,args...)   GLOG_NOTHING
 | 
				
			||||||
 | 
					#    define GDEBUG_(f,args...)  GLOG_NOTHING
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_DEBUG */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GDEBUG_               GDEBUG
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_DEBUG
 | 
				
			||||||
 | 
					     GLOG_VA(DEBUG)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					     GLOG_VA_NONE(DEBUG)
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_DEBUG */
 | 
				
			||||||
 | 
					#endif /* GLOG_VARARGS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLOG_VARARGS
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_VERBOSE
 | 
				
			||||||
 | 
					#    define GVERBOSE(f,args...)  gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_VERBOSE, f, ##args)
 | 
				
			||||||
 | 
					#    define GVERBOSE_(f,args...) gutil_log(GLOG_MODULE_CURRENT, \
 | 
				
			||||||
 | 
					       GLOG_LEVEL_VERBOSE, "%s() " f, __FUNCTION__, ##args)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GVERBOSE(f,args...)  GLOG_NOTHING
 | 
				
			||||||
 | 
					#    define GVERBOSE_(f,args...) GLOG_NOTHING
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_VERBOSE */
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define GVERBOSE_              GVERBOSE
 | 
				
			||||||
 | 
					#  if GUTIL_LOG_VERBOSE
 | 
				
			||||||
 | 
					     GLOG_VA(VERBOSE)
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					     GLOG_VA_NONE(VERBOSE)
 | 
				
			||||||
 | 
					#  endif /* GUTIL_LOG_VERBOSE */
 | 
				
			||||||
 | 
					#endif /* GLOG_VARARGS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* GUTIL_LOG_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										59
									
								
								include/gutil_macros.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								include/gutil_macros.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2014-2015 Jolla Ltd.
 | 
				
			||||||
 | 
					 * Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *      documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   3. Neither the name of the Jolla Ltd nor the names of its contributors
 | 
				
			||||||
 | 
					 *      may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *      without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					 * THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GUTIL_MACROS_H
 | 
				
			||||||
 | 
					#define GUTIL_MACROS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gutil_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define G_CAST(address,type,field) \
 | 
				
			||||||
 | 
					    ((type *)((guint8*)(address) - G_STRUCT_OFFSET(type,field)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define G_ALIGN2(value) (((value)+1) & ~1)
 | 
				
			||||||
 | 
					#define G_ALIGN4(value) (((value)+3) & ~3)
 | 
				
			||||||
 | 
					#define G_ALIGN8(value) (((value)+7) & ~7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __GNUC__
 | 
				
			||||||
 | 
					#  define G_PACKED __attribute__((packed))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#  define G_PACKED
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* GUTIL_MACROS_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										51
									
								
								include/gutil_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								include/gutil_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2014-2015 Jolla Ltd.
 | 
				
			||||||
 | 
					 * Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *      documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   3. Neither the name of the Jolla Ltd nor the names of its contributors
 | 
				
			||||||
 | 
					 *      may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *      without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					 * THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GUTIL_TYPES_H
 | 
				
			||||||
 | 
					#define GUTIL_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <glib.h>
 | 
				
			||||||
 | 
					#include <glib-object.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct glog_module GLogModule;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* GUTIL_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										10
									
								
								libglibutil.pc.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								libglibutil.pc.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					name=glibutil
 | 
				
			||||||
 | 
					libdir=/usr/lib
 | 
				
			||||||
 | 
					includedir=/usr/include
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Name: libglibutil
 | 
				
			||||||
 | 
					Description: Library of glib utilities
 | 
				
			||||||
 | 
					Version: [version]
 | 
				
			||||||
 | 
					Requires: glib-2.0
 | 
				
			||||||
 | 
					Libs: -L${libdir} -l${name}
 | 
				
			||||||
 | 
					Cflags: -I${includedir} -I${includedir}/${name}
 | 
				
			||||||
							
								
								
									
										46
									
								
								rpm/libglibutil.spec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								rpm/libglibutil.spec
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					Name: libglibutil
 | 
				
			||||||
 | 
					Version: 1.0
 | 
				
			||||||
 | 
					Release: 0
 | 
				
			||||||
 | 
					Summary: Library of glib utilities
 | 
				
			||||||
 | 
					Group: Development/Libraries
 | 
				
			||||||
 | 
					License: BSD
 | 
				
			||||||
 | 
					URL: https://github.com/nemomobile/libglibutil
 | 
				
			||||||
 | 
					Source: %{name}-%{version}.tar.bz2
 | 
				
			||||||
 | 
					BuildRequires: glib2-devel >= 2.0
 | 
				
			||||||
 | 
					Requires(post): /sbin/ldconfig
 | 
				
			||||||
 | 
					Requires(postun): /sbin/ldconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%description
 | 
				
			||||||
 | 
					Provides glib utility functions and macros
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%package devel
 | 
				
			||||||
 | 
					Summary: Development library for %{name}
 | 
				
			||||||
 | 
					Requires: %{name} = %{version}
 | 
				
			||||||
 | 
					Requires: pkgconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%description devel
 | 
				
			||||||
 | 
					This package contains the development library for %{name}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%prep
 | 
				
			||||||
 | 
					%setup -q
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%build
 | 
				
			||||||
 | 
					make KEEP_SYMBOLS=1 release pkgconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%install
 | 
				
			||||||
 | 
					rm -rf %{buildroot}
 | 
				
			||||||
 | 
					make install-dev DESTDIR=%{buildroot}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%post -p /sbin/ldconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%postun -p /sbin/ldconfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%files
 | 
				
			||||||
 | 
					%defattr(-,root,root,-)
 | 
				
			||||||
 | 
					%{_libdir}/%{name}.so.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%files devel
 | 
				
			||||||
 | 
					%defattr(-,root,root,-)
 | 
				
			||||||
 | 
					%{_libdir}/pkgconfig/*.pc
 | 
				
			||||||
 | 
					%{_libdir}/%{name}.so
 | 
				
			||||||
 | 
					%{_includedir}/glibutil/*.h
 | 
				
			||||||
							
								
								
									
										527
									
								
								src/gutil_log.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								src/gutil_log.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,527 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2014-2015 Jolla Ltd.
 | 
				
			||||||
 | 
					 * Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *      documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   3. Neither the name of the Jolla Ltd nor the names of its contributors
 | 
				
			||||||
 | 
					 *      may be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *      without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					 * THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gutil_log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(DEBUG) && defined(_WIN32)
 | 
				
			||||||
 | 
					#  include <windows.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLOG_SYSLOG
 | 
				
			||||||
 | 
					#  ifdef unix
 | 
				
			||||||
 | 
					#    define GLOG_SYSLOG 1
 | 
				
			||||||
 | 
					#  else
 | 
				
			||||||
 | 
					#    define GLOG_SYSLOG 0
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					#endif /* GLOG_SYSLOG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLOG_GLIB
 | 
				
			||||||
 | 
					#  define GLOG_GLIB 1
 | 
				
			||||||
 | 
					#endif /* GLOG_GLIB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Allows timestamps in stdout log */
 | 
				
			||||||
 | 
					gboolean gutil_log_timestamp = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Log configuration */
 | 
				
			||||||
 | 
					GLogProc gutil_log_func = gutil_log_stdout;
 | 
				
			||||||
 | 
					GLogModule gutil_log_default = {
 | 
				
			||||||
 | 
					    NULL,               /* name      */
 | 
				
			||||||
 | 
					    NULL,               /* parent    */
 | 
				
			||||||
 | 
					    NULL,               /* reserved  */
 | 
				
			||||||
 | 
					    GLOG_LEVEL_MAX,     /* max_level */
 | 
				
			||||||
 | 
					    GLOG_LEVEL_DEFAULT, /* level     */
 | 
				
			||||||
 | 
					    0                   /* flags     */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Log level descriptions */
 | 
				
			||||||
 | 
					static const struct _gutil_log_level {
 | 
				
			||||||
 | 
					    const char* name;
 | 
				
			||||||
 | 
					    const char* description;
 | 
				
			||||||
 | 
					} gutil_log_levels [] = {
 | 
				
			||||||
 | 
					    { "none",    "Disable log output" },
 | 
				
			||||||
 | 
					    { "error",   "Errors only"},
 | 
				
			||||||
 | 
					    { "warning", "From warning level to errors" },
 | 
				
			||||||
 | 
					    { "info",    "From information level to errors" },
 | 
				
			||||||
 | 
					    { "debug",   "From debug messages to errors" },
 | 
				
			||||||
 | 
					    { "verbose", "From verbose trace messages to errors" }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char GLOG_TYPE_STDOUT[] = "stdout";
 | 
				
			||||||
 | 
					const char GLOG_TYPE_STDERR[] = "stderr";
 | 
				
			||||||
 | 
					const char GLOG_TYPE_CUSTOM[] = "custom";
 | 
				
			||||||
 | 
					#if GLOG_GLIB
 | 
				
			||||||
 | 
					const char GLOG_TYPE_GLIB[]   = "glib";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if GLOG_SYSLOG
 | 
				
			||||||
 | 
					const char GLOG_TYPE_SYSLOG[] = "syslog";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(gutil_log_levels) > GLOG_LEVEL_MAX);
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(gutil_log_levels) > GLOG_LEVEL_DEFAULT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Formats the string into the given buffer (most commonly allocated
 | 
				
			||||||
 | 
					 * on caller's stack). If formatted string fits into the provided buffer,
 | 
				
			||||||
 | 
					 * returns pointer to the given buffer. If formatted string is too long
 | 
				
			||||||
 | 
					 * to fit into the provided buffer, allocates a new one and returns pointer
 | 
				
			||||||
 | 
					 * to it.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					char*
 | 
				
			||||||
 | 
					gutil_log_format(
 | 
				
			||||||
 | 
					    char* buf,
 | 
				
			||||||
 | 
					    int bufsize,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int size, nchars = -1;
 | 
				
			||||||
 | 
					    char* buffer;
 | 
				
			||||||
 | 
					    if (buf) {
 | 
				
			||||||
 | 
					        size = bufsize;
 | 
				
			||||||
 | 
					        buffer = buf;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        size = MAX(100,bufsize);
 | 
				
			||||||
 | 
					        buffer = g_malloc(size);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    while (buffer) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Try to print in the allocated space. */
 | 
				
			||||||
 | 
					        va_list va2;
 | 
				
			||||||
 | 
					        G_VA_COPY(va2, va);
 | 
				
			||||||
 | 
					        nchars = g_vsnprintf(buffer, size, format, va2);
 | 
				
			||||||
 | 
					        va_end(va2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Return the string or try again with more space. */
 | 
				
			||||||
 | 
					        if (nchars >= 0) {
 | 
				
			||||||
 | 
					            if (nchars < size) break;
 | 
				
			||||||
 | 
					            size = nchars+1;  /* Precisely what is needed */
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            size *= 2;        /* Twice the old size */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (buffer != buf) g_free(buffer);
 | 
				
			||||||
 | 
					        buffer = g_malloc(size);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return buffer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Forward output to stdout or stderr */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_stdio(
 | 
				
			||||||
 | 
					    FILE* out,
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char t[32];
 | 
				
			||||||
 | 
					    char buf[512];
 | 
				
			||||||
 | 
					    const char* prefix = "";
 | 
				
			||||||
 | 
					    char* msg;
 | 
				
			||||||
 | 
					    if (gutil_log_timestamp) {
 | 
				
			||||||
 | 
					        time_t now;
 | 
				
			||||||
 | 
					        time(&now);
 | 
				
			||||||
 | 
					        strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S ", localtime(&now));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        t[0] = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    switch (level) {
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_WARN: prefix = "WARNING: "; break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_ERR:  prefix = "ERROR: ";   break;
 | 
				
			||||||
 | 
					    default:              break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    msg = gutil_log_format(buf, sizeof(buf), format, va);
 | 
				
			||||||
 | 
					#if defined(DEBUG) && defined(_WIN32)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        char s[1023];
 | 
				
			||||||
 | 
					        if (name) {
 | 
				
			||||||
 | 
					            g_snprintf(s, sizeof(s), "%s[%s] %s%s\n", t, name, prefix, msg);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            g_snprintf(s, sizeof(s), "%s%s%s\n", t, prefix, msg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        OutputDebugStringA(s);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (name) {
 | 
				
			||||||
 | 
					        fprintf(out, "%s[%s] %s%s\n", t, name, prefix, msg);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        fprintf(out, "%s%s%s\n", t, prefix, msg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (msg != buf) g_free(msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_stdout(
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gutil_log_stdio(stdout, name, level, format, va);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_stderr(
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gutil_log_stdio(stderr, name, level, format, va);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Formards output to syslog */
 | 
				
			||||||
 | 
					#if GLOG_SYSLOG
 | 
				
			||||||
 | 
					#include <syslog.h>
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_syslog(
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int priority;
 | 
				
			||||||
 | 
					    const char* prefix = NULL;
 | 
				
			||||||
 | 
					    switch (level) {
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_INFO:
 | 
				
			||||||
 | 
					        priority = LOG_NOTICE;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_VERBOSE:
 | 
				
			||||||
 | 
					        priority = LOG_DEBUG;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_DEBUG:
 | 
				
			||||||
 | 
					        priority = LOG_INFO;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_WARN:
 | 
				
			||||||
 | 
					        priority = LOG_WARNING;
 | 
				
			||||||
 | 
					        prefix = "WARNING! ";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_ERR:
 | 
				
			||||||
 | 
					        priority = LOG_ERR;
 | 
				
			||||||
 | 
					        prefix = "ERROR! ";
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (name || prefix) {
 | 
				
			||||||
 | 
					        char buf[512];
 | 
				
			||||||
 | 
					        g_vsnprintf(buf, sizeof(buf), format, va);
 | 
				
			||||||
 | 
					        if (!prefix) prefix = "";
 | 
				
			||||||
 | 
					        if (name) {
 | 
				
			||||||
 | 
					            syslog(priority, "[%s] %s%s", name, prefix, buf);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            syslog(priority, "%s%s", prefix, buf);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        vsyslog(priority, format, va);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* GLOG_SYSLOG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Forwards output to g_logv */
 | 
				
			||||||
 | 
					#if GLOG_GLIB
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_glib(
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GLogLevelFlags flags;
 | 
				
			||||||
 | 
					    switch (level) {
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_INFO:    flags = G_LOG_LEVEL_MESSAGE;  break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_VERBOSE: flags = G_LOG_LEVEL_DEBUG;    break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_DEBUG:   flags = G_LOG_LEVEL_INFO;     break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_WARN:    flags = G_LOG_LEVEL_WARNING;  break;
 | 
				
			||||||
 | 
					    case GLOG_LEVEL_ERR:     flags = G_LOG_LEVEL_CRITICAL; break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    g_logv(name, flags, format, va);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* GLOG_GLIB */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Logging function */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_logv_r(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* prefix,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (module->parent && module->level == GLOG_LEVEL_INHERIT) {
 | 
				
			||||||
 | 
					        gutil_logv_r(module->parent, level, prefix, format, va);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        const int max_level = (module->level == GLOG_LEVEL_INHERIT) ?
 | 
				
			||||||
 | 
					            gutil_log_default.level : module->level;
 | 
				
			||||||
 | 
					        if (level > GLOG_LEVEL_NONE && level <= max_level) {
 | 
				
			||||||
 | 
					            GLogProc log = gutil_log_func;
 | 
				
			||||||
 | 
					            if (G_LIKELY(log)) {
 | 
				
			||||||
 | 
					                log(prefix, level, format, va);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_logv(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    va_list va)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (level != GLOG_LEVEL_NONE && gutil_log_func) {
 | 
				
			||||||
 | 
					        if (!module) module = &gutil_log_default;
 | 
				
			||||||
 | 
					        if (G_UNLIKELY(level == GLOG_LEVEL_ALWAYS)) {
 | 
				
			||||||
 | 
					            GLogProc log = gutil_log_func;
 | 
				
			||||||
 | 
					            if (G_LIKELY(log)) {
 | 
				
			||||||
 | 
					                if (level == GLOG_LEVEL_ALWAYS) {
 | 
				
			||||||
 | 
					                    log(module->name, level, format, va);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            gutil_logv_r(module, level, module->name, format, va);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* format,
 | 
				
			||||||
 | 
					    ...)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    va_list va;
 | 
				
			||||||
 | 
					    va_start(va, format);
 | 
				
			||||||
 | 
					    gutil_logv(module, level, format, va);
 | 
				
			||||||
 | 
					    va_end(va);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gutil_log_assert(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level,
 | 
				
			||||||
 | 
					    const char* expr,
 | 
				
			||||||
 | 
					    const char* file,
 | 
				
			||||||
 | 
					    int line)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gutil_log(module, level, "Assert %s failed at %s:%d\r", expr, file, line);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Check if logging is enabled for the specified log level
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_enabled_r(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (module->parent && module->level == GLOG_LEVEL_INHERIT) {
 | 
				
			||||||
 | 
					        return gutil_log_enabled_r(module->parent, level);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        const int max_level = (module->level == GLOG_LEVEL_INHERIT) ?
 | 
				
			||||||
 | 
					            gutil_log_default.level : module->level;
 | 
				
			||||||
 | 
					        return (level > GLOG_LEVEL_NONE && level <= max_level);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_enabled(
 | 
				
			||||||
 | 
					    const GLogModule* module,
 | 
				
			||||||
 | 
					    int level)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (gutil_log_func) {
 | 
				
			||||||
 | 
					        if (level == GLOG_LEVEL_ALWAYS) {
 | 
				
			||||||
 | 
					            return TRUE;
 | 
				
			||||||
 | 
					        } else if (level > GLOG_LEVEL_NONE) {
 | 
				
			||||||
 | 
					            if (!module) module = &gutil_log_default;
 | 
				
			||||||
 | 
					            return gutil_log_enabled_r(module, level);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* gutil_log_parse_option helper */
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					gutil_log_parse_level(
 | 
				
			||||||
 | 
					    const char* str,
 | 
				
			||||||
 | 
					    GError** error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (str && str[0]) {
 | 
				
			||||||
 | 
					        guint i;
 | 
				
			||||||
 | 
					        const size_t len = strlen(str);
 | 
				
			||||||
 | 
					        if (len == 1) {
 | 
				
			||||||
 | 
					            const char* valid_numbers = "012345";
 | 
				
			||||||
 | 
					            const char* number = strchr(valid_numbers, str[0]);
 | 
				
			||||||
 | 
					            if (number) {
 | 
				
			||||||
 | 
					                return number - valid_numbers;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (i=0; i<G_N_ELEMENTS(gutil_log_levels); i++) {
 | 
				
			||||||
 | 
					            if (!strncmp(gutil_log_levels[i].name, str, len)) {
 | 
				
			||||||
 | 
					                return i;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (error) {
 | 
				
			||||||
 | 
					        *error = g_error_new(G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
 | 
				
			||||||
 | 
					            "Invalid log level '%s'", str);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Command line parsing helper. Option format is [module:]level where level
 | 
				
			||||||
 | 
					 * can be either a number or log level name ("none", "error", etc.)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_parse_option(
 | 
				
			||||||
 | 
					    const char* opt,
 | 
				
			||||||
 | 
					    GLogModule** modules,
 | 
				
			||||||
 | 
					    int count,
 | 
				
			||||||
 | 
					    GError** error)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    const char* sep = strchr(opt, ':');
 | 
				
			||||||
 | 
					    if (sep) {
 | 
				
			||||||
 | 
					        const int modlevel = gutil_log_parse_level(sep+1, error);
 | 
				
			||||||
 | 
					        if (modlevel >= 0) {
 | 
				
			||||||
 | 
					            int i;
 | 
				
			||||||
 | 
					            const size_t namelen = sep - opt;
 | 
				
			||||||
 | 
					            for (i=0; i<count; i++) {
 | 
				
			||||||
 | 
					                if (!g_ascii_strncasecmp(modules[i]->name, opt, namelen) &&
 | 
				
			||||||
 | 
					                    strlen(modules[i]->name) == namelen) {
 | 
				
			||||||
 | 
					                    modules[i]->level = modlevel;
 | 
				
			||||||
 | 
					                    return TRUE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (error) {
 | 
				
			||||||
 | 
					                *error = g_error_new(G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
 | 
				
			||||||
 | 
					                    "Unknown log module '%.*s'", (int)namelen, opt);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        const int deflevel = gutil_log_parse_level(opt, error);
 | 
				
			||||||
 | 
					        if (deflevel >= 0) {
 | 
				
			||||||
 | 
					            gutil_log_default.level = deflevel;
 | 
				
			||||||
 | 
					            return TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Generates the string containg description of log levels and list of
 | 
				
			||||||
 | 
					 * log modules. The caller must deallocate the string with g_free
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					char*
 | 
				
			||||||
 | 
					gutil_log_description(
 | 
				
			||||||
 | 
					    GLogModule** modules,   /* Known modules */
 | 
				
			||||||
 | 
					    int count)              /* Number of known modules */
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    GString* desc = g_string_sized_new(128);
 | 
				
			||||||
 | 
					    g_string_append(desc, "Log Levels:\n");
 | 
				
			||||||
 | 
					    for (i=0; i<=GLOG_LEVEL_VERBOSE; i++) {
 | 
				
			||||||
 | 
					        g_string_append_printf(desc, "   %d, ", i);
 | 
				
			||||||
 | 
					        g_string_append_printf(desc, "%-8s    ", gutil_log_levels[i].name);
 | 
				
			||||||
 | 
					        g_string_append(desc, gutil_log_levels[i].description);
 | 
				
			||||||
 | 
					        if (i == GLOG_LEVEL_DEFAULT) g_string_append(desc, " (default)");
 | 
				
			||||||
 | 
					        g_string_append(desc, "\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (modules) {
 | 
				
			||||||
 | 
					        g_string_append(desc, "\nLog Modules:\n");
 | 
				
			||||||
 | 
					        for (i=0; i<count; i++) {
 | 
				
			||||||
 | 
					            g_string_append_printf(desc, "  %s\n", modules[i]->name);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return g_string_free(desc, FALSE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					gutil_log_set_type(
 | 
				
			||||||
 | 
					    const char* type,
 | 
				
			||||||
 | 
					    const char* default_name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if GLOG_SYSLOG
 | 
				
			||||||
 | 
					    if (!g_ascii_strcasecmp(type, GLOG_TYPE_SYSLOG)) {
 | 
				
			||||||
 | 
					        if (gutil_log_func != gutil_log_syslog) {
 | 
				
			||||||
 | 
					            openlog(NULL, LOG_PID | LOG_CONS, LOG_USER);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        gutil_log_default.name = NULL;
 | 
				
			||||||
 | 
					        gutil_log_func = gutil_log_syslog;
 | 
				
			||||||
 | 
					        return TRUE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (gutil_log_func == gutil_log_syslog) {
 | 
				
			||||||
 | 
					        closelog();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif /* GLOG_SYSLOG */
 | 
				
			||||||
 | 
					    gutil_log_default.name = default_name;
 | 
				
			||||||
 | 
					    if (!g_ascii_strcasecmp(type, GLOG_TYPE_STDOUT)) {
 | 
				
			||||||
 | 
					        gutil_log_func = gutil_log_stdout;
 | 
				
			||||||
 | 
					        return TRUE;
 | 
				
			||||||
 | 
					    } if (!g_ascii_strcasecmp(type, GLOG_TYPE_STDERR)) {
 | 
				
			||||||
 | 
					        gutil_log_func = gutil_log_stderr;
 | 
				
			||||||
 | 
					        return TRUE;
 | 
				
			||||||
 | 
					#if GLOG_GLIB
 | 
				
			||||||
 | 
					    } else if (!g_ascii_strcasecmp(type, GLOG_TYPE_GLIB)) {
 | 
				
			||||||
 | 
					        gutil_log_func = gutil_log_glib;
 | 
				
			||||||
 | 
					        return TRUE;
 | 
				
			||||||
 | 
					#endif /* GLOG_GLIB */
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					gutil_log_get_type()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return (gutil_log_func == gutil_log_stdout) ? GLOG_TYPE_STDOUT :
 | 
				
			||||||
 | 
					           (gutil_log_func == gutil_log_stderr) ? GLOG_TYPE_STDERR :
 | 
				
			||||||
 | 
					#if GLOG_SYSLOG
 | 
				
			||||||
 | 
					           (gutil_log_func == gutil_log_syslog) ? GLOG_TYPE_SYSLOG :
 | 
				
			||||||
 | 
					#endif /* GLOG_SYSLOG */
 | 
				
			||||||
 | 
					#if GLOG_GLIB
 | 
				
			||||||
 | 
					           (gutil_log_func == gutil_log_glib)   ? GLOG_TYPE_GLIB :
 | 
				
			||||||
 | 
					#endif /* GLOG_GLIB */
 | 
				
			||||||
 | 
					                                                  GLOG_TYPE_CUSTOM;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
		Reference in New Issue
	
	Block a user