Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

189 lines
3.9 KiB

/*
* Module: main.c
* Author: Mark I. Himelstein, Himelsoft, Inc.
* Purpose: converter calls my main
*/
#include "conv.h"
#include "ntimage.h"
#include <stdio.h>
extern IMAGE_SECTION_HEADER CoffSectionHdr[14];
extern int verbose;
int verbose;
static int indent = 0;
static int first_indent = 0;
void
warning(message, arg1, arg2, arg3)
char *message;
void *arg1;
void *arg2;
void *arg3;
{
fprintf(stdout, "warning: ");
fprintf(stdout, message, arg1, arg2, arg3);
} /* warning */
void
fatal(message, arg1, arg2, arg3)
char *message;
void *arg1;
void *arg2;
void *arg3;
{
fprintf(stdout, "fatal: ");
fprintf(stdout, message, arg1, arg2, arg3);
exit(1);
} /* fatal */
static void
usage()
{
/*
* print usage statement and exit program
*/
fatal("Usage: conv object_file\n");
} /* usage */
void
verbose_printf(format, arg1, arg2, arg3, arg4)
char *format;
{
int i;
static last_had_nl = 1;
if (last_had_nl) {
for (i = 0; i < first_indent+indent; i++)
fprintf(stdout, " ");
} /* if */
fprintf(stdout, format, arg1, arg2, arg3, arg4);
last_had_nl = (format[strlen(format)-1] == '\n');
} /* verbose_print */
void
verbose_print(start, bytes, format, arg1, arg2, arg3, arg4)
char *format;
{
fprintf(stdout, "[ %2d,%2d ] ", start, bytes);
fprintf(stdout, format, arg1, arg2, arg3, arg4);
fprintf(stdout, "\n");
} /* verbose_print */
void
verbose_mc_symbol(pSYMR psym, SYM_ENUM_e cv_sym)
{
if (psym && verbose) {
fprintf(stdout, "%s\t%s =>\t%s\n", mc_st_to_ascii(psym->st),
mc_sc_to_ascii(psym->sc), cv_sym_to_ascii(cv_sym));
} /* if */
} /* verbose_mc_symbol */
#define INDENT_STACK_SIZE 1024
int indent_stack[INDENT_STACK_SIZE];
int indent_stack_top;
void
verbose_pop_indent()
{
if (indent_stack_top <= 0)
return; /* fatal("poped too many indents\n"); */
first_indent = indent_stack[--indent_stack_top];
if (first_indent < 0) {
warning("first_indent < 0 (%d)\n", indent);
first_indent = 0;
} /* if */
} /* verbose_pop_indent */
void
verbose_push_indent(num_chars)
{
if (indent_stack_top >= INDENT_STACK_SIZE)
fatal("pushed too many indents\n");
indent_stack[indent_stack_top++] = first_indent;
first_indent = num_chars;
if (first_indent < 0) {
warning("first_indent < 0 (%d)\n", indent);
first_indent = 0;
} /* if */
} /* verbose_push_indent */
void
VERBOSE_SET_INDENT(num_chars)
{
first_indent = num_chars;
if (indent < 0) {
warning("indent < 0 (%d)\n", indent);
indent = 0;
} /* if */
} /* VERBOSE_SET_INDENT */
void
verbose_add_indent(num_chars)
{
indent += num_chars;
if (indent < 0) {
warning("indent < 0 (%d)\n", indent);
indent = 0;
} /* if */
} /* verbose_add_indent */
void
convert_symbols_and_types(
char *infile,
FILE *outfile)
{
/* assume outfile is positioned to where I can to start
* dumping things
*/
struct conv_s conv;
init_symbol_relocation(outfile);
conv_open(&conv, infile);
symbols_map(&conv);
CoffSectionHdr[CVTYP].PointerToRawData = ftell(outfile);
CoffSectionHdr[CVTYP].SizeOfRawData = type_write(outfile);
CoffSectionHdr[CVSYM].PointerToRawData = ftell(outfile);
CoffSectionHdr[CVSYM].SizeOfRawData = buffer_write(symbol_buf, outfile);
conv_close(&conv);
} /* convert_symbols_and_types */
#ifdef STANDALONE
void
_CRTAPI1 main(argc, argv)
char **argv;
{
/*
* check for object argument and open converter descriptor
*/
struct conv_s conv;
if (argc == 3) {
if (strcmp(argv[1], "-v") != 0) {
usage();
} /* if */
verbose = 1;
argc--;
argv++;
} /* if */
if (argc != 2) {
usage();
} /* if */
convert_symbols_and_types(argv[1], 0, 0, 0);
exit(0);
} /* main */
#endif