⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parserc.c

📁 使用TAP的蜂窝型GSM手机短消息服务中心
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static char *strdup_number(char *str){	char 	*ptr,		*dst,		*number;		number = (char *)malloc(sizeof(char) * (sms_strlen(str) +1));	if (number == NULL)	{		lprintf(LOG_ERROR, "Allocating memory\n");		exit(EMALLOC);	}		dst = number;	ptr = str;	while(*ptr != '\0')	{		if (*ptr == ':')		{	dst = number;		}		else		{	*dst = *ptr;			dst++;				}					ptr++;	}	*dst = '\0';		return number;	}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */SMS_list *add_number(SMS_list *list, char *id, char *number, char *default_service){	char 	*mnumber,		*mservice;	mnumber  = strdup_number(number);	mservice = strdup_service(number);	if (strcmp(mservice, "") == 0)	{		if (mnumber[0] != '_')		{		list = add_item(list, id, default_service, mnumber);		}		else		{		list = add_item(list, id, default_service, &mnumber[1]);		}	}	else	{		if (mnumber[0] != '_')		{		list = add_item(list, id, mservice, mnumber);		}		else		{		list = add_item(list, id, default_service, &mnumber[1]);		}	}	free(mnumber);	free(mservice);	return list;}	/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static SMS_list *expandnumber(FILE *fp[2], char *id, char *str, char *default_service){	char 	*src,		*dst,	 	*number,		*value;		int 	len, num;	SMS_list		*list,		*sub_list;				if (str == NULL)	{	return NULL;	}		len = sms_strlen(str);			number = (char *)malloc(sizeof(char) * (len +1));	if (number == NULL)	{		lprintf(LOG_ERROR, "Allocating memory\n");		exit(EMALLOC);	}	list = NULL;	dst = number;	src = str;	num = 1;	while (*src != '\0')	{		if (*src == ',')		{			*dst = '\0';			if (is_name(number))			{				/* Expand number */				if (find_number(search_list, number) != NULL)				{					lprintf(LOG_WARNING, "Circular list detected\n");				}				else				{	search_list = add_item(search_list, "", "", number);						value = SMS_dual_get_smsrc_value(fp, number);					if (value != NULL)					{						sub_list = expandnumber(fp, number, value, default_service);						list     = insert_list(list, sub_list);					}					else					{	list = add_number(list, id, number, default_service);					}				}				}			else			{	list = add_number(list, id, number, default_service);			}			dst = number;			num++;		}		else		{	*dst = *src;			dst++;		}		src++;	}	*dst = '\0';	if (is_name(number))	{		/* Expand number */		if (find_number(search_list, number) != NULL)		{			lprintf(LOG_WARNING, "Circular list detected\n");		}		else		{	search_list = add_item(search_list, "", "", number);				value = SMS_dual_get_smsrc_value(fp, number);			if (value != NULL)			{				sub_list = expandnumber(fp, number, value, default_service);				list     = insert_list(list, sub_list);			}			else			{	list = add_number(list, id, number, default_service);			}		}		}	else	{	list = add_number(list, id, number, default_service);	}	free(number);		return list;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */SMS_list *SMS_expandnumber(FILE *fp[2], char *id, char *number, char *default_service){	SMS_list		*list;			search_list = NULL;	list = expandnumber(fp, id, number, default_service);	free_list(search_list);	return list;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static void read_services(void){	char 	fname[1024],		dname[1024];	int	num,		i;	DIR 	*dp;	struct 	dirent 		*ep;	sms_strcpy(dname, SERVICEDIR);	sms_strcat(dname, "/services");	dp = opendir (dname);        if (dp == NULL)	{	lprintf(LOG_ERROR, "Opening Services directory %s\n", dname); 		exit(-1);	}	num = 0;	while ((ep = readdir(dp)))	{		if (ep->d_name[0] == '.')		{	continue;		}		num++;	}	SMS_services_list = (RESOURCE *)malloc(sizeof(RESOURCE) * (num +1));	if (SMS_services_list == NULL)	{	lprintf(LOG_ERROR, "Allocating memory for SMS_services_list\n");		exit(-1);	}	i = 0;	rewinddir(dp);	while ((ep = readdir(dp)))	{		if (ep->d_name[0] == '.')		{	continue;		}		SMS_services_list[i].type = RESOURCE_STRING;		SMS_services_list[i].name = malloc(sms_strlen("SMS_protocol_") + sms_strlen(ep->d_name) +1);		if (SMS_services_list[i].name == NULL)		{	lprintf(LOG_ERROR, "Allocating memory for SMS_services_list[%d].name\n", i);			exit(-1);		}		sms_strcpy(SMS_services_list[i].name, "SMS_protocol_");		sms_strcat(SMS_services_list[i].name, ep->d_name);		SMS_services_list[i].found = 0;		SMS_services_list[i].default_warning = 1; 		SMS_services_list[i].str_value = NULL; 		SMS_services_list[i].int_value = 0; 		SMS_services_list[i].default_str_value = NULL; 		SMS_services_list[i].default_int_value = 0; 		SMS_services_list[i].var = NULL; 		i++;	}	SMS_services_list[i].type = RESOURCE_NULL;	SMS_services_list[i].name = NULL;	SMS_services_list[i].found = 0;	SMS_services_list[i].default_warning = 1; 	SMS_services_list[i].str_value = NULL; 	SMS_services_list[i].int_value = 0; 	SMS_services_list[i].default_str_value = NULL; 	SMS_services_list[i].default_int_value = 0; 	SMS_services_list[i].var = NULL;	sms_strcpy(fname, SERVICEDIR);	sms_strcat(fname, "/sms_services");	if (read_resource_file(fname, SMS_services_list, FALSE) != RESOURCE_FILE_OK)	{	lprintf(LOG_ERROR, "Unrecoverable Failure Parsing service file %s\n", fname); 		exit(-1);	}}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */char *get_protocol(char *service){	char	name[512];	RESOURCE		*resource;	if (SMS_services_list == NULL)	{	read_services();	}	sms_strcpy(name, "SMS_protocol_");	sms_strcat(name, service);	resource = SMS_services_list;	while (resource->type != RESOURCE_NULL)	{		if (strcmp(name, resource->name) == 0)		{	lprintf(LOG_VERBOSE, "Found %s = %s\n", resource->name, resource->str_value);			return resource->str_value;		}		resource++;	}	return NULL;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */int validate_expanded_numbers(SMS_list *numbers){	DEVICE_ENTRY		*device;	char	*id,		*service,		*protocol;	int	count;	SMS_list		*node;	count = 0;			node = get_first(numbers);	while (node != NULL)	{		service  = get_service(node);		protocol = get_protocol(service);		device = get_device(protocol);		if (device == NULL)		{	lprintf(LOG_ERROR, "Driver for service %s NOT found\n", service);			count++;		}		else		{	id = get_number(node);			if (!((*device->validate_id)(id)))			{				lprintf(LOG_WARNING, "Invalid id: %s\n", id);				count++;			}		}			node = get_next(node);	}	return count;}	/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */int is_numeric(char *ptr){	while (*ptr != '\0')	{		if (!isdigit(*ptr))		{	return FALSE;		}		ptr++;	}	return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -