mdc.h

#ifndef __zlog_mdc_h
#define __zlog_mdc_h #include "zc_defs.h" typedef struct zlog_mdc_s zlog_mdc_t;
struct zlog_mdc_s{
zc_hashtable_t *tab;
}; zlog_mdc_t *zlog_mdc_new(void);
void zlog_mdc_del(zlog_mdc_t *a_mdc);
void zlog_mdc_profile(zlog_mdc_t *a_mdc, int flag); void zlog_mdc_clean(zlog_mdc_t *a_mdc);
int zlog_mdc_put(zlog_mdc_t *a_mdc, const char *key, const char *value);
char *zlog_mdc_get(zlog_mdc_t *a_mdc, const char *key);
void zlog_mdc_remove(zlog_mdc_t *a_mdc, const char *key); typedef struct zlog_mdc_kv_s{
char key[MAXLEN_PATH + ];
char value[MAXLEN_PATH + ];
size_t value_len;
}zlog_mdc_kv_t; zlog_mdc_kv_t *zlog_mdc_get_kv(zlog_mdc_t *a_mdc, const char *key); #endif

mdc.c

/**
* 文件作用
*/ #include <stdlib.h>
#include <stdio.h>
#include <errno.h> #include "mdc.h"
#include "zc_defs.h" void zlog_mdc_profile(zlog_mdc_t *a_mdc, int flag){
zc_assert(a_mdc,); zc_hashtable_entry_t *a_entry;
zlog_mdc_kv_t *a_mdc_kv; zc_hashtable_foreach(a_mdc->tab, a_entry){
a_mdc_kv = a_entry->value;
zc_profile(flag, "---mdc_kv[%p][%s]-[%s]---",
a_mdc_kv,
a_mdc_kv->key,
a_mdc_kv->value
);
}
return;
} //-------------------------------------------------------------------------
void zlog_mdc_del(zlog_mdc_t *a_mdc){
zc_assert(a_mdc,);
if(a_mdc->tab){
zc_hashtable_del(a_mdc->tab);
}
free(a_mdc);
zc_debug("zlog_mdc_del[%p]", a_mdc);
return;
} static void zlog_mdc_kv_del(zlog_mdc_kv_t *a_mdc_kv){
free(a_mdc_kv);
zc_debug("zlog_mdc_kv_del[%p]", a_mdc_kv);
return;
} /**
* struct zlog_mdc_kv_s{
* char key[MAXLEN_PATH + 1];
* char value[MAXLEN_PATH + 1];
* size_t value_len;
* }
*/
static zlog_mdc_kv_t *zlog_mdc_kv_new(const char *key, const char *value){
zlog_mdc_kv_t *a_mdc_kv; a_mdc_kv = (zlog_mdc_kv_t *)calloc(, sizeof(zlog_mdc_kv_t));
if(!a_mdc_kv){
zc_error("calloc fail, errno[%d]", errno);
return NULL;
} snprintf(a_mdc_kv->key, sizeof(a_mdc_kv->key), "%s", key);
a_mdc_kv->value_len = snprintf(a_mdc_kv->value, sizeof(a_mdc_kv->value), "%s", value);
return a_mdc_kv;
} /**
* struct zlog_mdc_s{
* zc_hashtable_t *tab;
* }
*/
zlog_mdc_t *zlog_mdc_new(void){
zlog_mdc_t *a_mdc; a_mdc = calloc(, sizeof(zlog_mdc_t));
if(!a_mdc){
zc_error("calloc fail, errno[%d]", errno);
return NULL;
} a_mdc->tab = zc_hashtable_new(
,
zc_hashtable_str_hash,
zc_hashtable_str_equal,
NULL,
(zc_hashtable_del_fn) zlog_mdc_kv_del
);
if(!a_mdc->tab){
zc_error("zc_hashtable_new_fail");
goto err;
} return a_mdc;
err:
zlog_mdc_del(a_mdc);
return NULL;
} int zlog_mdc_put(zlog_mdc_t *a_mdc, const char *key, const char *value){
zlog_mdc_kv_t *a_mdc_kv; a_mdc_kv = zlog_mdc_kv_new(key, value);
if(!a_mdc_kv){
zc_error("zlog_new_kv_new failed");
return -;
} if(zc_hashtable_put(a_mdc->tab, a_mdc_kv->key, a_mdc_kv)){
zc_error("zc_hashtable_put fail");
zlog_mdc_kv_del(a_mdc_kv);
return -;
} return ;
} char *zlog_mdc_get(zlog_mdc_t *a_mdc, const char *key){
zlog_mdc_kv_t *a_mdc_kv; a_mdc_kv = zc_hashtable_get(a_mdc->tab, key);
if(!a_mdc_kv){
zc_error("zc_hashtable_get fail");
return NULL;
}else{
return a_mdc_kv->value;
}
} zlog_mdc_kv_t *zlog_mdc_get_kv(zlog_mdc_t *a_mdc, const char *key){
zlog_mdc_kv_t *a_mdc_kv; a_mdc_kv = zc_hashtable_get(a_mdc->tab, key);
if(!a_mdc_kv){
zc_error("zc_hashtable_get fail");
return NULL;
}else{
return a_mdc_kv;
}
} void zlog_mdc_remove(zlog_mdc_t *a_mdc, const char *key){
zc_hashtable_remove(a_mdc->tab, key);
return;
} void zlog_mdc_clean(zlog_mdc_t *a_mdc){
zc_hashtable_clean(a_mdc->tab);
return;
}

