140 lines
3.6 KiB
C
140 lines
3.6 KiB
C
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// idlclean
|
||
|
//
|
||
|
// Copyright (c) 1996-1999 Microsoft Corporation
|
||
|
//
|
||
|
// Takes a MIDL-generated .H file and converts the commented-out
|
||
|
// [in] and [out] keywords into IN and OUT so sortpp/genthnk can
|
||
|
// find them.
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
// string to put in front of all error messages so that BUILD can find them.
|
||
|
const char *ErrMsgPrefix = "NMAKE : U8603: 'IDLCLEAN' ";
|
||
|
|
||
|
#define BUFLEN 8192
|
||
|
char buffer[BUFLEN];
|
||
|
|
||
|
const char szLinePrefix[]="/* ";
|
||
|
const char szIn[] = "[in]";
|
||
|
const char szOut[] = "[out]";
|
||
|
|
||
|
|
||
|
int __cdecl main(int argc, char *argv[])
|
||
|
{
|
||
|
FILE *fpIn, *fpOut;
|
||
|
char *p;
|
||
|
char *pchLineStart;
|
||
|
BOOL fInPrinted;
|
||
|
BOOL fOutPrinted;
|
||
|
|
||
|
if (argc != 3) {
|
||
|
fprintf(stderr, "%sUsage: IDLCLEAN infile outfile\n", ErrMsgPrefix);
|
||
|
return 1;
|
||
|
}
|
||
|
fpIn = fopen(argv[1], "r");
|
||
|
if (!fpIn) {
|
||
|
fprintf(stderr, "%sCould not open input file '%s'\n", ErrMsgPrefix, argv[1]);
|
||
|
return 1;
|
||
|
}
|
||
|
fpOut = fopen(argv[2], "w");
|
||
|
if (!fpOut) {
|
||
|
fprintf(stderr, "%sCould not open output file '%s\n", ErrMsgPrefix, argv[2]);
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
while (!feof(fpIn)) {
|
||
|
//
|
||
|
// Read a line from the input file
|
||
|
//
|
||
|
if (!fgets(buffer, BUFLEN, fpIn)) {
|
||
|
break;
|
||
|
}
|
||
|
if (feof(fpIn)) {
|
||
|
break;
|
||
|
}
|
||
|
pchLineStart = buffer;
|
||
|
|
||
|
//
|
||
|
// Skip leading spaces
|
||
|
//
|
||
|
while (*pchLineStart == ' ') {
|
||
|
fprintf(fpOut, " ");
|
||
|
pchLineStart++;
|
||
|
}
|
||
|
|
||
|
if (strncmp(pchLineStart, szLinePrefix, sizeof(szLinePrefix)-1) != 0) {
|
||
|
//
|
||
|
// Line doesn't start with the character sequence which prefixes
|
||
|
// in/out decorators on arguments.
|
||
|
//
|
||
|
goto PrintLine;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Don't generate 'IN IN', etc. caused by MIDL output like
|
||
|
// '[in][size_is][in]'
|
||
|
//
|
||
|
fInPrinted = FALSE;
|
||
|
fOutPrinted = FALSE;
|
||
|
|
||
|
//
|
||
|
// Set a pointer to the first '['
|
||
|
//
|
||
|
p = pchLineStart + sizeof(szLinePrefix)-1;
|
||
|
if (*p != '[') {
|
||
|
//
|
||
|
// The first char inside the comment isn't a '['. Just print
|
||
|
// the line as-is.
|
||
|
//
|
||
|
goto PrintLine;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// The line needs modification. Do it now.
|
||
|
//
|
||
|
fprintf(fpOut, " ");
|
||
|
while (*p == '[') {
|
||
|
if (strncmp(p, szIn, sizeof(szIn)-1) == 0) {
|
||
|
if (!fInPrinted) {
|
||
|
fprintf(fpOut, "IN ");
|
||
|
fInPrinted = TRUE;
|
||
|
}
|
||
|
p += sizeof(szIn)-1;
|
||
|
} else if (strncmp(p, szOut, sizeof(szOut)-1) == 0) {
|
||
|
if (!fOutPrinted) {
|
||
|
fprintf(fpOut, "OUT ");
|
||
|
fOutPrinted = TRUE;
|
||
|
}
|
||
|
p += sizeof(szOut)-1;
|
||
|
} else {
|
||
|
//
|
||
|
// Uninterresting [keyword]. Skip it.
|
||
|
//
|
||
|
while (*p != ']') {
|
||
|
p++;
|
||
|
}
|
||
|
p++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// pchLineStart points at the first non-space in the line, so the
|
||
|
// whole line will be printed.
|
||
|
//
|
||
|
PrintLine:
|
||
|
fprintf(fpOut, "%s", pchLineStart);
|
||
|
}
|
||
|
fclose(fpOut);
|
||
|
fclose(fpIn);
|
||
|
return 0;
|
||
|
}
|