1/*
2 * Copyright 2005, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel Dörfler, axeld@pinc-software.de
7 */
8
9
10#include <Entry.h>
11#include <Path.h>
12#include <Query.h>
13#include <Volume.h>
14
15#include <fs_info.h>
16
17#include <ctype.h>
18#include <stdlib.h>
19#include <stdio.h>
20#include <string.h>
21
22
23extern const char* __progname;
24
25
26void
27skip_white_space(char*& line)
28{
29	while (isspace(line[0]))
30		line++;
31}
32
33
34void
35get_name(char* line)
36{
37	while (isalnum(line[0]) || line[0] == '_') {
38		line++;
39	}
40
41	line[0] = '\0';
42}
43
44
45void
46print_code(BPath& path, int32 code)
47{
48	FILE* file = fopen(path.Path(), "r");
49	if (file == NULL)
50		return;
51
52	int32 lineNumber = 0;
53	char buffer[4096];
54
55	while (fgets(buffer, sizeof(buffer), file) != NULL) {
56		char* line = buffer;
57		skip_white_space(line);
58
59		if (strncmp(line, "AS_", 3))
60			continue;
61
62		if (++lineNumber != code)
63			continue;
64
65		get_name(line);
66		printf("code %ld: %s\n", lineNumber, line);
67		fclose(file);
68		return;
69	}
70
71	printf("unknown code %ld!\n", code);
72	fclose(file);
73}
74
75
76int
77main(int argc, char** argv)
78{
79	if (argc < 2) {
80		fprintf(stderr, "usage: %s <message-code>\n", __progname);
81		return -1;
82	}
83
84	int32 number = atol(argv[1]);
85
86	BQuery query;
87	query.SetPredicate("name=ServerProtocol.h");
88
89	// search on current volume only
90	dev_t device = dev_for_path(".");
91	BVolume volume(device);
92
93	query.SetVolume(&volume);
94	query.Fetch();
95
96	status_t status;
97	BEntry entry;
98	while ((status = query.GetNextEntry(&entry)) == B_OK) {
99		BPath path(&entry);
100		puts(path.Path());
101		if (strstr(path.Path(), "headers/private/app/ServerProtocol.h") != NULL) {
102			print_code(path, number);
103			break;
104		}
105	}
106
107	if (status != B_OK) {
108		fprintf(stderr, "%s: could not find ServerProtocol.h", __progname);
109		return -1;
110	}
111	return 0;
112}
113