test_mdc.c

#include <stdio.h>
#include <string.h>
#include <time.h> #include "zc_defs.h"
#include "zc_hashtable.h"
#include "mdc.h" #include "zc_profile.c" #include "mdc.c"
#include "zc_hashtable.c" int main(){
zlog_mdc_t *a_mdc;
a_mdc = zlog_mdc_new();
if(!a_mdc){
fprintf(stderr, "%s", "zlog_mdc_new fail");
return -;
} zlog_mdc_put(a_mdc, "name", "jimmy");
char *name = zlog_mdc_get(a_mdc, "name");
printf("name = %s\n", name); time_t tt;
struct tm timer;
char time_str[];
time(&tt);
localtime_r(&tt, &timer);
strftime(time_str, , "%Y-%m-%d %H:%M:%S", &timer);
zlog_mdc_put(a_mdc, "time", time_str);
char *ps = zlog_mdc_get(a_mdc, "time");
printf("time = %s\n", ps); zlog_mdc_profile(a_mdc, ZC_DEBUG);
zlog_mdc_clean(a_mdc);
zlog_mdc_profile(a_mdc, ZC_DEBUG); zlog_mdc_del(a_mdc);
}

zlog学习笔记(mdc)的更多相关文章

  1. zlog学习笔记(level_list)

    level_list.h /** * */ #ifndef __zlog_level_list_h #define __zlog_level_list_h zc_arraylist_t *zlog_l ...

  2. zlog学习笔记(level)

    level.h /** * */ #ifndef __zlog_level_h #define __zlog_level_h #include "stdio.h" #include ...

  3. zlog学习笔记(zc_hashtable)

    zc_hashtable.h /** * hashtable */ #ifndef __zc_hashtable_h #define __zc_hashtable_h typedef struct z ...

  4. zlog学习笔记(zc_arraylist)

    zc_arraylist.h /** * 实现类似列表的功能 * */ #ifndef __zc_arraylist_h #define __zc_arraylist_h #define ARRAY_ ...

  5. zlog学习笔记(zc_profile)

    zc_profile.h #ifndef __zlog_profile_h #define __zlog_profile_h #define EMPTY() #define zc_assert(exp ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. 【Visual C++】游戏编程学习笔记之四:透明动画实现

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...

  8. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  9. 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

随机推荐

  1. 如何自定义ViewGroup

    依照惯例,先从一个例子说起. 很简单,3张扑克牌叠在一起显示.这个布局效果该如何实现呢?有的同学该说了,这很简单啊,用RelativeLayout或FrameLayout,然后为每一个扑克牌设置mar ...

  2. ReactiveCocoa基础知识内容2

    引用网络上一些实例的代码,针对ReactiveCocoa的运用可以更加有帮助: 1:跟AF结合时的写法,返回RACSignal - (RACSignal *)fetchQuestionWithTag: ...

  3. iOS 从应用中跳转至系统设置页面里的多种设置页面

    我们在开发app过程中很多时候会需要设置系统权限,这时就需要在应用中跳转至系统设置页面权限设置页面,以下是自己结合网上的资料总结的一些经验: 直接从应用中跳转至系统设置中这个应用的权限设置页面 NSU ...

  4. 网络热恋之XML解析

    XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...

  5. 【原】你真的懂iOS的autorelease吗?

    或许这个题目起得有点太高调了,不过我只是想纠正一些童鞋对于autorelease的认识,如果能帮到几个人,那这篇文章也就值得了!当然,高手请绕道 本文主要探讨两个方面:(1)autorelease对象 ...

  6. mvc4 用NPOI导出Excel

    第一次做数据导出Excel,刚看到这个的时候,首先想到的就是新建一个excel的文件,然后将它下载,后来询问别人,他们都推荐使用NPOI,发现这个很好用,就用博客记录一下 1.引用NPOI包 2.导出 ...

  7. Lambda 表达式(C# 编程指南) 微软microsoft官方说明

    Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...

  8. 开启Tomcat 源码调试

    开启Tomcat 源码调试 因为工作的原因,需要了解Tomcat整个架构是如何设计的,正如要使用Spring MVC进行Web开发,需要了解Spring是如何设计的一样,有哪些主要的类,分别是用于干什 ...

  9. SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过

    SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过     存储过程 创建存储过程 use pubs --pubs为数据库 go create proc ...

  10. hw 要的是螺丝钉

    日前突然接到华为HR的电话,叫我去面试。本来我的工作和工资收入等各方面在本地也还算可以,没有想要跳槽。但是本着去看看有没有更好机会的想法就去了。  9:30到了现场后,在那里等了很久,一个考官上来问了 ...