Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 28 additions & 35 deletions src/administration/ban.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@

#include <fmt/format.h>

// Ширину колонок считает fmt: printf меряет её в байтах, и русское имя бога в графе
// "Banned By" ломало столбец, а обрезка по .16 могла разрубить букву пополам (issue #3797).
namespace {
constexpr auto kBanRow = "{:<25.25} {:<8.8} {:<10.10} {:<16.16} {:<8.8}\r\n";
constexpr auto kProxyRow = "{:<25.25} {:<16.16}\r\n";
} // namespace

const std::string &BanList::ban_filename() { return MUD::StateManager().Path(state::EStateFile::kBannedSites); }
const std::string &BanList::proxy_ban_filename() { return MUD::StateManager().Path(state::EStateFile::kBannedProxies); }
const char *BanList::ban_types[] = {
Expand Down Expand Up @@ -312,26 +319,20 @@ void BanList::ShowBannedIp(int sort_mode, CharData *ch) {
}

SortIp(sort_mode);
char format[kMaxInputLength], to_unban[kMaxInputLength], buff[kMaxInputLength], *listbuf = nullptr, *timestr;
strcpy(format, "%-25.25s %-8.8s %-10.10s %-16.16s %-8.8s\r\n");
sprintf(buf, format, "Banned Site Name", "Ban Type", "Banned On", "Banned By", "To Unban");

listbuf = str_add(listbuf, buf);
sprintf(buf, format,
"---------------------------------",
"---------------------------------",
"---------------------------------",
"---------------------------------", "---------------------------------");
listbuf = str_add(listbuf, buf);
char to_unban[kMaxInputLength], buff[kMaxInputLength], *listbuf = nullptr, *timestr;
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kBanRow),
"Banned Site Name", "Ban Type", "Banned On", "Banned By", "To Unban").c_str());
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kBanRow),
"-------------------------", "--------", "----------",
"----------------", "--------").c_str());

for (auto &i : ban_list_) {
timestr = asctime(localtime(&(i->BanDate)));
*(timestr + 10) = 0;
strcpy(to_unban, timestr);
sprintf(buff, "%ldh", static_cast<long int>(i->UnbanDate - time(nullptr)) / 3600);
sprintf(buf, format, i->BannedIp.c_str(), ban_types[i->BanType],
to_unban, i->BannerName.c_str(), buff);
listbuf = str_add(listbuf, buf);
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kBanRow), i->BannedIp, ban_types[i->BanType],
to_unban, i->BannerName, buff).c_str());
strcpy(buf, i->BanReason.c_str());
strcat(buf, "\r\n");
listbuf = str_add(listbuf, buf);
Expand All @@ -348,27 +349,21 @@ void BanList::ShowBannedIpByMask(int sort_mode, CharData *ch, const char *mask)
}

SortIp(sort_mode);
char format[kMaxInputLength], to_unban[kMaxInputLength], buff[kMaxInputLength], *listbuf = nullptr, *timestr;
strcpy(format, "%-25.25s %-8.8s %-10.10s %-16.16s %-8.8s\r\n");
sprintf(buf, format, "Banned Site Name", "Ban Type", "Banned On", "Banned By", "To Unban");

listbuf = str_add(listbuf, buf);
sprintf(buf, format,
"---------------------------------",
"---------------------------------",
"---------------------------------",
"---------------------------------", "---------------------------------");
listbuf = str_add(listbuf, buf);
char to_unban[kMaxInputLength], buff[kMaxInputLength], *listbuf = nullptr, *timestr;
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kBanRow),
"Banned Site Name", "Ban Type", "Banned On", "Banned By", "To Unban").c_str());
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kBanRow),
"-------------------------", "--------", "----------",
"----------------", "--------").c_str());

