first commit (work in progress)
This commit is contained in:
112
.cproject
Normal file
112
.cproject
Normal file
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.Cygwin_PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978" name="Debug" parent="cdt.managedbuild.config.gnu.cygwin.exe.debug">
|
||||
<folderInfo id="cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978." name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.cygwin.exe.debug.1911704982" name="Cygwin GCC" superClass="cdt.managedbuild.toolchain.gnu.cygwin.exe.debug">
|
||||
<targetPlatform id="cdt.managedbuild.target.gnu.platform.cygwin.exe.debug.417099056" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.cygwin.exe.debug"/>
|
||||
<builder buildPath="${workspace_loc:/stubi}/Debug" id="cdt.managedbuild.target.gnu.builder.cygwin.exe.debug.1341361607" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.cygwin.exe.debug"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.assembler.cygwin.exe.debug.518707357" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.cygwin.exe.debug">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1228923598" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.archiver.cygwin.base.698019963" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.cygwin.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.cygwin.exe.debug.1903523299" name="Cygwin C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.cygwin.exe.debug">
|
||||
<option id="gnu.cpp.compiler.cygwin.exe.debug.option.optimization.level.1935693909" name="Optimization Level" superClass="gnu.cpp.compiler.cygwin.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
|
||||
<option id="gnu.cpp.compiler.cygwin.exe.debug.option.debugging.level.967738241" name="Debug Level" superClass="gnu.cpp.compiler.cygwin.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.compiler.cygwin.exe.debug.75372444" name="Cygwin C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.cygwin.exe.debug">
|
||||
<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.cygwin.exe.debug.option.optimization.level.1758127696" name="Optimization Level" superClass="gnu.c.compiler.cygwin.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.cygwin.exe.debug.option.debugging.level.196472971" name="Debug Level" superClass="gnu.c.compiler.cygwin.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.cygwin.1850965" superClass="cdt.managedbuild.tool.gnu.c.compiler.input.cygwin"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.debug.1913673353" name="Cygwin C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.debug">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.994259447" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.debug.794081126" name="Cygwin C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.debug"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
<cconfiguration id="cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233" moduleId="org.eclipse.cdt.core.settings" name="Release">
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.Cygwin_PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233" name="Release" parent="cdt.managedbuild.config.gnu.cygwin.exe.release">
|
||||
<folderInfo id="cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233." name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.cygwin.exe.release.213504424" name="Cygwin GCC" superClass="cdt.managedbuild.toolchain.gnu.cygwin.exe.release">
|
||||
<targetPlatform id="cdt.managedbuild.target.gnu.platform.cygwin.exe.release.1771726366" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.cygwin.exe.release"/>
|
||||
<builder buildPath="${workspace_loc:/stubi}/Release" id="cdt.managedbuild.target.gnu.builder.cygwin.exe.release.1401457693" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.cygwin.exe.release"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.assembler.cygwin.exe.release.414454857" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.cygwin.exe.release">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1199022435" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.archiver.cygwin.base.237095479" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.cygwin.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.cygwin.exe.release.1684919419" name="Cygwin C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.cygwin.exe.release">
|
||||
<option id="gnu.cpp.compiler.cygwin.exe.release.option.optimization.level.1663626866" name="Optimization Level" superClass="gnu.cpp.compiler.cygwin.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
|
||||
<option id="gnu.cpp.compiler.cygwin.exe.release.option.debugging.level.1650973862" name="Debug Level" superClass="gnu.cpp.compiler.cygwin.exe.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.compiler.cygwin.exe.release.1463094971" name="Cygwin C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.cygwin.exe.release">
|
||||
<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.cygwin.exe.release.option.optimization.level.1258615624" name="Optimization Level" superClass="gnu.c.compiler.cygwin.exe.release.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.cygwin.exe.release.option.debugging.level.929161689" name="Debug Level" superClass="gnu.c.compiler.cygwin.exe.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.cygwin.257656751" superClass="cdt.managedbuild.tool.gnu.c.compiler.input.cygwin"/>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.release.1085070010" name="Cygwin C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.release">
|
||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.746881963" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.release.656504450" name="Cygwin C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.release"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="stubi.cdt.managedbuild.target.gnu.cygwin.exe.207306528" name="Executable" projectType="cdt.managedbuild.target.gnu.cygwin.exe"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978;cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978.;cdt.managedbuild.tool.gnu.c.compiler.cygwin.exe.debug.75372444;cdt.managedbuild.tool.gnu.c.compiler.input.cygwin.1850965">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233;cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233.;cdt.managedbuild.tool.gnu.c.compiler.cygwin.exe.release.1463094971;cdt.managedbuild.tool.gnu.c.compiler.input.cygwin.257656751">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
</cproject>
|
26
.project
Normal file
26
.project
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>stubi</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
11
.settings/org.eclipse.cdt.core.prefs
Normal file
11
.settings/org.eclipse.cdt.core.prefs
Normal file
@@ -0,0 +1,11 @@
|
||||
eclipse.preferences.version=1
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978/CYGWIN_HOME/delimiter=;
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978/CYGWIN_HOME/operation=replace
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978/CYGWIN_HOME/value=C\:\\cygwin
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978/append=true
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.debug.384908978/appendContributed=true
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233/CYGWIN_HOME/delimiter=;
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233/CYGWIN_HOME/operation=replace
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233/CYGWIN_HOME/value=C\:\\cygwin
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233/append=true
|
||||
environment/project/cdt.managedbuild.config.gnu.cygwin.exe.release.1204024233/appendContributed=true
|
271
src/stubi.c
Normal file
271
src/stubi.c
Normal file
@@ -0,0 +1,271 @@
|
||||
/*!
|
||||
Name : stubi.c
|
||||
Author : Martin Winkler
|
||||
Version :
|
||||
Copyright :
|
||||
Description : Scan a folder for .c files and generate stubs from function definitions
|
||||
|
||||
@todo complete function dissection
|
||||
@todo output stub header and function
|
||||
@attention Using regular expressions to scan c files for function definitions. No 100%
|
||||
success rate and should be seen as helper. Result must be reviewed manually.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dirent.h>
|
||||
#include <regex.h>
|
||||
#include <string.h>
|
||||
|
||||
#define STUBI_FUNCTION_REGEX "^[ \\t]*([ _\\*[:alnum:]]*) ([_\\*[:alnum:]]*)[ \\t]*\\(([^\\)]*)"
|
||||
#define STUBI_FUNCTION_MULTI "[ \\t]*(.*)"
|
||||
#define STUBI_FUNCTION_MULTI_END "[ \\t]*(.*)\\)[ \\t\\{;]*"
|
||||
|
||||
static int one(const struct dirent *unused)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static char *gnu_basename(char *path)
|
||||
{
|
||||
char *base = strrchr(path, '/');
|
||||
return base ? base + 1 : path;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Process a string (e.g. from getline()) if it is a single or multiple line function definition
|
||||
* @todo closing parenthesis within parameter list will break the detection
|
||||
* @retval -1 Invalid regula expressions
|
||||
* @retval -2 Given String not a function
|
||||
* @retval 0 function evaluated
|
||||
*/
|
||||
static int matchFunction(char *aLine)
|
||||
{
|
||||
const size_t maxGroup = 10;
|
||||
regmatch_t matchGroup[maxGroup];
|
||||
const char *pattern =
|
||||
STUBI_FUNCTION_REGEX;
|
||||
const char *patternend =
|
||||
STUBI_FUNCTION_REGEX "\\)";
|
||||
regex_t regX;
|
||||
regex_t regXEnd;
|
||||
regex_t regXMulti;
|
||||
regex_t regXMultiEnd;
|
||||
uint8_t i = 0;
|
||||
char funPrefix[256] =
|
||||
{ 0 };
|
||||
static uint8_t multiParamFlag = 0;
|
||||
uint8_t multiParamEndFlag = 0;
|
||||
|
||||
if (0 > regcomp(®X, pattern, REG_EXTENDED | REG_NEWLINE))
|
||||
{
|
||||
perror("Error regex\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (0 > regcomp(®XEnd, patternend, REG_EXTENDED | REG_NEWLINE))
|
||||
{
|
||||
perror("Error regexend\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (0 > regcomp(®XMulti, STUBI_FUNCTION_MULTI, REG_EXTENDED | REG_NEWLINE))
|
||||
{
|
||||
perror("Error regXMulti\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (0 > regcomp(®XMultiEnd, STUBI_FUNCTION_MULTI_END, REG_EXTENDED | REG_NEWLINE))
|
||||
{
|
||||
perror("Error regXMultiEnd\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (multiParamFlag)
|
||||
{
|
||||
if (0 == regexec(®XMultiEnd, aLine, maxGroup, matchGroup, 0))
|
||||
{
|
||||
// end of multi line function
|
||||
++multiParamFlag;
|
||||
multiParamEndFlag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// continuation of multi line function
|
||||
(void) regexec(®XMulti, aLine, maxGroup, matchGroup, 0);
|
||||
++multiParamFlag;
|
||||
}
|
||||
}
|
||||
else if (0 == regexec(®XEnd, aLine, maxGroup, matchGroup, 0))
|
||||
{
|
||||
// single line function
|
||||
multiParamFlag = 0;
|
||||
}
|
||||
else if (0 == regexec(®X, aLine, maxGroup, matchGroup, 0))
|
||||
{
|
||||
// start of multi line function
|
||||
++multiParamFlag;
|
||||
printf("[ mls][%d]:", multiParamFlag);
|
||||
}
|
||||
else
|
||||
{
|
||||
// no fit
|
||||
return -2;
|
||||
}
|
||||
|
||||
switch (multiParamFlag)
|
||||
{
|
||||
case 0: // single line function definition
|
||||
case 1: // first line of multi line function definition
|
||||
{
|
||||
(void) strlcpy(funPrefix, &aLine[matchGroup[1].rm_so], (size_t) (matchGroup[1].rm_eo - matchGroup[1].rm_so) + 1);
|
||||
|
||||
if ( //
|
||||
NULL == strstr(funPrefix, "extern") //
|
||||
&& NULL == strstr(funPrefix, "EXTERN") //
|
||||
&& NULL == strstr(funPrefix, "static") //
|
||||
&& NULL == strstr(funPrefix, "STATIC") //
|
||||
&& matchGroup[2].rm_so < matchGroup[2].rm_eo)
|
||||
{
|
||||
printf("[ sl ]:%s", funPrefix);
|
||||
for (i = 2; i < maxGroup && 0 <= matchGroup[i].rm_so; ++i)
|
||||
{
|
||||
printf(" (%.3ld - %.3ld): ", matchGroup[i].rm_so, matchGroup[i].rm_eo);
|
||||
printf("%.*s", (int) (matchGroup[i].rm_eo - matchGroup[i].rm_so), &aLine[matchGroup[i].rm_so]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
// TODO special handling for static functions (as extern in stub header)
|
||||
else if (NULL != strstr(funPrefix, "static") || NULL != strstr(funPrefix, "STATIC"))
|
||||
{
|
||||
printf("[todo] %s %.*s\n", funPrefix, (int) (matchGroup[2].rm_eo - matchGroup[2].rm_so), &aLine[matchGroup[2].rm_so]);
|
||||
}
|
||||
// ignore functions declared as extern
|
||||
else if (NULL != strstr(funPrefix, "extern") || NULL != strstr(funPrefix, "EXTERN"))
|
||||
{
|
||||
printf("[ nu ] %s %.*s\n", funPrefix, (int) (matchGroup[2].rm_eo - matchGroup[2].rm_so), &aLine[matchGroup[2].rm_so]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: // further lines
|
||||
{
|
||||
if (multiParamEndFlag)
|
||||
{
|
||||
printf("[ mle][%d]:", multiParamFlag);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("[ ml ][%d]:", multiParamFlag);
|
||||
}
|
||||
|
||||
if (matchGroup[1].rm_so < matchGroup[1].rm_eo)
|
||||
{
|
||||
for (i = 1; i < maxGroup && 0 <= matchGroup[i].rm_so; ++i)
|
||||
{
|
||||
printf("(%.3ld-%.3ld):", matchGroup[i].rm_so, matchGroup[i].rm_eo);
|
||||
printf("%.*s", (int) (matchGroup[i].rm_eo - matchGroup[i].rm_so), &aLine[matchGroup[i].rm_so]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (multiParamEndFlag)
|
||||
{
|
||||
multiParamFlag = 0;
|
||||
multiParamEndFlag = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Opens given file for line by line function matching
|
||||
* @param *path file path
|
||||
* @retval 0 matching complete
|
||||
* @retval -1 error opening file
|
||||
*/
|
||||
static int scanFile(char *path)
|
||||
{
|
||||
FILE *fdesc;
|
||||
ssize_t charRead = 0;
|
||||
size_t lineSize = 0;
|
||||
char *fileLine = NULL; // will be allocated by getline(); must be freed
|
||||
|
||||
fdesc = fopen(path, "r");
|
||||
if (NULL == fdesc)
|
||||
{
|
||||
perror("Error open file");
|
||||
return -1;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
charRead = getline(&fileLine, &lineSize, fdesc);
|
||||
if (0 <= charRead)
|
||||
{
|
||||
(void) matchFunction(fileLine);
|
||||
}
|
||||
} while (0 <= charRead);
|
||||
|
||||
free(fileLine);
|
||||
(void) fclose(fdesc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Scan given folder for .c files
|
||||
* @param argc amount of command line arguments
|
||||
* @param **argv array of argments separated by spaces
|
||||
* @retval -1 Directory not found or regex compilation error
|
||||
* @retval 0 Direcotry scanned successfully
|
||||
* @details
|
||||
* see printf for usage
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct dirent **eps;
|
||||
int n;
|
||||
regex_t regX;
|
||||
char filePath[256] =
|
||||
{ 0 };
|
||||
const char *pattern = "^.*\\.[cC]";
|
||||
|
||||
printf("%s %s\n\n", argv[1], argv[2]);
|
||||
|
||||
if (3 != argc)
|
||||
{
|
||||
printf("Usage:\n");
|
||||
printf(" %s <Source Dir> <Target Dir>\n", gnu_basename(argv[0]));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (regcomp(®X, pattern, REG_NEWLINE))
|
||||
{
|
||||
fprintf(stderr, "bad pattern: '%s'\n", pattern);
|
||||
return -1;
|
||||
}
|
||||
|
||||
n = scandir(argv[1], &eps, one, alphasort);
|
||||
if (n >= 0)
|
||||
{
|
||||
int cnt;
|
||||
for (cnt = 0; cnt < n; ++cnt)
|
||||
{
|
||||
if (0 == regexec(®X, eps[cnt]->d_name, 0, NULL, 0) //
|
||||
&& DT_REG == eps[cnt]->d_type)
|
||||
{
|
||||
sprintf(filePath, "%s/%s", argv[1], eps[cnt]->d_name);
|
||||
printf("%s (%d)\n", filePath, eps[cnt]->d_type);
|
||||
scanFile(filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
perror("Couldn't open the directory");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user