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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ releases
local-notes/
notes/
source/Modules/ftp/third_party/libssh2/build/
docs/superpowers
23 changes: 9 additions & 14 deletions source/Modules/icon/icon.c
Original file line number Diff line number Diff line change
Expand Up @@ -739,42 +739,37 @@ int openwindow(icon_data *data, int next)
#ifdef USE_64BIT
{
UQUAD tmp = (UQUAD)data->info.id_NumBlocks * (UQUAD)data->info.id_BytesPerBlock;
tmp >>= 10;
ItoaU64(&tmp, buf, sizeof(buf), data->decimal_sep);
BytesToString64(&tmp, buf, sizeof(buf), 1, data->decimal_sep);
}
#else
Itoa((data->info.id_NumBlocks * data->info.id_BytesPerBlock) >> 10, buf, data->decimal_sep);
BytesToString(data->info.id_NumBlocks * data->info.id_BytesPerBlock, buf, 1, data->decimal_sep);
#endif
strcat(buf, "K");
SetGadgetValue(data->list, GAD_ICON_SIZE, (IPTR)buf);

// Disk used
#ifdef USE_64BIT
{
UQUAD tmp = (UQUAD)data->info.id_NumBlocksUsed * (UQUAD)data->info.id_BytesPerBlock;
tmp >>= 10;
ItoaU64(&tmp, buf, sizeof(buf), data->decimal_sep);
BytesToString64(&tmp, buf, sizeof(buf), 1, data->decimal_sep);
}
#else
Itoa((data->info.id_NumBlocksUsed * data->info.id_BytesPerBlock) >> 10, buf, data->decimal_sep);
BytesToString(data->info.id_NumBlocksUsed * data->info.id_BytesPerBlock, buf, 1, data->decimal_sep);
#endif
strcat(buf, "K");
SetGadgetValue(data->list, GAD_ICON_USED, (IPTR)buf);

// Disk free
#ifdef USE_64BIT
{
UQUAD tmp =
((UQUAD)data->info.id_NumBlocks - (UQUAD)data->info.id_NumBlocksUsed) * (UQUAD)data->info.id_BytesPerBlock;
tmp >>= 10;
ItoaU64(&tmp, buf, sizeof(buf), data->decimal_sep);
BytesToString64(&tmp, buf, sizeof(buf), 1, data->decimal_sep);
}
#else
Itoa(((data->info.id_NumBlocks - data->info.id_NumBlocksUsed) * data->info.id_BytesPerBlock) >> 10,
buf,
data->decimal_sep);
BytesToString((data->info.id_NumBlocks - data->info.id_NumBlocksUsed) * data->info.id_BytesPerBlock,
buf,
1,
data->decimal_sep);
#endif
strcat(buf, "K");
SetGadgetValue(data->list, GAD_ICON_FREE, (IPTR)buf);

// Disk type
Expand Down
59 changes: 59 additions & 0 deletions source/Modules/icon/tests/test_icon_disk_scaling.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/usr/bin/env python3
"""Regression checks for auto-scaling disk values in the Icon Info (device) requester."""

from pathlib import Path
import unittest


ROOT = Path(__file__).resolve().parents[4]
ICON_C = ROOT / "source" / "Modules" / "icon" / "icon.c"


def read_source(path):
return path.read_text(encoding="latin-1")


def disk_info_block(source):
"""The Size/Used/Free region only, so negative checks aren't fooled by
unrelated code elsewhere in the file."""
start = source.index("// Disk size")
end = source.index("// Disk type", start)
return source[start:end]


class IconDiskScalingTests(unittest.TestCase):
def test_disk_fields_use_bytestostring64_in_64bit_branch(self):
source = read_source(ICON_C)

self.assertEqual(
source.count("BytesToString64(&tmp, buf, sizeof(buf), 1, data->decimal_sep);"),
3,
)

def test_disk_fields_use_bytestostring_in_32bit_branch(self):
source = read_source(ICON_C)

self.assertIn(
"BytesToString(data->info.id_NumBlocks * data->info.id_BytesPerBlock, buf, 1, data->decimal_sep);",
source,
)
self.assertIn(
"BytesToString(data->info.id_NumBlocksUsed * data->info.id_BytesPerBlock, buf, 1, data->decimal_sep);",
source,
)
self.assertIn(
"BytesToString((data->info.id_NumBlocks - data->info.id_NumBlocksUsed) * data->info.id_BytesPerBlock,",
source,
)

def test_old_kilobyte_formatting_removed_from_disk_fields(self):
block = disk_info_block(read_source(ICON_C))

self.assertNotIn("tmp >>= 10;", block)
self.assertNotIn('strcat(buf, "K");', block)
self.assertNotIn("(data->info.id_NumBlocks * data->info.id_BytesPerBlock) >> 10", block)
self.assertNotIn("(data->info.id_NumBlocksUsed * data->info.id_BytesPerBlock) >> 10", block)


if __name__ == "__main__":
unittest.main()