[MKHIVE] Minor improvements.
[reactos.git] / sdk / tools / log2lines / util.c
1 /*
2 * ReactOS log2lines
3 * Written by Jan Roeloffzen
4 *
5 * - Misc utils
6 */
7
8 #include <errno.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include <stdlib.h>
12
13 #include "config.h"
14 #include "compat.h"
15 #include "util.h"
16 #include "options.h"
17
18 int
19 set_LogFile(FILE **plogFile)
20 {
21 if (*opt_logFile)
22 {
23 if (*plogFile)
24 fclose(*plogFile);
25 *plogFile = NULL;
26
27 if (strcmp(opt_logFile,"none") == 0)
28 return 0; //just close
29
30 *plogFile = fopen(opt_logFile, opt_mod ? opt_mod : "a");
31 if (*plogFile)
32 {
33 // disable buffering so fflush is not needed
34 if (!opt_buffered)
35 {
36 l2l_dbg(1, "Disabling log buffering on %s\n", opt_logFile);
37 setbuf(*plogFile, NULL);
38 }
39 else
40 l2l_dbg(1, "Enabling log buffering on %s\n", opt_logFile);
41 }
42 else
43 {
44 l2l_dbg(0, "Could not open logfile %s (%s)\n", opt_logFile, strerror(errno));
45 return 2;
46 }
47 }
48 return 0;
49 }
50
51 int
52 file_exists(char *name)
53 {
54 FILE *f;
55
56 f = fopen(name, "r");
57 if (!f)
58 return 0;
59 fclose(f);
60 return 1;
61 }
62
63 /* Do this in reverse (recursively)
64 This saves many system calls if the path is likely
65 to already exist (creating large trees).
66 */
67 int
68 mkPath(char *path, int isDir)
69 {
70 char *s;
71 int res = 0;
72
73 if (isDir)
74 {
75 res = MKDIR(path);
76 if (!res || (res == -1 && errno == EEXIST))
77 return 0;
78 }
79 // create parent dir
80 if ((s = strrchr(path, PATH_CHAR)))
81 {
82 *s = '\0';
83 res = mkPath(path, 1);
84 *s = PATH_CHAR;
85 }
86
87 if (!res && isDir)
88 res = MKDIR(path);
89
90 return res;
91 }
92
93 #if 0
94 static FILE *
95 rfopen(char *path, char *mode)
96 {
97 FILE *f = NULL;
98 char tmppath[PATH_MAX]; // Don't modify const strings
99
100 strcpy(tmppath, path);
101 f = fopen(tmppath, mode);
102 if (!f && !mkPath(tmppath, 0))
103 f = fopen(tmppath, mode);
104 return f;
105 }
106 #endif
107
108
109 char *
110 basename(char *path)
111 {
112 char *base;
113
114 base = strrchr(path, PATH_CHAR);
115 if (base)
116 return ++base;
117 return path;
118 }
119
120 const char *
121 getFmt(const char *a)
122 {
123 const char *fmt = "%x";
124
125 if (*a == '0')
126 {
127 switch (*++a)
128 {
129 case 'x':
130 fmt = "%x";
131 ++a;
132 break;
133 case 'd':
134 fmt = "%d";
135 ++a;
136 break;
137 default:
138 fmt = "%o";
139 break;
140 }
141 }
142 return fmt;
143 }
144
145 long
146 my_atoi(const char *a)
147 {
148 int i = 0;
149 sscanf(a, getFmt(a), &i);
150 return i;
151 }
152
153 int
154 isOffset(const char *a)
155 {
156 int i = 0;
157 if (strchr(a, '.'))
158 return 0;
159 return sscanf(a, getFmt(a), &i);
160 }
161
162 int
163 copy_file(char *src, char *dst)
164 {
165 char Line[LINESIZE];
166
167 sprintf(Line, CP_FMT, src, dst);
168 l2l_dbg(2, "Executing: %s\n", Line);
169 remove(dst);
170 if (file_exists(dst))
171 {
172 l2l_dbg(0, "Cannot remove dst %s before copy\n", dst);
173 return 1;
174 }
175 if (system(Line) < 0)
176 {
177 l2l_dbg(0, "Cannot copy %s to %s\n", src, dst);
178 l2l_dbg(1, "Failed to execute: '%s'\n", Line);
179 return 2;
180 }
181
182 if (!file_exists(dst))
183 {
184 l2l_dbg(0, "Dst %s does not exist after copy\n", dst);
185 return 2;
186 }
187 return 0;
188 }
189
190 /* EOF */