?? parserc.c
字號:
/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */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 + -