Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
# Диагностическая проба предельного каталога P3.
|
||||
|
||||
PROJ_ROOT := $(abspath $(CURDIR)/../../../..)
|
||||
EXAMPLE := p3dir
|
||||
MEMORY := small
|
||||
ALLOCS ?= 3000
|
||||
EXTRA_FLAGS := --safe --max-allocs $(ALLOCS)
|
||||
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
|
||||
$(EXE): Makefile
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* p3dir.c — изолированная диагностика большого FAT-каталога DSS.
|
||||
*
|
||||
* Проба ничего не изменяет: входит в BIGDIR, полностью исчерпывает
|
||||
* F_FIRST/F_NEXT, печатает фактический предел и проверяет возврат в корень.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <dir.h>
|
||||
#include <conio.h>
|
||||
|
||||
#define FIND_ATTRS (FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH)
|
||||
|
||||
static ffblk_t find_buf;
|
||||
static char cwd[256];
|
||||
static char last_name[13];
|
||||
static char name_511[13];
|
||||
static char name_512[13];
|
||||
static char name_513[13];
|
||||
static uint16_t enum_count;
|
||||
static int enum_errno;
|
||||
|
||||
static void save_name(char *dst)
|
||||
{
|
||||
strncpy(dst, find_buf.found_name, 12u);
|
||||
dst[12] = '\0';
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
(void)settextmode(TEXT_MODE_80x32);
|
||||
clrscr_attr(0x17);
|
||||
gotoxy(0, 0);
|
||||
textattr(0x1Fu);
|
||||
cputs("P3 BIGDIR diagnostic\r\n\r\n");
|
||||
textattr(0x17u);
|
||||
|
||||
errno = 0;
|
||||
rc = chdir("\\BIGDIR");
|
||||
printf("1 chdir BIGDIR: rc=%d errno=%d\n", rc, errno);
|
||||
if (rc != 0) goto done;
|
||||
|
||||
errno = 0;
|
||||
if (getcwd(cwd, (uint16_t)sizeof(cwd)))
|
||||
printf("2 cwd: %s\n", cwd);
|
||||
else
|
||||
printf("2 getcwd failed: errno=%d\n", errno);
|
||||
|
||||
errno = 0;
|
||||
rc = ffirst("*.*", &find_buf, FIND_ATTRS);
|
||||
printf("3 ffirst: rc=%d errno=%d\n", rc, errno);
|
||||
enum_count = 0u;
|
||||
if (rc == 0) {
|
||||
for (;;) {
|
||||
enum_count++;
|
||||
save_name(last_name);
|
||||
if (enum_count == 511u) save_name(name_511);
|
||||
if (enum_count == 512u) save_name(name_512);
|
||||
if (enum_count == 513u) save_name(name_513);
|
||||
errno = 0;
|
||||
if (fnext(&find_buf) != 0) break;
|
||||
if (enum_count == 2000u) {
|
||||
puts("Loop guard reached.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
enum_errno = errno;
|
||||
printf("4 enum: count=%u errno=%d last=%s\n",
|
||||
(unsigned)enum_count, enum_errno, last_name);
|
||||
printf("5 boundary: 511=%s 512=%s 513=%s\n",
|
||||
name_511, name_512, name_513);
|
||||
|
||||
errno = 0;
|
||||
rc = chdir("\\");
|
||||
printf("6 chdir root: rc=%d errno=%d\n", rc, errno);
|
||||
errno = 0;
|
||||
if (getcwd(cwd, (uint16_t)sizeof(cwd)))
|
||||
printf("7 cwd: %s\n", cwd);
|
||||
else
|
||||
printf("7 getcwd failed: errno=%d\n", errno);
|
||||
|
||||
done:
|
||||
textattr(0x1Eu);
|
||||
cputs("\r\nProbe stopped; MAME test will take a snapshot.");
|
||||
for (;;) (void)getkey();
|
||||
}
|
||||
Reference in New Issue
Block a user