|
このプログラムについては、かなり大きなプログラムなのでわからない
部分があります。わからない部分が、←で示しています。
/*
* page3.c - テキストファイルを1画面ずつ表示
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "line.h"
#define LINE_SIZE (80 + 1 + 1) /* 80 + 改行の分 + '\0'の分 */
#define LINE_PAGE 23 /* 1画面の行数 */
#define R_QUIT_ALL 0 /* すべて終了 */
#define R_LINE_NEXT 1 /* 次のlineへ */
#define R_FILE_PREV 2 /* 前のlineへ */
#define R_PAGE_NEXT 3 /* 次のpageへ */
#define R_PAGE_PREV 4 /* 前のpageへ */
#define R_FILE_NEXT 5 /* 次のfileへ */
#define R_FILE_PREV 6 /* 前のfileへ */
extern LINE list;
static void paging (FILE *fp, int n);
static void show_page(int, int);
static void key_wait(void);
#if HAVE_GETCH
static void prompt(char *str);
static void noprompt(char *str);
#endif
static void usage(void);
static void cant(char *);
main(int argc, char **argv)
{
FILE *fp;
int r;
--argc;
++argv;
if (argc == 0)
usage();
else {
while (argc--) {
if ((fp = fopen(*argv, "r")) == NULL)
cant(*argv);
r = paging(fp, LINES_PAGE);
(void)fclose(fp);
if (r == R_QUIT_ALL)
break;
argv++;
}
}
return (0);
}
/*
* paging() - 1画面ごとに表示して止まり次のキーを待つ
*/
static void paging(FILE *fp, int n)
{
char buf[LINE_SIZE];
int c; ← この変数はなんのためにありますか
int all; ← この変数はなんのためにありますか
LINE *cur; ← この変数はなんのためにありますか
int ln; ← この変数はなんのためにありますか
cur = &list; ← これは、どういう操作ですか
all = 0;
while (fgets(buf, LINE_SIZE, fp) != NULL) {
if ((cur = add_line(cur, buf)) == NULL) { ← この操作は何ですか?
fprintf(stderr, "cant't alloc memory\n");
delete_all_lines(); ← この関数はかなりの部分で使われていますが
return (R_QUIT_ALL); 何ですか?
}
++all; ← この処理は?
}
ln = 1; ← この処理は?
show_page(ln, n); ← この処理は?
if (all <= n) { ← この処理は?
delete_all_lines();
return (R_FILE_NEXT);
}
else {
while ((c = key_wait()) != R_QUIT_ALL) {
switch (c) {
case R_FILE_NEXT:
delete_all_lines();
return (R_FILE_NEXT);
case R_LINE_NEXT: ← このケースの全体の処理
++ln;
if (ln > all - n + 1)
ln = all - n + 1;
show_page(ln, n);
break;
case R_PAGE_NEXT: ← このケースの全体の処理
ln += n;
if (ln > all - n + 1)
ln = all - n + 1;
show_page(ln, n);
break;
case R_PAGE_PREV: ← このケースの全体の処理
ln -= n;
if (ln <= 0)
ln = 1;
show_page(ln, n);
break;
}
}
}
delete_all_lines();
return (R_QUIT_ALL);
}
/*
* show_page() - 1画面分の表示
*/
static void show_page(int start, int n)
{
LINE *p;
p = &list; ← この操作は?
while (start--) ← この処理は?
p = p->next; ← この操作は?
while (n--) { ← この操作は?
fputs(p->buf, stdout); ← この操作は?
if ((p = p->next) == &list) ← この操作は?
break;
}
}
#if HAVE_GETCH
/*
* key_wait() - キーが押されるまで待つ(getch() 版)
*/
static void key_wait(void)
{
prompt("--more--"); ← この関数の処理は?
for (;;) { /* 無条件に(常に)ループ */
switch (getch()) {
case 'q';
noprompt("--more--"); ← この関数の処理は?
return (R_QUIT_ALL);
case 'n';
noprompt("--more--");
return (R_FILE_NEXT);
case ' ';
noprompt("--more--");
return (R_PAGE_NEXT);
case '\b'; /* Back Space */
case 'b';
noprompt("--more--");
return (R_PAGE_PREV);
case '\r';
noprompt("--more--");
return (R_LINE_NEXT);
}
}
}
#else
/*
* key_wait() - return キーが押されるまで待つ
*/
static int key_wait(void)
{
char comline[LINE_SIZE];
fprintf(stderr, "--Hit Return Key--", stderr);
(void)fgets(comline, LINE_SIZE, stdin);
if (comline[0] == 'q')
return (R_QUIT_ALL);
else if (comline[0] == 'n')
return (R_FILE_NEXT);
else if (comline[0] == 'b')
return (R_PAGE_PREV);
else
return (R_PAGE_NEXT);
}
#endif
#if HAVE_GETCH
static void prompt(char *str)
{
cprintf("%s", str); ← この関数の処理は?
}
#endif
#if HAVE_GETCH
static void noprompt(char *str)
{
int n;
int i;
n = strlen(str);
for (i = 0; i < n; i++) ← この処理は?
putch('\b');
for (i = 0; i < n; i++) ← この処理は?
putch(' ');
for (i = 0; i < n; i++) ← この処理は?
putch('\b');
}
#endif
static void usage(void)
{
fprintf(stderr, "Usage: page3 file [...]\n");
exit(1);
}
static void cant(char *name)
{
fprintf(stderr, "cant't open %s\n", name);
exit(1);
}
|