androidエンジニアリング文字列多言語翻訳漏れ検索ツール


Androidの学生たちは、どの工事にも多くの言語文字列があることを知っているに違いない.
翻訳が完全かどうかを検出する必要がある場合、文字列の比較効率が低すぎます.そのため、小さなツールのソースコードは次のようになります.
meld_string.c
#include<stdio.h>
#include<string.h>

#define LINE_BUFFER_SIZE 300
#define NAME_BUFFER_SIZE 100

void get_string_name(char* line, char* name);
int check_args(int argc, char** argv, char* ret);
int compared_file_with_string(FILE* file, char* string_name);


const char* string_line_head = "<string name=";
const char* null = 0l;

int main(int argc, char** argv){
	char* base_filename = NULL;
	char* compared_filename = NULL;
	char* result_filename = NULL;
	FILE *base_file;
	FILE *compared_file;
	FILE *result_file;
	char buffer[LINE_BUFFER_SIZE];
	char name[NAME_BUFFER_SIZE];
	int result = 0;

	//         
	if(argc <= 1){
		printf("
Please input files' name and retry!

"); return 0; } if(argc == 3){ result_filename = "result"; } else if(argc == 4){ result_filename = argv[3]; } else{ printf("
Please input args as ./exc base_file_name compared_file_name [result_file_name] and retry!

"); return 0; } base_filename = argv[1]; compared_filename = argv[2]; //printf("base filename is: %s
", base_filename); if((base_file = fopen(base_filename, "r")) == NULL){ printf("open %s error!!
", base_filename); return 0; } if((compared_file = fopen(compared_filename, "r")) == NULL){ printf("open %s error!!
", compared_filename); return 0; } if((result_file = fopen(result_filename, "w+")) == NULL){ printf("open %s error!!
", result_filename); return 0; } while(!feof(base_file)){ buffer[0] = '\0'; fgets(buffer, sizeof(buffer), base_file); //printf("read line: %s", buffer); if(0 == line_with_string_line_head(buffer)){ get_string_name(buffer, name); //printf("---------base file name = %s
", name); result = compared_file_with_string(compared_file, name); if(result == 0){ // } else{ // // printf("%s
", buffer); fputs(buffer, result_file); } rewind(compared_file); } } fclose(base_file); fclose(compared_file); fclose(result_file); printf("
Completed and printed to file named \"%s\" !!!

", result_filename); return 0; } /** * * 0: * : **/ int check_args(int argc, char** argv, char *result){ //printf("meld_string, the number of arguments == %d
", argc); return 0; } /** * **/ void get_string_name(char* line, char* name){ char* h = line; char *start = NULL, *end = NULL; int length = 0; while(*(h) != '\0'){ if(*h == '\"'){ if(start == NULL){ start = h + 1; } else if(end == NULL){ end = h - 1; break; } } h++; } if(start != NULL && end != NULL){ length = (int)(end - start) + 1; strncpy(name, start, length); name[length] = '\0'; //very importent } else{ return; } } /** * "<string name=" * 0 **/ int line_with_string_line_head(const char* line){ const char* start = line; int ret = -1; while(*(start) != '\0'){ if(*start == '<'){ ret = strncmp(start, string_line_head, 12); return ret; } start++; } return ret; } /** * * 0: name * : name **/ int compared_file_with_string(FILE* file, char* string_name){ char buffer[LINE_BUFFER_SIZE]; char name[NAME_BUFFER_SIZE]; int ret = -1; while(!feof(file)){ buffer[0] = '\0'; fgets(buffer, sizeof(buffer), file); //printf("read line: %s", buffer); if(0 == line_with_string_line_head(buffer)){ get_string_name(buffer, name); // printf("compared file name = %s
", name); ret = strcmp(string_name, name); // printf("compare ret = %d
", ret); if(ret == 0) return ret; } } return ret; }

内容はmeld_へstring.c
もちろんファイル名は他でも構いません.
その後、コマンドラインはgcc meld_を実行するstring.c
a.out実行可能ファイルが生成されます
コマンドライン実行a.out base_file_name  compared_file_name  result_file_name
またはa.out base_file_name  compared_file_name 
指定したパスの下に対応するコントラスト結果ファイルが生成されます.
コメント:
ここで、base_file_name:完全な文字列ファイル(androidエンジニアリングのstring.xml)
compared_file_name:base_とfile_nameと比較したファイル(androidエンジニアリングのstring.xmlでもあります)
result_file_name:base_file_nameに含まれているがcompared_file_nameに含まれていない文字列のファイル名を指定します.
指定しない場合、デフォルトのファイル名はresultです.