for (auto &i : ban_list_) {
if (strncmp(i->BannedIp.c_str(), mask, strlen(mask)) == 0) {
timestr = asctime(localtime(&(i->BanDate)));
*(timestr + 10) = 0;
strcpy(to_unban, timestr);
sprintf(buff, "%ldh", static_cast<long int>(i->UnbanDate - time(nullptr)) / 3600);
sprintf(buf, format, i->BannedIp.c_str(), ban_types[i->BanType],
to_unban, i->BannerName.c_str(), buff);
listbuf = str_add(listbuf, buf);
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kBanRow), i->BannedIp, ban_types[i->BanType],
to_unban, i->BannerName, buff).c_str());
strcpy(buf, i->BanReason.c_str());
strcat(buf, "\r\n");
listbuf = str_add(listbuf, buf);
Expand All @@ -390,14 +385,12 @@ void BanList::ShowBannedProxy(int sort_mode, CharData *ch) {
return;
}
SortProxy(sort_mode);
char format[kMaxInputLength], *listbuf = nullptr;
strcpy(format, "%-25.25s %-16.16s\r\n");
sprintf(buf, format, "Banned Site Name", "Banned By");
SendMsgToChar(buf, ch);
sprintf(buf, format, "---------------------------------", "---------------------------------");
listbuf = str_add(listbuf, buf);
char *listbuf = nullptr;
SendMsgToChar(fmt::format(fmt::runtime(kProxyRow), "Banned Site Name", "Banned By"), ch);
listbuf = str_add(listbuf, fmt::format(fmt::runtime(kProxyRow),
"-------------------------", "----------------").c_str());
for (auto &i : proxy_ban_list_) {
sprintf(buf, format, i->BannedIp.c_str(), i->BannerName.c_str());
snprintf(buf, kMaxStringLength, "%s", fmt::format(fmt::runtime(kProxyRow), i->BannedIp, i->BannerName).c_str());
listbuf = str_add(listbuf, buf);
}
page_string(ch->desc, listbuf, 1);
Expand Down
3 changes: 2 additions & 1 deletion src/engine/olc/medit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1323,7 +1323,8 @@ void medit_parse(DescriptorData *d, char *arg) {

//-------------------------------------------------------------------
case MEDIT_MAIN_MENU: i = 0;
olc_log("%s command %c", GET_NAME(d->character), *arg);
olc_log("%s command %s", GET_NAME(d->character),
std::string(arg, native_text::char_bytes(arg)).c_str());
switch (native_text::first_char_code(arg)) {
case 'q':
case 'Q':
Expand Down
3 changes: 2 additions & 1 deletion src/engine/olc/oedit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1743,7 +1743,8 @@ void oedit_parse(DescriptorData *d, char *arg) {
default: oedit_disp_menu(d);
break;
}
olc_log("%s command %c", GET_NAME(d->character), *arg);
olc_log("%s command %s", GET_NAME(d->character),
std::string(arg, native_text::char_bytes(arg)).c_str());
return;
// * end of OEDIT_MAIN_MENU

Expand Down
3 changes: 2 additions & 1 deletion src/engine/olc/redit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,8 @@ void redit_parse(DescriptorData *d, char *arg) {
redit_disp_menu(d);
break;
}
olc_log("%s command %c", GET_NAME(d->character), *arg);
olc_log("%s command %s", GET_NAME(d->character),
std::string(arg, native_text::char_bytes(arg)).c_str());
return;

case OLC_SCRIPT_EDIT:
Expand Down
2 changes: 1 addition & 1 deletion src/engine/scripting/dg_event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ void print_event_list(CharData *ch)
if (!wed || !wed->trigger) {
continue;
}
sprintf(buf, "[%-3d] Trigger: %s, VNum: [%5d]\r\n", trig_counter, GET_TRIG_NAME(wed->trigger), GET_TRIG_VNUM(wed->trigger));
sprintf(buf, "[%-3d] Trigger: %s, VNum: [%7d]\r\n", trig_counter, GET_TRIG_NAME(wed->trigger), GET_TRIG_VNUM(wed->trigger));
// if (wed->trigger->wait_line != nullptr) {
if (wed->trigger->wait_event.time_remaining > 0 && wed->trigger->wait_line != nullptr) {
sprintf(buf+strlen(buf), " Wait: %d, Current line: %s (num line: %d)\r\n", GET_TRIG_WAIT(wed->trigger).time_remaining,
Expand Down
18 changes: 10 additions & 8 deletions src/engine/scripting/dg_scripts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,7 @@ void do_stat_trigger(CharData *ch, Trigger *trig, bool need_num) {
return;
}

snprintf(sb, sizeof(sb), "Name: '%s%s%s', VNum: [%s%5d%s], RNum: [%5d]\r\n",
snprintf(sb, sizeof(sb), "Name: '%s%s%s', VNum: [%s%7d%s], RNum: [%7d]\r\n",
kColorYel, trig->get_name().c_str(), kColorNrm,
kColorGrn, trig_index[(trig)->get_rnum()]->vnum,
kColorNrm, trig->get_rnum());
Expand Down Expand Up @@ -953,14 +953,17 @@ void script_stat(CharData *ch, Script *sc) {
snprintf(namebuf, sizeof(namebuf), "%s:%ld", tv.name.c_str(), tv.context);
if (tv.value[0] == UID_CHAR || tv.value[0] == UID_ROOM || tv.value[0] == UID_OBJ || tv.value[0] == UID_CHAR_ALL) {
find_uid_name(tv.value.c_str(), name, sizeof(name));
snprintf(buf, sizeof(buf), " %15s: %s\r\n", tv.context ? namebuf : tv.name.c_str(), name);
// Ширину колонки имени считает fmt: printf меряет её в байтах, и русское имя
// переменной ломало столбец (issue #3797).
SendMsgToChar(fmt::format(" {:>15}: {}\r\n",
tv.context ? namebuf : tv.name.c_str(), name), ch);
} else
snprintf(buf, sizeof(buf), " %15s: %s\r\n", tv.context ? namebuf : tv.name.c_str(), tv.value.c_str());
SendMsgToChar(buf, ch);
SendMsgToChar(fmt::format(" {:>15}: {}\r\n",
tv.context ? namebuf : tv.name.c_str(), tv.value), ch);
}

for (auto t : sc->script_trig_list) {
snprintf(buf, sizeof(buf), "\r\n Trigger: %s%s%s, VNum: [%s%5d%s], RNum: [%5d], Context: [%ld]\r\n",
snprintf(buf, sizeof(buf), "\r\n Trigger: %s%s%s, VNum: [%s%7d%s], RNum: [%7d], Context: [%ld]\r\n",
kColorYel, GET_TRIG_NAME(t), kColorNrm,
kColorGrn, GET_TRIG_VNUM(t), kColorNrm, GET_TRIG_RNUM(t), t->context);
SendMsgToChar(buf, ch);
Expand Down Expand Up @@ -1007,11 +1010,10 @@ void script_stat(CharData *ch, Script *sc) {
if (!var_name.empty()) {
if (tv.value[0] == UID_CHAR || tv.value[0] == UID_ROOM || tv.value[0] == UID_OBJ || tv.value[0] == UID_CHAR_ALL) {
find_uid_name(tv.value.c_str(), name, sizeof(name));
snprintf(buf, sizeof(buf), " %15s: %s\r\n", var_name.c_str(), name);
SendMsgToChar(fmt::format(" {:>15}: {}\r\n", var_name, name), ch);
} else {
snprintf(buf, sizeof(buf), " %15s: %s\r\n", var_name.c_str(), tv.value.c_str());
SendMsgToChar(fmt::format(" {:>15}: {}\r\n", var_name, tv.value), ch);
}
SendMsgToChar(buf, ch);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/engine/ui/cmd/do_exits.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ void DoExits(CharData *ch, char * /*argument*/, int/* cmd*/, int/* subcmd*/) {
const RoomRnum rnum_exit_room = EXIT(ch, door)->to_room();
if (ch->IsFlagged(EPrf::kMapper) && !ch->IsFlagged(EPlrFlag::kScriptWriter)
&& !ROOM_FLAGGED(rnum_exit_room, ERoomFlag::kMoMapper)) {
sprintf(buf2 + strlen(buf2), "[%5d] %s", GET_ROOM_VNUM(rnum_exit_room), world[rnum_exit_room]->name);
sprintf(buf2 + strlen(buf2), "[%7d] %s", GET_ROOM_VNUM(rnum_exit_room), world[rnum_exit_room]->name);
} else {
strcat(buf2, world[rnum_exit_room]->name);
}
Expand Down
2 changes: 1 addition & 1 deletion src/engine/ui/cmd/do_pray_gods.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void do_pray_gods(CharData *ch, char *argument, int/* cmd*/, int/* subcmd*/) {
GET_NAME(ch), grammar::SexEnding((ch)->get_sex(), 1), argument);
ch->remember_add(buf1, Remember::PRAY);

snprintf(buf, kMaxStringLength, "&R[%5d] %s воззвал%s к богам с сообщением : '%s'&n\r\n",
snprintf(buf, kMaxStringLength, "&R[%7d] %s воззвал%s к богам с сообщением : '%s'&n\r\n",
world[ch->in_room]->vnum, GET_NAME(ch), grammar::SexEnding((ch)->get_sex(), 1), argument);
}

Expand Down
2 changes: 1 addition & 1 deletion src/engine/ui/cmd_god/do_liblist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ void do_liblist(CharData *ch, char *argument, int cmd, int subcmd) {
out += buf_;
for (nr = kFirstRoom; nr <= top_of_world && (world[nr]->vnum <= last); nr++) {
if (world[nr]->vnum >= first) {
snprintf(buf_, sizeof(buf_), "%5d. [%5d] (%3d) %s",
snprintf(buf_, sizeof(buf_), "%5d. [%7d] (%3d) %s",
++found, world[nr]->vnum, nr, world[nr]->name);
out += buf_;
if (!world[nr]->proto_script->empty()) {
Expand Down
32 changes: 16 additions & 16 deletions src/engine/ui/cmd_god/do_show.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,11 +284,11 @@ std::string print_zone_enters(ZoneRnum zone) {
if (world[n]->dir_option[dir]
&& world[world[n]->dir_option[dir]->to_room()]->zone_rn == zone
&& world[world[n]->dir_option[dir]->to_room()]->vnum > 0) {
snprintf(tmp, sizeof(tmp),
" Номер комнаты:%5d Направление:%6s Вход в комнату:%5d\r\n",
world[n]->vnum, dirs_rus[dir],
world[world[n]->dir_option[dir]->to_room()]->vnum);
out += tmp;
// Ширину колонки направления считает fmt: printf меряет её в байтах, и русское
// "северо-восток" занимало вдвое больше, чем показывал %6s (issue #3797).
out += fmt::format(" Номер комнаты:{:7d} Направление:{:>6} Вход в комнату:{:7d}\r\n",
world[n]->vnum, dirs_rus[dir],
world[world[n]->dir_option[dir]->to_room()]->vnum);
found = true;
}
}
Expand All @@ -314,11 +314,9 @@ std::string print_zone_exits(ZoneRnum zone) {
if (world[n]->dir_option[dir]
&& world[world[n]->dir_option[dir]->to_room()]->zone_rn != zone
&& world[world[n]->dir_option[dir]->to_room()]->vnum > 0) {
snprintf(tmp, sizeof(tmp),
" Номер комнаты:%5d Направление:%6s Выход в комнату:%5d\r\n",
world[n]->vnum, dirs_rus[dir],
world[world[n]->dir_option[dir]->to_room()]->vnum);
out += tmp;
out += fmt::format(" Номер комнаты:{:7d} Направление:{:>6} Выход в комнату:{:7d}\r\n",
world[n]->vnum, dirs_rus[dir],
world[world[n]->dir_option[dir]->to_room()]->vnum);
found = true;
}
}
Expand All @@ -340,14 +338,16 @@ void print_zone_to_buf(char **bufptr, ZoneRnum zone) {
char tmpstr[BUFFER_SIZE];
snprintf(tmpstr, BUFFER_SIZE,
"%3d %s\r\n"
"Уровнь зоны %2d, Средний уровень мобов: %2d; Type: %-20.20s; Age: %3d; Reset: %3d (%1d)(%1d)\r\n"
"First: %5d, Top: %5d %s %s; ResetIdle: %s; Занято: %s; Активность: %.2f; Группа: %2d; \r\n"
"Уровнь зоны %2d, Средний уровень мобов: %2d; Type: %s; Age: %3d; Reset: %3d (%1d)(%1d)\r\n"
"First: %7d, Top: %7d %s %s; ResetIdle: %s; Занято: %s; Активность: %.2f; Группа: %2d; \r\n"
"Автор: %s, количество репопов зоны (с перезагрузки): %d, всего посещений: %d, вход в зону: %d\r\n",
zone_table[zone].vnum,
zone_table[zone].name.c_str(),
zone_table[zone].level,
zone_table[zone].mob_level,
MUD::ZoneTypes()[zone_table[zone].type].GetName().c_str(),
// Тип зоны по-русски: ширину поля печатаем сами, через fmt, -- printf мерил бы её
// в байтах (issue #3797).
fmt::format("{:<20.20}", MUD::ZoneTypes()[zone_table[zone].type].GetName()).c_str(),
zone_table[zone].age, zone_table[zone].lifespan,
zone_table[zone].reset_mode,
(zone_table[zone].reset_mode == 3) ? (CanBeReset(zone) ? 1 : 0) : (IsZoneEmpty(zone) ? 1 : 0),
Expand Down Expand Up @@ -694,7 +694,7 @@ void do_show(CharData *ch, char *argument, int/* cmd*/, int/* subcmd*/) {
for (j = 0; j < EDirection::kMaxDirNum; j++) {
if (world[i]->dir_option[j]
&& world[i]->dir_option[j]->to_room() == 0) {
sprintf(buf + strlen(buf), "%2d: [%5d] %s\r\n", ++k,
sprintf(buf + strlen(buf), "%2d: [%7d] %s\r\n", ++k,
GET_ROOM_VNUM(i), world[i]->name);
}
}
Expand All @@ -706,13 +706,13 @@ void do_show(CharData *ch, char *argument, int/* cmd*/, int/* subcmd*/) {
case 6: strcpy(buf, "Смертельных выходов\r\n" "-------------------\r\n");
for (i = kFirstRoom, j = 0; i <= top_of_world; i++)
if (ROOM_FLAGGED(i, ERoomFlag::kDeathTrap))
sprintf(buf + strlen(buf), "%2d: [%5d] %s\r\n", ++j, GET_ROOM_VNUM(i), world[i]->name);
sprintf(buf + strlen(buf), "%2d: [%7d] %s\r\n", ++j, GET_ROOM_VNUM(i), world[i]->name);
page_string(ch->desc, buf, true);
break;
case 7: strcpy(buf, "Комнаты для богов\r\n" "-----------------\r\n");
for (i = kFirstRoom, j = 0; i <= top_of_world; i++)
if (ROOM_FLAGGED(i, ERoomFlag::kGodsRoom))
sprintf(buf + strlen(buf), "%2d: [%5d] %s\r\n", ++j, GET_ROOM_VNUM(i), world[i]->name);
sprintf(buf + strlen(buf), "%2d: [%7d] %s\r\n", ++j, GET_ROOM_VNUM(i), world[i]->name);
page_string(ch->desc, buf, true);
break;
case 8: *buf = '\0';
Expand Down
21 changes: 11 additions & 10 deletions src/engine/ui/cmd_god/do_stat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ void do_stat_character(CharData *ch, CharData *k, const int virt) {
SendMsgToChar(ch, " ЛАГ: [%d]\r\n", k->get_wait());
if (k->IsNpc()) {
snprintf(buf, sizeof(buf),
"Синонимы: &S%s&s, VNum: [%5d], RNum: [%5d]\r\n",
"Синонимы: &S%s&s, VNum: [%7d], RNum: [%7d]\r\n",
k->GetCharAliases().c_str(),
GET_MOB_VNUM(k),
k->get_rnum());
Expand Down Expand Up @@ -670,16 +670,17 @@ void do_stat_character(CharData *ch, CharData *k, const int virt) {
for (auto tv : k->script->global_vars) {
if (tv.value[0] == UID_CHAR) {
find_uid_name(tv.value.c_str(), name, sizeof(name));
snprintf(buf, sizeof(buf), " %10s: [CharUID]: %s\r\n", tv.name.c_str(), name);
// Ширину колонки имени считает fmt: printf меряет её в байтах (issue #3797).
SendMsgToChar(fmt::format(" {:>10}: [CharUID]: {}\r\n", tv.name, name), ch);
} else if (tv.value[0] == UID_OBJ) {
find_uid_name(tv.value.c_str(), name, sizeof(name));
snprintf(buf, sizeof(buf), " %10s: [ObjUID]: %s\r\n", tv.name.c_str(), name);
SendMsgToChar(fmt::format(" {:>10}: [ObjUID]: {}\r\n", tv.name, name), ch);
} else if (tv.value[0] == UID_ROOM) {
find_uid_name(tv.value.c_str(), name, sizeof(name));
snprintf(buf, sizeof(buf), " %10s: [RoomUID]: %s\r\n", tv.name.c_str(), name);
} else
snprintf(buf, sizeof(buf), " %10s: %s\r\n", tv.name.c_str(), tv.value.c_str());
SendMsgToChar(buf, ch);
SendMsgToChar(fmt::format(" {:>10}: [RoomUID]: {}\r\n", tv.name, name), ch);
} else {
SendMsgToChar(fmt::format(" {:>10}: {}\r\n", tv.name, tv.value), ch);
}
}
}

Expand Down Expand Up @@ -735,7 +736,7 @@ void do_stat_object(CharData *ch, ObjData *j, const int virt = 0) {
snprintf(buf2, sizeof(buf2), "None");
}

SendMsgToChar(ch, "VNum: [%s%5d%s], RNum: [%5d], UniqueID: [%ld], Id: [%ld]\r\n",
SendMsgToChar(ch, "VNum: [%s%7d%s], RNum: [%7d], UniqueID: [%ld], Id: [%ld]\r\n",
kColorGrn, vnum, kColorNrm, j->get_rnum(), j->get_unique_id(), j->get_id());

SendMsgToChar(ch, "Расчет критерия: %f, мортов: (%f) \r\n", j->show_koef_obj(), j->show_mort_req());
Expand Down Expand Up @@ -1205,7 +1206,7 @@ void do_stat_room(CharData *ch, const int rnum = 0) {

sprinttype(rm->sector_type, sector_types, smallBuf);
snprintf(buf, sizeof(buf),
"Зона: [%3d], VNum: [%s%5d%s], RNum: [%5d], Тип сектора: %s\r\n",
"Зона: [%3d], VNum: [%s%7d%s], RNum: [%7d], Тип сектора: %s\r\n",
zone_table[rm->zone_rn].vnum, kColorGrn, rm->vnum, kColorNrm, rnum, smallBuf);
SendMsgToChar(buf, ch);

Expand Down Expand Up @@ -1277,7 +1278,7 @@ void do_stat_room(CharData *ch, const int rnum = 0) {
if (rm->dir_option[i]->to_room() == kNowhere)
snprintf(smallBuf, sizeof(smallBuf), " %sNONE%s", kColorCyn, kColorNrm);
else
snprintf(smallBuf, sizeof(smallBuf), "%s%5d%s", kColorCyn,
snprintf(smallBuf, sizeof(smallBuf), "%s%7d%s", kColorCyn,
GET_ROOM_VNUM(rm->dir_option[i]->to_room()), kColorNrm);
sprintbit(rm->dir_option[i]->exit_info.get_plane(0), exit_bits, tmpBuf, sizeof(tmpBuf));
snprintf(buf, sizeof(buf),
Expand Down
Loading
Loading