/*++ Copyright (c) 1992 Microsoft Corporation Module Name: mondmp.c Abstract: This is the main module for the monitor description file dumper. Author: Andre Vachon (andreva) 16-Jul-1992 Revision History: --*/ #include #include #include #include #include #include #include #include "nt.h" #include "monitors.h" #include "mon.h" // #define DEBUG_MONITORS // // Function declarations // int DumpMonitorFile( void ); int DumpSection( PLINE_DESCRIPTION LineDescription, char *DataBuffer ); // // Global Data // char *FileName; FILE *hFile; int _CRTAPI1 main( argc, argv ) int argc; char *argv[]; { char *p; int processReturnValue; if (argc != 2) { goto end; } p = *++argv; // // if we have a delimiter for a parameter, case throught the valid // parameter. Otherwise, the rest of the parameters are the list of // input files. // if (*p == '/' || *p == '-') { goto end; } FileName = *argv; if ( (hFile = fopen(FileName, "rb")) == 0) { fprintf(stderr,"MONDMP: Unable to open file %s for read access\n",FileName); return 1; } processReturnValue = DumpMonitorFile(); fclose(hFile); return 0; end: fprintf( stderr, "usage: MONDMP [-?] display this message\n" ); fprintf( stderr, " filename supplies minitor description file to be dumped\n" ); fprintf( stderr, "\n" ); return 0; } int DumpMonitorFile( void ) { int i, xxx = 1, yyy = 1; CM_MONITOR_DESCRIPTION monitorDescription; CM_MONITOR_OPERATIONAL_LIMITS operationalLimits; CM_MONITOR_PREADJUSTED_TIMING preadjustedTiming; // // First allocate a buffer in which we can parse and save the header // information // if (fread(&monitorDescription, sizeof(CM_MONITOR_DESCRIPTION), 1, hFile) != 1) { fprintf(stderr, "MONDMP: monitor description could not be read from file\n"); return 1; } DumpSection(MonitorDescription, (char *) &monitorDescription); // // Fill in the array of Operational Limits, and write each strcuture as // we go along // for (i=0; i < monitorDescription.NumberOperationalLimits; i++) { if (fread(&operationalLimits, sizeof(CM_MONITOR_OPERATIONAL_LIMITS), 1, hFile) != 1) { fprintf(stderr, "MONDMP: operational limits %d could not be read from file\n", i); return 1; } printf("\n\n"); DumpSection(OperationalLimits, (char *) &operationalLimits); } // // Fill in the array of Preadjusted Timings, and write each structure as // we go along. // for (i=0; i < monitorDescription.NumberPreadjustedTimings; i++) { if (fread(&preadjustedTiming, sizeof(CM_MONITOR_PREADJUSTED_TIMING), 1, hFile) != 1) { fprintf(stderr, "MONDMP: PreAdjusted timing %d could not be read from file\n", i); return 1; } printf("\n\n"); DumpSection(PreAdjustedTiming, (char *) &preadjustedTiming); } // // Everything was successful. Return 0 // return 0; } int DumpSection( LineDescription, DataBuffer ) PLINE_DESCRIPTION LineDescription; char *DataBuffer; { char *character; int cbChar; char *buffer; int floatBits; int multipleChoiceFound; int number; int i; int desc = 0; while (LineDescription[desc].LineStruct[0].OptionalField != OP_STOP) { // // Process the current line. // i = 0; printf ("\n"); do { switch (LineDescription[desc].LineStruct[i].FieldType) { case STRING_FIELD : if (LineDescription[desc].LineStruct[i].OptionalField == OP_MULTIPLE_CHOICE) { break; } if (LineDescription[desc].LineStruct[i].OptionalField == OP_MANDATORY) { printf("%s ", StringTable[LineDescription[desc].LineStruct[i].StringId]); } else { if (LineDescription[desc].LineStruct[i].OptionalField == OP_STORE) { #ifdef DEBUG_MONITORS fprintf( stderr, "\nString Offset is %d\n", LineDescription[desc].LineStruct[i].StringId); #endif for (cbChar = 0, floatBits = LineDescription[desc].LineStruct[i].FloatBits; ( *(character = DataBuffer + cbChar + LineDescription[desc].LineStruct[i].StringId) != NULL) && floatBits && (cbChar < LineDescription[desc].LineStruct[i].FloatBits); cbChar++, floatBits--) { printf( "%c", *character ); } printf (" "); } } break; case UCHAR_FIELD : case USHORT_FIELD : case ULONG_FIELD : if (LineDescription[desc].LineStruct[i].OptionalField == OP_STORE_CHOICE) { switch (LineDescription[desc].LineStruct[i].FieldType) { case UCHAR_FIELD : number = (ULONG) *((UCHAR *) (DataBuffer + LineDescription[desc].LineStruct[i].StringId)); break; case USHORT_FIELD : number = (ULONG) *((USHORT *) (DataBuffer + LineDescription[desc].LineStruct[i].StringId)); break; case ULONG_FIELD : number = *((ULONG *) (DataBuffer + LineDescription[desc].LineStruct[i].StringId)); break; } multipleChoice: i++; if (LineDescription[desc].LineStruct[i].OptionalField == OP_MULTIPLE_CHOICE) { if (LineDescription[desc].LineStruct[i].FloatBits == number) { printf("%s ", StringTable[LineDescription[desc].LineStruct[i].StringId]); } else { goto multipleChoice; } } else { i--; break; } break; } // // Extract the data // if (LineDescription[desc].LineStruct[i].OptionalField == OP_STORE) { #ifdef DEBUG_MONITORS fprintf( stderr, "\nNumber Offset is %d\n", LineDescription[desc].LineStruct[i].StringId); #endif switch (LineDescription[desc].LineStruct[i].FieldType) { case UCHAR_FIELD : number = (ULONG) *((UCHAR *) (DataBuffer + LineDescription[desc].LineStruct[i].StringId)); break; case USHORT_FIELD : number = (ULONG) *((USHORT *) (DataBuffer + LineDescription[desc].LineStruct[i].StringId)); break; case ULONG_FIELD : number = *((ULONG *) (DataBuffer + LineDescription[desc].LineStruct[i].StringId)); break; } } // // Print the value // printf ("%d ", number); break; default : fprintf (stderr, "MONDMP: Internal error in parsing due to invalid field type\n"); return 1; } i++; } while ( (LineDescription[desc].LineStruct[i].FieldType != NO_MORE_FIELDS) && (i < MAX_FIELD_ENTRIES) ); // // Go to the next line of input // desc++; } return 0; }