| 162 |
* @return 置き換えられた文字列 |
* @return 置き換えられた文字列 |
| 163 |
* 不要になったらfree()すること |
* 不要になったらfree()すること |
| 164 |
*/ |
*/ |
| 165 |
wchar_t *ConvertLognameW(const TComVar *pcv, const wchar_t *src) |
static wchar_t *ConvertLognameW(const TComVar *pcv, const wchar_t *src) |
| 166 |
{ |
{ |
| 167 |
const TTTSet *pts = pcv->ts; |
const TTTSet *pts = pcv->ts; |
| 168 |
size_t dest_len = wcslen(src) + 1; |
size_t dest_len = wcslen(src) + 1; |
| 225 |
break; |
break; |
| 226 |
} |
} |
| 227 |
|
|
| 228 |
if (add_text != 0) { |
if (add_text != NULL) { |
| 229 |
size_t l = wcslen(add_text); |
size_t l = wcslen(add_text); |
| 230 |
dest_len += l; |
dest_len += l; |
| 231 |
dest = (wchar_t *)realloc(dest, sizeof(wchar_t) * dest_len); |
dest = (wchar_t *)realloc(dest, sizeof(wchar_t) * dest_len); |
| 232 |
wcscpy(&dest[i], add_text); |
wcscpy(&dest[i], add_text); |
| 233 |
|
free(add_text); |
| 234 |
i += l; |
i += l; |
| 235 |
} |
} |
| 236 |
} |
} |
| 243 |
return dest; |
return dest; |
| 244 |
} |
} |
| 245 |
|
|
|
/** |
|
|
* ファイル名文字列の置き換え ANSI版 |
|
|
*/ |
|
|
static void ConvertLogname(char *c, int destlen) |
|
|
{ |
|
|
wchar_t *cW = ToWcharA(c); |
|
|
wchar_t *filenameW = ConvertLognameW(&cv, cW); |
|
|
WideCharToACP_t(cW, c, destlen); |
|
|
free(filenameW); |
|
|
free(cW); |
|
|
} |
|
|
|
|
| 246 |
static void FixLogOption(void) |
static void FixLogOption(void) |
| 247 |
{ |
{ |
| 248 |
if (ts.LogBinary) { |
if (ts.LogBinary) { |
| 1374 |
} |
} |
| 1375 |
|
|
| 1376 |
/** |
/** |
| 1377 |
|
* ログファイル名用の修飾を行う,ファイル名部分のみ |
| 1378 |
|
* - strftime() と同じ日付展開 |
| 1379 |
|
* - 設定されたログファイルフォルダを追加 |
| 1380 |
|
* - ホスト名,ポート番号展開 |
| 1381 |
|
* |
| 1382 |
|
* @param filename ファイル名(パスは含まない) |
| 1383 |
|
* @return 修飾済みファイル名 |
| 1384 |
|
*/ |
| 1385 |
|
wchar_t *FLogGetLogFilenameBase(const wchar_t *filename) |
| 1386 |
|
{ |
| 1387 |
|
// ファイル名部分を抽出 |
| 1388 |
|
wchar_t *format = ExtractFileNameW(filename); |
| 1389 |
|
if (format == NULL) { |
| 1390 |
|
format = wcsdup(L""); |
| 1391 |
|
} |
| 1392 |
|
|
| 1393 |
|
// strftime に使用できない文字を削除 |
| 1394 |
|
deleteInvalidStrftimeCharW(format); |
| 1395 |
|
|
| 1396 |
|
// 現在時刻を取得 |
| 1397 |
|
time_t time_local; |
| 1398 |
|
time(&time_local); |
| 1399 |
|
struct tm tm_local; |
| 1400 |
|
localtime_s(&tm_local, &time_local); |
| 1401 |
|
|
| 1402 |
|
// strftime()で変換 |
| 1403 |
|
size_t len = 128; |
| 1404 |
|
wchar_t *formated = (wchar_t*)malloc(sizeof(wchar_t) * len); |
| 1405 |
|
size_t r = wcsftime(formated, len, format, &tm_local); |
| 1406 |
|
if (r == 0) { |
| 1407 |
|
// エラーが返ってきた |
| 1408 |
|
wcscpy(formated, format); |
| 1409 |
|
} |
| 1410 |
|
free(format); |
| 1411 |
|
|
| 1412 |
|
// ホスト名など |
| 1413 |
|
wchar_t *host = ConvertLognameW(&cv, formated); |
| 1414 |
|
free(formated); |
| 1415 |
|
|
| 1416 |
|
// ファイル名に使用できない文字を置換 |
| 1417 |
|
//wchar_t *replaced = replaceInvalidFileNameCharW(host, 0); // 削除 |
| 1418 |
|
wchar_t *replaced = replaceInvalidFileNameCharW(host, L'_'); |
| 1419 |
|
free(host); |
| 1420 |
|
|
| 1421 |
|
return replaced; |
| 1422 |
|
} |
| 1423 |
|
|
| 1424 |
|
/** |
| 1425 |
* ログファイル名を取得 |
* ログファイル名を取得 |
| 1426 |
* ログファイル名用の修飾を行う |
* ログファイル名用の修飾を行う |
| 1427 |
* - strftime() と同じ日付展開 |
* - strftime() と同じ日付展開 |
| 1436 |
*/ |
*/ |
| 1437 |
wchar_t *FLogGetLogFilename(const wchar_t *log_filename) |
wchar_t *FLogGetLogFilename(const wchar_t *log_filename) |
| 1438 |
{ |
{ |
| 1439 |
const char *logdir = ToCharW(ts.LogDefaultPathW); |
wchar_t *dir; |
| 1440 |
|
wchar_t *fname; |
|
// 元となるファイル名 |
|
|
char base_name[MAX_PATH]; |
|
| 1441 |
if (log_filename == NULL) { |
if (log_filename == NULL) { |
| 1442 |
strncpy_s(base_name, _countof(base_name), ts.LogDefaultName, _TRUNCATE); |
dir = wcsdup(ts.LogDefaultPathW); |
| 1443 |
|
fname = ToWcharA(ts.LogDefaultName); |
| 1444 |
|
//fname = wcsdup(ts.LogDefaultNameW); |
| 1445 |
|
} else if (!IsRelativePathW(log_filename)) { |
| 1446 |
|
// 絶対パスが入力された |
| 1447 |
|
dir = ExtractDirNameW(log_filename); |
| 1448 |
|
fname = ExtractFileNameW(log_filename); |
| 1449 |
} |
} |
| 1450 |
else { |
else { |
| 1451 |
char *filenameA = ToCharW(log_filename); |
dir = wcsdup(ts.LogDefaultPathW); |
| 1452 |
strncpy_s(base_name, _countof(base_name), filenameA, _TRUNCATE); |
fname = wcsdup(log_filename); |
|
free(filenameA); |
|
| 1453 |
} |
} |
| 1454 |
|
|
| 1455 |
// フルパス化 |
wchar_t *formated = FLogGetLogFilenameBase(fname); |
| 1456 |
char full_path[MAX_PATH]; |
free(fname); |
| 1457 |
ConvFName(logdir, base_name, sizeof(base_name), "", full_path, sizeof(full_path)); |
|
| 1458 |
ParseStrftimeFileName(full_path, sizeof(full_path)); |
// 連結する |
| 1459 |
ConvertLogname(full_path, sizeof(full_path)); |
wchar_t *logfull = NULL; |
| 1460 |
|
awcscats(&logfull, dir, L"\\", formated, NULL); |
| 1461 |
|
free(dir); |
| 1462 |
|
|
| 1463 |
|
// 正規化 |
| 1464 |
|
wchar_t *normal; |
| 1465 |
|
hGetFullPathNameW(logfull, &normal, NULL); |
| 1466 |
|
free(logfull); |
| 1467 |
|
|
| 1468 |
free((void *)logdir); |
return normal; |
|
return ToWcharA(full_path); |
|
| 1469 |
} |
} |
| 1470 |
|
|
| 1471 |
BOOL FLogIsPause() |
BOOL FLogIsPause() |