index.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:7k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /********************************* INDEX.C *********************************/
  2. /* Copyright (c) 1989 - Microsoft Corp. */
  3. /* All rights reserved */
  4. /* */
  5. /* Program to read a message file and create a header file with the offsets*/
  6. /* to each entry in the file. */
  7. /* */
  8. /* EXAMPLE: */
  9. /* INDEX  infile_name.ext  outfile_name.ext */
  10. /***************************************************************************/
  11. #include    <stdio.h>
  12. #include    <string.h>
  13. #include    <malloc.h>
  14. #define EOL 0
  15. /***************************************************************************/
  16. int main( int argc, char *argv[] );
  17. int ProcessMessage( char *Buffer );
  18. /***************************************************************************/
  19. /***************************************************************************/
  20. /* Reads a help file and creates a header file with the offsets to each */
  21. /* entry in the file as a #define value. The help file must have the */
  22. /* following layout. */
  23. /* */
  24. /*   .LABEL_TEXT                                                           */
  25. /*   Body of the text up to 25 lines                                       */
  26. /*   .LABEL2_TEXT                                                          */
  27. /*   Body of the text up to 25 lines                                       */
  28. /*   ......                                                                */
  29. /*   .END                                                                  */
  30. /* */
  31. /* The resulting file which is created has this format, where xxxx is a    */
  32. /* long numeric value.                                                     */
  33. /*                                                                         */
  34. /* #define LABEL_TEXT xxxx */
  35. /* #define LABEL_LINES xxxx */
  36. /* #define LABEL2_TEXT xxxx */
  37. /* #define LABEL2_LINES xxxx */
  38. /* #define  ......_TEXT xxxx */
  39. /* #define ......_LINES xxxx */
  40. /* */
  41. /* A second file is created which contains the text from the message file  */
  42. /* in a form which is assemble-able with the Microsoft MASM 5.1. */
  43. /* */
  44. /* Blank lines and line which start with a simicolon are ignored and only */
  45. /* the text within quote is used. Quotes are not allowed within the text */
  46. /* at this time. */
  47. /* */
  48. /* */
  49. /* EXAMPLE TEXT FILE: */
  50. /* */
  51. /* */
  52. /* ; ============================================================= */
  53. /* ; ============================================================= */
  54. /* ; All of these lines are the same length to give a better */
  55. /* ; appearance on the screen */
  56. /* ; */
  57. /* */
  58. /* .REMINDER_TEXT */
  59. /* */
  60. /* "<ENTER>    = Continue the installation" */
  61. /* "<ENTER>    = Accept entry and continue" */
  62. /* "<ESC>      = Return to previous screen" */
  63. /* "<ESC>      = Exit installation program" */
  64. /* "<CTRL>+<C> = Exit installation program" */
  65. /* */
  66. /* .END_TEXT */
  67. /* */
  68. /***************************************************************************/
  69. int main( int argc, char *argv[] )
  70. {
  71.    FILE *sFile, *hFile, *aFile; /* Source and header files */
  72. char *szBuffer, *szPtr; /* Work szBuffer and pointer */
  73. char *szLastDef; /* The last define string */
  74. unsigned Offset = 0; /* Current offset */
  75. int iNumBytes, iNumLines;
  76. int Status = 0;
  77.    if ( argc < 3 )
  78.       Status = 8;
  79.    else if ( (sFile = fopen( argv[1], "rb" )) == NULL )
  80.       Status = 1;
  81.    else if ( (hFile = fopen( argv[2], "wb" )) == NULL )
  82.       Status = 2;
  83. else if ( (aFile = fopen( "MESSAGE.ASM", "wb" )) == NULL )
  84. Status = 3;
  85.    else if ( (szBuffer = malloc( 200 )) == NULL )
  86.       Status = 4;
  87. else if ( (szLastDef = malloc( 200 )) == NULL )
  88. Status = 4;
  89.    else
  90.    {
  91. fprintf( aFile, "DOSSEGrn"  );
  92. fprintf( aFile, ".MODELtSMALL,Crn"  );
  93. fprintf( aFile, "rnrn.DATArnrn" );
  94. fprintf( aFile, "tPUBLIC chMessagern" );
  95. fprintf( aFile, "chMessagetLABEL BYTErnrn" );
  96. fprintf( hFile, "voidtGetMessage( char **Ptr, unsigned Offset_u );rn" );
  97. fprintf( hFile, "voidtGetMessStr( char *szBuf, unsigned Offset_u, int StrNum );rnrn" );
  98. while( !feof( sFile) && Status == 0 )
  99. {
  100. while( !feof( sFile) && Status == 0 )
  101.        {
  102. if( *szBuffer == '.' )
  103. {
  104. /* Convert newline to EOL */
  105. *(strchr( szBuffer, 'r')) = '';
  106. strcpy( szLastDef, szBuffer + 1 ); /* Save definition */
  107. if (fprintf( hFile, "#definett%-25s %#4.4xrn",
  108.  szLastDef, Offset ) == 0 )
  109. Status = 4;
  110. break;
  111. }
  112. else if ( fgets( szBuffer, 132, sFile ) != szBuffer )
  113. Status = 4;
  114. }
  115. if ( Status == 0 )
  116. {
  117. fgets( szBuffer, 132, sFile );
  118. iNumLines = 0;
  119. }
  120. while ( !feof( sFile) && *szBuffer != '.' && Status == 0 )
  121. {
  122. if ( (iNumBytes = ProcessMessage( szBuffer )) >= 0 )
  123. {
  124. iNumBytes++;
  125. iNumLines++;
  126. if ( iNumBytes > 1 )
  127. szPtr = "dbt"%s",0rn";
  128. else
  129. szPtr = "dbt0rn";
  130. if ( fprintf( aFile, szPtr, szBuffer ) == 0 )
  131. Status = 4;
  132. else
  133. Offset += iNumBytes;
  134. }
  135. if ( iNumBytes == -2 )
  136. Status = -2;
  137. else
  138. fgets( szBuffer, 132, sFile ) != szBuffer;
  139. }
  140. if ( Status == 0 )
  141. Offset++;
  142. fprintf( aFile, "dbt-1rn" );
  143. strcpy( strchr( szLastDef, EOL ) - 4, "LINES" );
  144. fprintf( hFile, "#definett%-25s %#4.4xrn", szLastDef,
  145. ++iNumLines ); /* Add 1 line for NULL */
  146. }
  147. }
  148. }
  149. if ( Status == 0 )
  150. fprintf( aFile, "rnENDrn" );
  151. fcloseall();
  152. if ( Status != 0 )
  153. printf( "nError status = %dn", Status );
  154. return( Status );
  155. }
  156. int ProcessMessage( char *szBuffer )
  157. {
  158. int iCount;
  159. char *pszPtr;
  160. pszPtr = szBuffer;
  161. while ( *pszPtr != '"' && *pszPtr != EOL && *pszPtr != ';' )
  162. pszPtr++;
  163. if ( *pszPtr == '"' )
  164. {
  165. pszPtr++;
  166. for( iCount = 0;
  167.   *pszPtr != '"';
  168.   iCount++, szBuffer++, pszPtr++ )
  169. {
  170. *szBuffer = *pszPtr;
  171. if ( *pszPtr == EOL )
  172. {
  173. iCount = -2 ; /* Missing end quote */
  174. break;
  175. }
  176. }
  177. *szBuffer = EOL;
  178. }
  179. else
  180. iCount = -1; /* Ingore this line */
  181. return( iCount );
  182. }