zlog学习笔记(level)

level.h

/**
 *
 */

#ifndef __zlog_level_h
#define __zlog_level_h

#include "stdio.h"
#include "zc_defs.h"

typedef struct zlog_level_s {
        int int_level;
        char str_uppercase[MAXLEN_PATH + 1];
        char str_lowercase[MAXLEN_PATH + 1];
        size_t str_len;
        int syslog_level;
} zlog_level_t;

zlog_level_t *zlog_level_new(char *line);
void zlog_level_del(zlog_level_t *a_level);
void zlog_level_profile(zlog_level_t *a_level, int flag);

#endif

level.c

#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <syslog.h>

#include "zc_defs.h"
#include "level.h"

void zlog_level_profile(zlog_level_t *a_level, int flag){
        zc_assert(a_level,);
        zc_profile(flag, "---level[%p][%d,%s,%s,%d,%d]---",
                a_level,
                a_level->int_level,
                a_level->str_uppercase,
                a_level->str_lowercase,
                (int) a_level->str_len,
                a_level->syslog_level);
        return;
}

void zlog_level_del(zlog_level_t *a_level){
        zc_assert(a_level,);
        free(a_level);
        zc_debug("zlog_level_del[%p]", a_level);
        return;
}

static int syslog_level_atoi(char *str){
        //notice -187
        zc_assert(str, -187);
        if(STRICMP(str, ==, "LOG_EMERG")){
                return LOG_EMERG;
        }
        if(STRICMP(str, ==, "LOG_ALERT")){
                return LOG_ALERT;
        }
        if(STRICMP(str, ==, "LOG_CRIT")){
                return LOG_CRIT;
        }
        if(STRICMP(str, ==, "LOG_ERR")){
                return LOG_ERR;
        }
        if(STRICMP(str, ==, "LOG_WARNING")){
                return LOG_WARNING;
        }
        if(STRICMP(str, ==, "LOG_NOTICE")){
                return LOG_NOTICE;
        }
        if(STRICMP(str, ==, "LOG_INFO")){
                return LOG_INFO;
        }
        if(STRICMP(str, ==, "LOG_DEBUG")){
                return LOG_DEBUG;
        }
        zc_error("wrong syslog level[%s]", str);
        return -187;
}

/* line: TRACE = 10, LOG_ERR */
zlog_level_t *zlog_level_new(char *line){
        zlog_level_t *a_level = NULL;
        int i, nscan, l = 0;
        char str[MAXLEN_CFG_LINE + 1];
        char sl[MAXLEN_CFG_LINE + 1];

        zc_assert(line, NULL);

        memset(str, 0x00, sizeof(str));
        memset(sl, 0x00, sizeof(str));

        nscan = sscanf(line, " %[^= \t] = %d ,%s", str, &l, sl);
        if(nscan < 2){
                zc_error("level[%s], syntax wrong", line);
                return NULL;
        }

        //check level and str
        if((l < 0) || (l > 255)){
                zc_error("l[%d] not in [0, 255], wrong", l);
                return NULL;
        }
        if(str[0] == ‘\0‘){
                zc_error("str[0] == 0");
                return NULL;
        }

        a_level = calloc(1, sizeof(zlog_level_t));
        if(!a_level){
                zc_error("calloc fail, errno[%d]", errno);
                return NULL;
        }
        a_level->int_level = l;

        //fill syslog level
        if(sl[0] == ‘\0‘){
                a_level->syslog_level = LOG_DEBUG;
        }else{
                a_level->syslog_level = syslog_level_atoi(sl);
                if(a_level->syslog_level == -187){
                        zc_error("syslog_level_atoi fail");
                        goto err;
                }
        }

        //strncpy and toupper(str)
        for(i = 0; (i < sizeof(a_level->str_uppercase) - 1) && str[i] != ‘\0‘; i++){
                a_level->str_uppercase[i] = toupper(str[i]);
                a_level->str_lowercase[i] = tolower(str[i]);
        }

        //notice: overflow
        if(str[i] != ‘\0‘){
                zc_error("not enough space for str, str[%s] > %d", str, i);
                goto err;
        }else{
                a_level->str_uppercase[i] = ‘\0‘;
                a_level->str_lowercase[i] = ‘\0‘;
        }

        a_level->str_len = i;

        return a_level;
err:
        zc_error("line[%s]", line);
        zlog_level_del(a_level);
        return NULL;
}

test_level.c

#include "zc_defs.h"
#include "level.h"

#include "zc_profile.c"
#include "level.c"

int main(){
        zlog_level_t *a_level = zlog_level_new("TRACE = 10, LOG_ERR");

        zlog_level_profile(a_level, ZC_DEBUG);

        zlog_level_del(a_level);
}
时间: 2024-10-17 13:00:02

zlog学习笔记(level)的相关文章

zlog学习笔记(level_list)

level_list.h /** * */ #ifndef __zlog_level_list_h #define __zlog_level_list_h zc_arraylist_t *zlog_level_list_new(void); void zlog_level_list_del(zc_arraylist_t *levels); void zlog_level_list_profile(zc_arraylist_t *levels, int flag); /* notice */ in

zlog学习笔记(zc_hashtable)

zc_hashtable.h /** * hashtable */ #ifndef __zc_hashtable_h #define __zc_hashtable_h typedef struct zc_hashtable_entry_s { unsigned int hash_key; void *key; void *value; struct zc_hashtable_entry_s *prev; struct zc_hashtable_entry_s *next; } zc_hashta

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系

OpenGL_Qt学习笔记之_05(纹理映射)(转)

转自:http://www.cnblogs.com/tornadomeet/archive/2012/08/24/2654719.html 纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个词好专业(毕竟没有学过图形学),后面经过网上查找资料和这次实验稍微理解了点.纹理映射简单的讲,就是把一个纹理(其实说白了,纹理可以理解为一幅图像)映射到空间物体的表面上,因此纹理映射也叫贴图,这个表明不一定是矩形,比如说我可以是球面,或者是任意曲面.在上一篇文章OpenGL_Qt学习笔记之_04(3

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

Maven学习笔记

Maven学习笔记 Maven是项目管理工具 1. 安装Maven 在apache官网(http://maven.apache.org/download.cgi) 下载apache-maven-3.3.3-bin.zip和apache-maven-3.3.3-src.zip:解压,把bin的位置设在环境变量里, 新建环境变量名:MAVEN_HOME 值:C:\Users\pengtao.yue\apache-maven-3.3.3\bin 在path中加入:%MAVEN_HOME% 在DOS中输

RFC学习笔记 -- 5245 ICE &amp; 3261 SIP

---------------------------------------------------------------------------- RFC list: 3550 (rtp/rtcp)  - 3711(srtp) - 5245 (ice) - 3261(sip) - 4575(sip-conference) - 4566(sdp) 5389 (stun) - 5766(turn) - 6455(websocket) - 6865(fec) - 2616(http) -----

ICMP:Internet控制报文协议实现学习笔记

ICMP是网络层的一个协议,可以看作IP协议的附属协议,因为它主要被IP用来与其他主机或路由器交换错误报文及其他需要注意的信息.当然,更高层协议(tcp/udp)甚至有些用户进程也可能用到ICMP报文 注册ICMP协议和ICMP协议的处理涉及以下文件: net/ipv4/icmp.c ICMP协议处理入口 net/ipv4/af_inet.c 网络层和传输层接口 ICMP报文结构 参见tcp/ip协议学习笔记(5)Internet Control Message Protocol(ICMP) 注

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口