예제 #1
0
int 
pbc_type(struct pbc_env * p, const char * type_name , const char * key , const char ** type) {
	struct _message *m = _pbcP_get_message(p, type_name);
	if (m==NULL) {
		return 0;
	}
	if (key == NULL) {
		return PBC_NOEXIST;
	}
	struct _field * field = (struct _field *)_pbcM_sp_query(m->name, key);
	return _pbcP_type(field, type);
}
예제 #2
0
파일: pattern.c 프로젝트: justnull/pbc
struct pbc_pattern * 
pbc_pattern_new(struct pbc_env * env , const char * message, const char * format, ... ) {
	struct _message *m = _pbcP_get_message(env, message);
	if (m==NULL) {
		return NULL;
	}
	int len = strlen(format);
	char temp[len+1];
	int n = _scan_pattern(format, temp);
	struct pbc_pattern * pat = _pbcP_new(n);
	int i;
	va_list ap;
	va_start(ap , format);

	const char *ptr = temp;

	for (i=0;i<n;i++) {
		struct _pattern_field * f = &(pat->f[i]);
		struct _field * field = _pbcM_sp_query(m->name, ptr);
		if (field == NULL)
			goto _error;
		f->id = field->id;
		f->ptype = field->type;
		*f->defv = *field->default_v;
		f->offset = va_arg(ap, int);

		ptr += strlen(ptr) + 1;

		f->ctype = _ctype(ptr);
		if (f->ctype < 0)
			goto _error;
		if (f->ctype == CTYPE_ARRAY && field->label == LABEL_PACKED) {
			f->ctype = CTYPE_PACKED;
		}
		if (_check_ctype(field, f))
			goto _error;

		ptr += strlen(ptr) + 1;
	}

	va_end(ap);

	pat->count = n;

	qsort(pat->f , n , sizeof(struct _pattern_field), _comp_field);

	return pat;
_error:
	free(pat);
	return NULL;
}