/*
	猫の目ビュア for WonderWitch (on WonderSwan, WonderSwanColor)
			
		Copyright (c) 2000,2001, B-soft. All rights reserved.
		Programmed by KAKKO
*/

#include <stdio.h>
#include <string.h>
#include <sys/process.h>
#include <sys/fcntl.h>
#include <sys/bios.h>

#include "neko_view.h"

extern void drw_date(void);
extern void drw_time(void);

static char entry[500][30];
static int entry_page = 0;
static int entry_num = 0;
static int st, ed;

#define DIR_NUM		3

static char dir_name[DIR_NUM][7] = {"/rom0/", "/ram0/", "/kern/"};

static void clr_list(void)
{
	int i;
	
	for(i = 0; i < 17; i++){
		text_put_string(0, i, "                    ");
	}
}

static void drw_entry(void)
{
	int i;
	int n;
	char buff[20];
	
	clr_list();
	for(i = 0; i < 17; i++){
		n = entry_page * 17 + i;
		if(n >= entry_num){
			break;
		}
		strncpy(buff, &(entry[n][6]), 16);
		text_put_string(2, i, buff);
		if(entry[n][2] == 'o'){
			text_put_char(1, i, 0x02);
		}
		else if(entry[n][2] == 'a'){
			text_put_char(1, i, 0x0f);
		}
		else{
			text_put_char(1, i, 0x13);
		}
	}
	text_put_string(7, 17, "A:sel B:esc");
}


static int set_sted(int pos)
{
	int rtn = 0;
	
	if(pos < 0){
		pos = 0;
	}
	else if(pos >= entry_num){
		pos = entry_num - 1;
	}
	
	if(entry_page != (pos / 17)){
		entry_page = pos / 17;
		rtn = 1;
	}
	
	st = entry_page * 17;
	ed = st + 17 - 1;
	
	if(ed >= entry_num){
		ed = entry_num - 1;
	}
	
	return rtn;
}


int get_filename(char *fname)
{
	struct stat statbuf;
	int i;
	int dn;
	int num;
	int ret;
	int ch = 0x10;
	int sp = ' ';
	int pos = 0;
	int key;
/*	int cnt = 0;*/
	int y = 0;
	char buff[17];
	
	entry_page = 0;
	entry_num = 0;
	
/*
	drw_date();
	drw_time();
*/
	
	for(dn = 0; dn < DIR_NUM; dn++){
		num = nument(dir_name[dn]);
		if(num != E_FS_FILE_NOT_FOUND){
			for(i = 0; i < num; i++){
				ret = getent(dir_name[dn], i, &statbuf);
				if (ret == E_FS_SUCCESS) {
		    		if (statbuf.count != -1) {
						strncpy(buff, statbuf.name, 16);
						strcpy(entry[entry_num], dir_name[dn]);
						strcat(entry[entry_num], statbuf.name);
						entry_num++;
						y++;
					}
				}
				else{
					break;
				}
			}
		}
	}
	
	pos = 0;
	set_sted(pos);
	drw_entry();
	text_put_char(0, pos, ch);
	
	while(1){
		key = key_press_check();
		if((key & KEY_A) != 0){
			break;
		}
		else if((key & KEY_B) != 0){
			return -1;
		}
		else if((key & KEY_X1) != 0){
			pos--;
			sys_wait(15);
		}
		else if((key & KEY_X3) != 0){
			pos++;
			sys_wait(15);
		}
		else if((key & KEY_X4) != 0){
			if((entry_num - (entry_page * 17)) > 0){
				entry_page++;
				pos = entry_page * 17;
				drw_entry();
			}
			sys_wait(15);
		}
		else if((key & KEY_X2) != 0){
			if(entry_page > 0){
				entry_page--;
				pos = entry_page * 17;
				drw_entry();
			}
			sys_wait(15);
		}
		if(pos < 0){
			pos = 0;
		}
		else if(pos >= entry_num){
			pos = entry_num - 1;
		}
		
		if(set_sted(pos) != 0){
			drw_entry();
		}
		
		for(i = st; i <= ed; i++){
			if(i == pos){
				text_put_char(0, i - (entry_page * 17), ch);
			}
			else{
				text_put_char(0, i - (entry_page * 17), sp);
			}
		}
/*		drw_time();*/
	}
	
	strcpy(fname, entry[pos]);
	if(strlen(&fname[6]) > 16){
		fname[22] = 0x00;
	}
	
	return 0;
}
