static void test_To_I64(TestBatchRunner *runner) { String *string; string = S_get_str("10"); TEST_TRUE(runner, Str_To_I64(string) == 10, "To_I64"); DECREF(string); string = S_get_str("-10"); TEST_TRUE(runner, Str_To_I64(string) == -10, "To_I64 negative"); DECREF(string); string = S_get_str("10."); TEST_TRUE(runner, Str_To_I64(string) == 10, "To_I64 stops at non-digits"); DECREF(string); string = S_get_str("10A"); TEST_TRUE(runner, Str_To_I64(string) == 10, "To_I64 stops at out-of-range digits"); DECREF(string); string = S_get_str("-JJ"); TEST_TRUE(runner, Str_BaseX_To_I64(string, 20) == -399, "BaseX_To_I64 base 20"); DECREF(string); }
bool LFLock_Maybe_Delete_File_IMP(LockFileLock *self, String *path, bool delete_mine, bool delete_other) { LockFileLockIVARS *const ivars = LFLock_IVARS(self); Folder *folder = ivars->folder; bool success = false; // Only delete locks that start with our lock name. if (!Str_Starts_With_Utf8(path, "locks", 5)) { return false; } StringIterator *iter = Str_Top(path); StrIter_Advance(iter, 5 + 1); if (!StrIter_Starts_With(iter, ivars->name)) { DECREF(iter); return false; } DECREF(iter); // Attempt to delete dead lock file. if (Folder_Exists(folder, path)) { Hash *hash = (Hash*)Json_slurp_json(folder, path); if (hash != NULL && Obj_Is_A((Obj*)hash, HASH)) { String *pid_buf = (String*)Hash_Fetch_Utf8(hash, "pid", 3); String *host = (String*)Hash_Fetch_Utf8(hash, "host", 4); String *name = (String*)Hash_Fetch_Utf8(hash, "name", 4); // Match hostname and lock name. if (host != NULL && Str_Is_A(host, STRING) && Str_Equals(host, (Obj*)ivars->host) && name != NULL && Str_Is_A(name, STRING) && Str_Equals(name, (Obj*)ivars->name) && pid_buf != NULL && Str_Is_A(pid_buf, STRING) ) { // Verify that pid is either mine or dead. int pid = (int)Str_To_I64(pid_buf); if ((delete_mine && pid == PID_getpid()) // This process. || (delete_other && !PID_active(pid)) // Dead pid. ) { if (Folder_Delete(folder, path)) { success = true; } else { String *mess = MAKE_MESS("Can't delete '%o'", path); DECREF(hash); Err_throw_mess(ERR, mess); } } } } DECREF(hash); } return success; }