Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Assembler...3120 
 Advanced Bash Scripting G...2737 
 Ethreal 4...2336 
 Secure Programming for Li...2113 
 Trees...1918 
 CPAN-> FAQ...1892 
 Alg1...1846 
 Ethreal 1...1733 
 Go Web ...1723 
 Тренажёр...1721 
 Ext4 FS...1713 
 Максвелл 3...1711 
 Intel 386...1696 
 William Gropp...1663 
 Rust...1662 
 C + UNIX...1497 
 Go...1493 
 Benchmark...1490 
 System...1350 
 Mod_parrot...1338 
 
  01.01.2025 : 3803065 посещений 

iakovlev.org

Deco

Консольный файловый менеджер

Автор - Сергей Вакуленко - vak.ru

Проект deco лежит тут - deco.sf.net

Исходники можно взять также тут : deco39

Проект написан на чистом си , с использованием стандартной библиотеки ncurses.

Рассмотрим базовые структуры - структура file (dir.h) :


 struct file {
 	char name [NAMESZ];     /* file name */
 	char *info;             /* file info */
 	char *rinfo;            /* file info in russian */
 	unsigned execable:1;    /* file is executable for me */
 	unsigned tag:1;         /* file tagged */
 	unsigned link:1;        /* symbolic link */
 	unsigned infoflag:1;    /* info is read */
 	unsigned dateflag:1;    /* date is read from info file */
 	unsigned long size;     /* file size */
 	unsigned short mode;    /* access mode */
 	unsigned short uid;     /* user ident */
 	unsigned short gid;     /* group ident */
 	unsigned short nlink;   /* number of file links */
 	short dev;              /* device */
 	short rdev;             /* special file parameters */
 	unsigned long ino;      /* i-node */
 	unsigned long mtime;    /* modification time */
 	unsigned long atime;    /* access time */
 	unsigned long ctime;    /* status change time */
 	unsigned long infodate; /* date from info file */
 };
 
Структура dir :

 struct dir {
 	char cwd [MAXPATHLEN];  /* directory full name */
 	char *shortcwd;         /* short printable directory name */
 	short dev;              /* device */
 	unsigned long ino;      /* i-node */
 	struct file *cat;       /* catalog */
 	int catsz;              /* length of catalog */
 	int num;                /* number of files in cat */
 	int topfile;            /* top file in the window */
 	int curfile;            /* current file */
 	char view;              /* view format */
 	char status;            /* is it status window */
 	char sort;              /* sort kind */
 	char typesort;          /* sort by file types */
 	char revsort;           /* reverse sorting */
 	char alignext;          /* align extensions */
 	int basecol;            /* base of window */
 	int nfiles;             /* number of regular files */
 	long nbytes;            /* number of bytes used */
 	int mfiles;             /* number of matched files */
 	long mbytes;            /* number of bytes matched */
 	int tfiles;             /* number of tagged files */
 	long tbytes;            /* number of bytes tagged */
 	char pattern [PATSZ];   /* pattern for file names */
 };
 
В структуре dir обратите внимание на указатель *cat - указатель на массив вложенных файлов и подкаталогов. Инициализация текущего каталога происходит в функции int setdir (struct dir *d, char *dirname) (dir.c).

Для вывода на экран есть структура WINDOW (scr.h) :


 typedef struct {
 	short cury, curx;
 	short flgs;
 	char clear;
 	short **y;
 	short *firstch;
 	short *lastch;
 	short *lnum;
 } WINDOW;
 
Здесь **y - 2-мерный массив ячеек экрана , рамерность экрана - LINES * COLS. Создаются 2 обьекта этой структуры - VScreen , curscr. Весь рабочий вывод идет вначале в буфер - первое невидимое окно VScreen . Результат перенаправляется во второе окно - curscr. Синхронизация этих окон происходит при каждом событии. При это curscr вначале очищается пробелами , потом происходит построчная синхронизация . В следующей функции int y - индекс такой строки :

 static void makech (int y)
 {
 	register short *new, *old;
 	register short x, lastch;
 
 	x = VScreen.firstch[y];
 	lastch = VScreen.lastch[y];
 	old = &curscr.y [y] [x];
 	new = &VScreen.y [y] [x];
 	for (; x<=lastch; ++new, ++old, ++x) 
 	{
 		if (*new == *old)
 			continue;
 		if (x >= COLS-1 && y >= LINES-1)
 			return;
 		domvcur (y, x);
 		setattr (*new);
 		putch (*old = *new);
 		curscr.curx = x + 1;
 	}
 }
 

После старта инициализируется 2 панели . В левой показывается текущий каталог , в правой - рутовый. Можно выбрать несколько режимов - для этого выбираем меню по F9.

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье