Пример #1
0
static error_code_t _on_field_list(generator_types_h_t *self, const syn_field_list_t *field_list)
{
	uint32_t i;
	for(i = 0; i < field_list->field_list_num; ++i)
	{
		if(field_list->field_list[i].type.type == E_SNT_CONTAINER)
		{
			//为vector对象自动生成一个计数器对象, 所以一个vector类型的对象需要占用两个符号。
			if(field_list->field_list[i].type.ct.ct == E_CT_VECTOR)
			{
				generator_print(&self->super, 1, "");
				generator_print_ctype(&self->super, &g_vec_num_type);
				
				generator_printline(&self->super, 0, " "VEC_NUM_TYPE_STYLE";", field_list->field_list[i].identifier);
				
				
				generator_print(&self->super, 1, "");
				generator_print_ctype(&self->super, &field_list->field_list[i].type.ct.vector_type);
				
				generator_print(&self->super, 0, " %s", field_list->field_list[i].identifier);				
				generator_print(&self->super, 0, "[%s]", field_list->field_list[i].type.ct.vector_length);
				if(field_list->field_list[i].type.ct.vector_type.st == E_ST_STRING)
				{
					generator_print(&self->super, 0, "[%s]", field_list->field_list[i].type.ct.vector_type.string_length);
				}				
			}
		}
		else
		{
			generator_print(&self->super, 1, "");
			generator_print_ctype(&self->super, &field_list->field_list[i].type.st);
			generator_print(&self->super, 0, " %s", field_list->field_list[i].identifier);

			if(field_list->field_list[i].type.st.st == E_ST_STRING)
			{
				generator_print(&self->super, 0, "[%s]", field_list->field_list[i].type.st.string_length);
			}
			generator_print(&self->super, 0, "");
		}

		generator_print(&self->super, 0, ";");
		if(field_list->field_list[i].comment.text[0])
		{
			generator_print(&self->super, 0, "//%s", field_list->field_list[i].comment.text);
		}
		generator_printline(&self->super, 0, "");
	}

	return E_TD_NOERROR;
}
Пример #2
0
static error_code_t _on_union(td_generator_writer_h_t *self, const syn_union_t *de_union)
{
	generator_print(&self->super, 0, "tlibc_error_code_t tlibc_write_%s(tlibc_abstract_writer_t *self, const union %s *data, ", de_union->name, de_union->name);
	generator_print_ctype(&self->super, &de_union->parameters.par_list[0].type);
	generator_printline(&self->super, 0, " selector);");
	generator_printline(&self->super, 0, "");
	return E_TD_NOERROR;
}
Пример #3
0
static error_code_t _on_typedef(generator_types_h_t *self, const syn_typedef_t *de_typedef)
{
	generator_print(&self->super, 0, "typedef ");
	generator_print_ctype(&self->super, &de_typedef->type);
	generator_print(&self->super, 0, " %s", de_typedef->name);
	if(de_typedef->type.st == E_ST_STRING)
	{
		generator_print(&self->super, 0, "[%s]", de_typedef->type.string_length);
	}
	generator_print(&self->super, 0, ";");
	generator_printline(&self->super, 0, "");
	return E_TD_NOERROR;
}
Пример #4
0
//todo优化字符串匹配代码
static error_code_t _on_enum(generator_reader_c_t *self, const syn_enum_t *de_enum)
{
	uint32_t i;
	
	generator_printline(&self->super, 0, "tlibc_error_code_t tlibc_read_%s(tlibc_abstract_reader_t *self, enum %s *data)", de_enum->name, de_enum->name);
	generator_printline(&self->super, 0, "{");
	generator_printline(&self->super, 0, "\ttlibc_error_code_t ret = E_TLIBC_NOERROR;");
	generator_printline(&self->super, 0, "\tif((ret = tlibc_read_enum_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name);
	generator_printline(&self->super, 0, "");
	generator_print(&self->super, 0, "\tret = tlibc_read_");
	generator_print_type_name(&self->super, &g_enum_type);
	generator_print(&self->super, 0, "(self, (");
	generator_print_ctype(&self->super, &g_enum_type);
	generator_printline(&self->super, 0, "*)data);");
	

	generator_printline(&self->super, 0, "\tif(ret == E_TLIBC_PLEASE_READ_ENUM_NAME)");
	generator_printline(&self->super, 0, "\t{");
	generator_printline(&self->super, 0, "\t\tchar name[TLIBC_MAX_LENGTH_OF_IDENTIFIER];");
	generator_printline(&self->super, 0, "\t\tif((ret = tlibc_read_string(self, name, TLIBC_MAX_LENGTH_OF_IDENTIFIER)) != E_TLIBC_NOERROR) goto done;");

	generator_printline(&self->super, 0, "\t\tfor(;;)");
	generator_printline(&self->super, 0, "\t\t{");
	for(i = 0; i < de_enum->enum_def_list_num; ++i)
	{
		generator_printline(&self->super, 0, "\t\t\tif(strcmp(name, \"%s\") == 0)", de_enum->enum_def_list[i].identifier);
		generator_printline(&self->super, 0, "\t\t\t{");
		generator_printline(&self->super, 0, "\t\t\t\t*data = %s;", de_enum->enum_def_list[i].identifier);
		generator_printline(&self->super, 0, "\t\t\t\tbreak;");
		generator_printline(&self->super, 0, "\t\t\t}");
	}
	generator_printline(&self->super, 0, "");
	generator_printline(&self->super, 0, "\t\t\tret = E_TLIBC_NOT_FOUND;");
	generator_printline(&self->super, 0, "\t\t\tgoto done;");
	generator_printline(&self->super, 0, "\t\t}");
	generator_printline(&self->super, 0, "\t}");
	generator_printline(&self->super, 0, "\telse if(ret != E_TLIBC_NOERROR)");
	generator_printline(&self->super, 0, "\t{");
	generator_printline(&self->super, 0, "\t\tgoto done;");
	generator_printline(&self->super, 0, "\t}");
	
	generator_printline(&self->super, 0, "");
	generator_printline(&self->super, 0, "");
	generator_printline(&self->super, 0, "\tif((ret = tlibc_read_enum_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name);
	generator_printline(&self->super, 0, "done:");
	generator_printline(&self->super, 0, "\treturn ret;");	
	generator_printline(&self->super, 0, "}");
	generator_printline(&self->super, 0, "");

	return E_TD_NOERROR;
}
Пример #5
0
static error_code_t _on_enum(generator_writer_c_t *self, const syn_enum_t *de_enum)
{
	uint32_t i;
	generator_printline(&self->super, 0, "");
	generator_printline(&self->super, 0, "tlibc_error_code_t tlibc_write_%s(tlibc_abstract_writer_t *self, const enum %s *data)", de_enum->name, de_enum->name);
	generator_printline(&self->super, 0, "{");
	generator_printline(&self->super, 0, "\ttlibc_error_code_t ret = E_TLIBC_NOERROR;");
	generator_printline(&self->super, 0, "\tif((ret = tlibc_write_enum_begin(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name);
	generator_printline(&self->super, 0, "");
	generator_print(&self->super, 0, "\tret = tlibc_write_");
	generator_print_type_name(&self->super, &g_enum_type);
	generator_print(&self->super, 0, "(self, (const ");
	generator_print_ctype(&self->super, &g_enum_type);
	generator_printline(&self->super, 0, "*)data);");
	
	
	generator_printline(&self->super, 0, "\tif(ret == E_TLIBC_PLEASE_READ_ENUM_NAME)");
	generator_printline(&self->super, 0, "\t{");

	generator_printline(&self->super, 0, "\t\tswitch(*data)");
	generator_printline(&self->super, 0, "\t\t{");
	for(i = 0; i < de_enum->enum_def_list_num; ++i)
	{
		generator_printline(&self->super, 0, "\t\tcase %s:", de_enum->enum_def_list[i].identifier);
		generator_printline(&self->super, 0, "\t\t\tif((ret = tlibc_write_string(self, \"%s\", %u)) == E_TLIBC_NOERROR) break;", de_enum->enum_def_list[i].identifier, strlen(de_enum->enum_def_list[i].identifier));
		generator_printline(&self->super, 0, "\t\t\tbreak;");
	}
	generator_printline(&self->super, 0, "\t\tdefault:");
	generator_printline(&self->super, 0, "\t\t\tret = E_TLIBC_NOT_FOUND;");
	generator_printline(&self->super, 0, "\t\t\tgoto done;");
	generator_printline(&self->super, 0, "\t\t}");
	generator_printline(&self->super, 0, "\t}");
	generator_printline(&self->super, 0, "\telse if(ret != E_TLIBC_NOERROR)");
	generator_printline(&self->super, 0, "\t{");
	generator_printline(&self->super, 0, "\t\tgoto done;");
	generator_printline(&self->super, 0, "\t}");


	generator_printline(&self->super, 0, "");
	generator_printline(&self->super, 0, "");
	generator_printline(&self->super, 0, "\tif((ret = tlibc_write_enum_end(self, \"%s\")) != E_TLIBC_NOERROR) goto done;", de_enum->name);		
	generator_printline(&self->super, 0, "done:");
	generator_printline(&self->super, 0, "\treturn ret;");	
	generator_printline(&self->super, 0, "}");


	return E_TD_NOERROR;
}
Пример #6
0
static error_code_t _on_union_field_list(generator_types_h_t *self, const syn_union_field_list_t *union_field_list)
{
	uint32_t i;
	for(i = 0; i < union_field_list->union_field_list_num; ++i)
	{
		generator_print(&self->super, 1, "");
		generator_print_ctype(&self->super, &union_field_list->union_field_list[i].simple_type);
		generator_print(&self->super, 0, " %s", union_field_list->union_field_list[i].name);

		if(union_field_list->union_field_list[i].simple_type.st == E_ST_STRING)
		{
			generator_print(&self->super, 0, "[%s]", union_field_list->union_field_list[i].name, union_field_list->union_field_list[i].simple_type.string_length);
		}
		
		generator_print(&self->super, 0, ";");
		if(union_field_list->union_field_list[i].comment.text[0])
		{
			generator_print(&self->super, 0, "//%s", union_field_list->union_field_list[i].comment.text);
		}
		generator_printline(&self->super, 0, "");
	}

	return E_TD_NOERROR;
}