#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

#include "winsyscalls.h"

char *versions[] = {
    "OS_NT_SP3",
    "OS_NT_SP4",
    "OS_NT_SP5",
    "OS_NT_SP6",
    "OS_2K_SP0",
    "OS_2K_SP1",
    "OS_2K_SP2",
    "OS_2K_SP3",
    "OS_2K_SP4",
    "OS_XP_SP0",
    "OS_XP_SP1",
    "OS_XP_SP2",
    "OS_XP_SP3",
    "OS_2003_SP0",
    "OS_2003_SP1",
    "OS_VISTA_SP0",
    "OS_SEVEN_SP0"
};

#define NSYSCALLS sizeof(syscalls)/sizeof(struct SCENTRY)

void usage(char *name)
{
  printf("usage: %s <-f first> <-n entries> <opc:-v version> <opc:-s syscall>\n", name);
  exit(1);
}

int main(int argc, char *argv[])
{
int first, nvalues, last, i, range = 0;
char *version = NULL;
char *syscall = NULL;
int v = OS_SEVEN_SP0;
struct SCENTRY *entry;

	if (argc < 3) {
		usage(argv[0]);
		exit(1);
	}
		// Parse command line arguments
	for (i= 1; i < argc; i++) {	
		if (strcmp(argv[i], "-f") == 0) {
			if (i+1 >= argc)
				usage(argv[0]);
			first = atoi(argv[1+1]);
			range++;
		}
		if (strcmp(argv[i], "-n") == 0) {
			if (i+1 >= argc)
				usage(argv[0]);
			nvalues = atoi(argv[i+1]);
			range++;
		}
		if (strcmp(argv[i], "-v") == 0) {
			if (i+1 >= argc)
				usage(argv[0]);
			version = argv[i+1];
		}
		if (strcmp(argv[i], "-s") == 0) {
			if (i+1 >= argc)
				usage(argv[0]);
			syscall = argv[i+1];
		}
	}
	printf("\nSyscall Table Size %d\n", NSYSCALLS);

	if (version) {
		for (v = 0; v <= OS_SEVEN_SP0; v++) {
			// printf("%d\n", v);
			if (strcmp(version, versions[v]) == 0)
				break; // Found version
		}
		if (v > OS_SEVEN_SP0) {
			printf("Wrong system version %s\n", argv[3]);
			exit(-1);
		}
		printf("\nSystem Version %s\n\n", versions[v]);
	}
	if (syscall) {
		for (entry = syscalls, i = 0; entry < &syscalls[NSYSCALLS]; entry++, i++) {
			if (strcmp(syscall, entry->name) == 0)
				break; // Found version
		}
		if (entry >= &syscalls[NSYSCALLS]) {
			printf("Unknown system call %s\n", syscall);
			exit(-1);
		}
		printf("%d %s", i, entry->name);
		printf(" 		%d\n", entry->x[v]);		
	}
	// printf("first %d last %d\n", first, last);
	if (range == 2) {
		last = first + nvalues;
		if (last > NSYSCALLS) {
			printf("Wrong number %d max = %d\n", last, NSYSCALLS);
			exit(-1);
		}	
		for (i = first; i < last; i++) {
			printf("%d %s", i, syscalls[i].name);
			printf("		%d\n", syscalls[i].x[v]);
		}
	}
}
