windows-nt/Source/XPSP1/NT/base/wow64/tools/idlclean/idlclean.c

140 lines
3.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//////////////////////////////////////////////////////////////////////////////
// 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;
}