📄 message.c
字号:
#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/time.h>#include <iconv.h>#include "common.h"#define UNKNOWN_NAME _("UnKnown")#define TO_CODE_SET "UTF-8"#define IPMSG_CODE_SET "SHIFT-JIS"#define FROM_CODE_SET IPMSG_CODE_SETconst char *refer_user_name_from_msg(const msg_data_t *msg){ if (!msg) return UNKNOWN_NAME; return (msg->username)?(msg->username):(UNKNOWN_NAME);}const char *refer_host_name_from_msg(const msg_data_t *msg){ if (!msg) return UNKNOWN_NAME; return (msg->hostname)?(msg->hostname):(UNKNOWN_NAME);}const char *refer_nick_name_from_msg(const msg_data_t *msg){ if (!msg) return UNKNOWN_NAME; return (msg->message)?(msg->message):(UNKNOWN_NAME);}const char *refer_group_name_from_msg(const msg_data_t *msg){ if (!msg) return UNKNOWN_NAME; return (msg->extstring)?(msg->extstring):(UNKNOWN_NAME);}intrefer_pkt_no_name_from_msg(const msg_data_t *msg){ return msg->pkt_seq_no;}intinit_message_data(msg_data_t *msg){ if (!msg) return -EINVAL; memset(msg,0,sizeof(msg_data_t)); msg->magic=IPMSG_MSG_MAGIC; return 0;}intrelease_message_data(msg_data_t *msg){ if ( (!msg) || (msg->magic!= IPMSG_MSG_MAGIC) ) return -EINVAL; if (msg->username) free(msg->username); if (msg->hostname) free(msg->hostname); if (msg->extstring) free(msg->extstring); if (msg->message) free(msg->message); msg->magic=0; return 0;}intparse_message(msg_data_t *msg,const char *message_buff,size_t len){ long int_val; char *sp=NULL; char *ep=NULL; char *buffer; ssize_t remains; int rc=0; if ( (!message_buff) || (!msg) || (msg->magic!= IPMSG_MSG_MAGIC) ) return -EINVAL; _assert(len>0); buffer=malloc(len); if (!buffer) return -ENOMEM; gettimeofday(&msg->tv, NULL); memcpy(buffer,message_buff,len); remains=len; /* * バージョン番号 */ sp=buffer; ep=memchr(sp, ':', remains); if (!ep) { rc=-EINVAL; goto err_out; } *ep='\0'; remains =len - ((unsigned long)ep-(unsigned long)buffer); if (remains<=0) { rc=-EINVAL; goto err_out; } ++ep; int_val=strtol(sp, (char **)NULL, 10); msg->version=int_val; dbg_out("Version:%d\n",msg->version); sp=ep; /* * シーケンス番号 */ ep=memchr(sp, ':', remains); if (!ep) { rc=-EINVAL; goto err_out; } *ep='\0'; remains =len - ((unsigned long)ep-(unsigned long)buffer); if (remains<=0) { rc=-EINVAL; goto err_out; } ++ep; int_val=strtol(sp, (char **)NULL, 10); msg->pkt_seq_no=int_val; dbg_out("pkt_no:%d(%x)\n",msg->pkt_seq_no,msg->pkt_seq_no); sp=ep; /* * 名前 */ ep=memchr(sp, ':', remains); if (!ep) { rc=-EINVAL; goto err_out; } *ep='\0'; remains =len - ((unsigned long)ep-(unsigned long)buffer); if (remains<=0) { rc=-EINVAL; goto err_out; } ++ep; msg->username=strdup(sp); dbg_out("Name:%s\n",msg->username); sp=ep; /* * ホスト名 */ ep=memchr(sp, ':', remains); if (!ep) { rc=-EINVAL; goto err_out; } *ep='\0'; remains =len - ((unsigned long)ep-(unsigned long)buffer); if (remains<=0) { rc=-EINVAL; goto err_out; } ++ep; msg->hostname=strdup(sp); dbg_out("Host:%s\n",msg->hostname); sp=ep; /* * コマンド番号 */ ep=memchr(sp, ':', remains); if (!ep) { rc=-EINVAL; goto err_out; } *ep='\0'; ++ep; int_val=strtol(sp, (char **)NULL, 10); msg->command=(int_val & 0xff); msg->command_opts=(int_val & ~0xffUL); dbg_out("Command:0x%x Option:0x%x\n",msg->command,msg->command_opts); sp=ep; /* *メッセージ本文 */ msg->message=strdup(sp); dbg_out("body:%s\n",msg->message); /* *拡張部 */ ep=memchr(sp, '\0', remains); if (!ep) { rc=-EINVAL; goto err_out; } if ( ((unsigned long)ep - (unsigned long)buffer) < len) { ++ep; sp=ep; msg->extstring=strdup(sp); dbg_out("extention:%s\n",msg->extstring); }err_out: free(buffer); return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -