/* INT2QH.C * * Author: Kai Uwe Rommel * Date: Sun 07-Oct-1990 * Update: Sat 20-Oct-1990 * Update: Sun 11-Nov-1990 Ralf Brown * Update: Ralf Brown (added Bent Lynggaard's INT2GUID enh) * Update: Sat 23-Apr-1994 Ralf Brown (updated for compat. w/ INTER41) * * Compiler: MS C 5.00 and newer / compact model, or TC 2.0 / compact model * System: PC/MS-DOS 3.20 and newer, OS/2 1.0 and newer * */ #define LABEL "int2qh.c" #define VERSION "1.4" #include #include #include #include #define divider_line(s) (strncmp(s,"--------",8)==0) FILE *input, *output, *topics, *subtopics; char line1[128]; char line2[128]; char category[128]; char parent[128]; char infilename[14] = "interrup.lst"; #define infileExt 9 int splitInfile = 0; int sub; void diskFull(void) { fputs("\n\nDisk full\n", stderr); fcloseall(); unlink("topic.tmp"); unlink("subtopic.tmp"); exit(1); } int _fputs(char *line, FILE *stream) { char buffer[128]; int cnt = 0; while ( *line ) { if ( *line == '\\' ) buffer[cnt++] = '\\'; buffer[cnt++] = *line++; } buffer[cnt] = 0; return fputs(buffer, stream); } char *_fgets(char *s, int n, FILE *stream) { char *ptr; ptr = fgets(s, n, stream); if ( (ptr==NULL) && (stream==input) && splitInfile ) { fclose(input); infilename[infileExt]++; input = fopen(infilename, "r"); if ( input != NULL ) { fprintf(stderr, "%s\n", infilename); ptr = fgets(s, n, input); } } return ptr; } /* _fgets */ void Initialize(void) { input = fopen(infilename, "r"); if ( input == NULL ) { infilename[infileExt] = 'a'; infilename[infileExt+1] = 0; input = fopen(infilename, "r"); if ( input == NULL ) { fputs("Cannot open input file (INTERRUP.LST or INTERRUP.A)\n", stderr); exit(1); } splitInfile = 1; } #ifdef __MSDOS__ setvbuf(input,NULL,_IOFBF,8192) ; #endif fprintf(stderr, "%s\n", infilename); output = stdout; topics = fopen("topic.tmp", "w"); subtopics = fopen("subtopic.tmp", "w"); fprintf(topics, ".context List Categories\n.list\nInterrupt-List\n" ".context Interrupt-List\n.context INTLIST\n.topic Interrupt-List\n.list\n" ); } void Cleanup(void) { fclose(topics); fclose(subtopics); fputs("Cleaning up\n", stderr); topics = fopen("topic.tmp", "r"); subtopics = fopen("subtopic.tmp", "r"); while ( fgets(line1, sizeof(line1), topics) ) if ( fputs(line1, output) == EOF ) diskFull(); while ( fgets(line1, sizeof(line1), subtopics) ) if ( fputs(line1, output) == EOF ) diskFull(); fcloseall(); unlink("topic.tmp"); unlink("subtopic.tmp"); } void CopyFile(char *name) { FILE *temp = fopen(name, "r"); if ( temp == NULL ) { fprintf(stderr, "WARNING: Could not open %s\n", name); fputs("Information was not available\n", output); } else { while ( fgets(line2, sizeof(line2), temp) ) _fputs(line2, output); fclose(temp); } } void StartTopic(char *name, char *desc) { fprintf(sub ? subtopics : topics, "%s %s\n", name, desc); fprintf(output, ".context %s\n.category %s\n.topic %s\n", name, parent, desc); } void StartList(char *name, char *desc) { fprintf(topics, "%s %s (list)\n", name, desc); fprintf(subtopics, ".context %s\n.category %s\n.topic %s\n.list\n", name, parent, desc); strcpy(category, desc); strcpy(parent, name); sub = 1; } void EndList(void) { strcpy(category, "Interrupt-List"); strcpy(parent, "INTLIST"); sub = 0; } char *NextID(void) { static char ID[32]; static unsigned long CurrentID = 0; CurrentID++; sprintf(ID, "IL%04ld", CurrentID); return ID; } int RecognizedTopic(void) { char *ptr, topic[64], desc[128]; if ( _fgets(line2, sizeof(line2), input) == NULL ) return 0; if (strncmp("INT ",line1,4) != 0) return 0; ptr = line1 + 6 ; while (*ptr == ' ') ptr++ ; *--ptr = 0; strcpy(topic, line1); *ptr = ' '; if ( topic[strlen(topic) - 1] == 'h' ) topic[strlen(topic) - 1] = 0; if ( strcmp(category, topic) && sub ) EndList(); strcpy(desc, line1); desc[strlen(desc) - 1] = 0; for (ptr = line2 ; isspace(*ptr) ; ptr++) ; if ( (!strncmp(ptr, "AX =", 4) || !strncmp(ptr, "AH =", 4) || !strncmp(ptr, "AL =", 4)) && !sub ) StartList(NextID(), topic); StartTopic(NextID(), desc); _fputs(line1, output); if ( !divider_line(line2) ) _fputs(line2, output); return 1; } void CopyTopic(void) { if ( divider_line(line2) ) { /* kludge for one-line interrupts */ _fgets(line1, sizeof(line2), input); return; } for (;;) { if ( _fgets(line1, sizeof(line1), input) == NULL ) break; if ( !divider_line(line1) ) _fputs(line1, output); else { if ( _fgets(line2, sizeof(line2), input) == NULL ) break; if ( strncmp(line2, "INT ", 4) ) { _fputs(line1, output); _fputs(line2, output); } else { strcpy(line1, line2); break; } } } } void main(void) { fprintf(stderr, "\nINT2QH %s - (c) Kai Uwe Rommel/Bent Lynggaard - %s\n", VERSION, __DATE__); Initialize(); EndList(); StartTopic("HEADER", "Overview of the Interrupt List"); CopyTopic(); StartTopic("MEMLIST", "BIOS Memory List"); CopyFile("memory.lst"); StartTopic("PORTS", "I/O Ports") ; CopyFile("ports.lst") ; StartTopic("CMOS", "CMOS Memory Locations") ; CopyFile("cmos.lst") ; StartTopic("CPUBUGS", "Bugs in various CPUs") ; CopyFile("86bugs.lst") ; StartTopic("Primer ", "What is an interrupt?"); CopyFile("interrup.pri") ; StartTopic("Glossary", "Terminology used in the List") ; CopyFile("glossary.lst") ; StartTopic("INTERRUP.1ST","How to get/update the Interrupt List"); CopyFile("interrup.1st") ; while ( RecognizedTopic() ) CopyTopic(); Cleanup(); exit(0); } /* End of INT2QH.C */