Skip to main content

If your C/C++ project depends on some external C/C++ projects and you want to make some changes in external functions/methods and you would like to copy/paste these changes automatically then this package may help you.

Project description

cppguts

If your C/C++ project depends on some external C/C++ projects and you want to make some changes in external functions/methods and you would like to copy/paste these changes automatically then this package may help you.

There are two tools:

  1. editcpp used to edit source code;
  2. dumpcpp used to print some information about C/C++ translation units

We will discuss editcpp as it is the objective tool.

editcpp doesn't work with templates.

The idea behind editcpp tool

editcpp uses libclang to find function/method definition start/end lines in text file (.c, .h, .hpp, .cpp or whatever extension you use for your C/C++ project). libclang parses each dest.cpp and src.cpp and everything that is included by #include preprocessor directives. Then editcpp tool selects all functions and methods defined in dest.cpp and src.cpp (it skips any function/method defined in other file) and tries to find matching functions/methods. After that editcpp copies function/method definition from src.cpp and paste it to the dest.cpp while deleting old funcion/method definition.

To find common function editcpp checks:

  • are they both definitions?
  • are they both const?
  • are they both static?
  • are they both vitual?
  • are they both functions?
  • are they both methods?
  • do they both have the same name?
  • do they both have the same return type and arg types?
  • do they both have the same semantic parent (classname)? (for methods only)

If your new function/method definition uses external types then these types must be preliminary declared (not necessary to define them).

Remember that after editcpp finds common functions/methods it will simply copy selected text lines from one file to another.

Example

original function/method definition file dest.h:

#include <iostream>

// helper class that is used by the target class `Src`
class SrcPrivate {
public:
 SrcPrivate(){};

 void add(int v){
   val += v;
 }

 void substract(int v){
   val -= v;
 }

private:
 int val;
}

// target class
class Src {
 // method defined inside the class
 void add(SrcPrivate p, int v){
   p.add(v);
 }

// method defined outside the class
 void substract(SrcPrivate p, int v);

// we won't tuch this method
 void untouched_print(int v){
   std::cout << "The value is:\t" << v << std::endl;
 }
}

void Src::substract(SrcPrivate p, int v){
 p.substract(v);
}

// simple function
void foo(int &v){
 v--;
}

namespace ns {
 // function in namespace
 void bar(int &v){
   v++;
 }
}

new function/method definition file src.h:

class SrcPrivate;   // declare helper type

// target class
class Src {
  // NEW method definition inside class
  void add(SrcPrivate p, int v){

    p.add(v) + 10;

  }

  // NEW method definition ouside class
  void substract(SrcPrivate p, int v);
}

void Src::substract(SrcPrivate p, int v){
  p.substract(v) - 10;
}

// NEW simple function definition 
void foo(int &v){
  v -= 10;
}

// NEW function definition in namespace
namespace ns {
  void bar(int &v){
    v += 10;
  }
}

Run:

editcpp --src-file=src.h --dest-file=dest.h --oldfile-keep -std=c++03

The -std=c++03 tells the clang to parse the files as C++. Also you may need to use any other clang flags like -I to include directories that are required by the files.

--oldfile-keep is used to keep the original file (it will be renamed by adding _OLD_N suffix). Otherwise use --oldfile-delete to delete the original file.

Another option is to run the test:

python -m unittest cppguts.tests.test_cppguts

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cppguts-0.1.1.tar.gz (8.5 kB view details)

Uploaded Source

File details

Details for the file cppguts-0.1.1.tar.gz.

File metadata

  • Download URL: cppguts-0.1.1.tar.gz
  • Upload date:
  • Size: 8.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.6.7

File hashes

Hashes for cppguts-0.1.1.tar.gz
Algorithm Hash digest
SHA256 176bcc15fe8139e263b24fbcb17ac42cc9e44a3ac1e81a7063058d489f66ae85
MD5 00facc32b02cd29c9377c51d57cd40ea
BLAKE2b-256 a7e516f2668313242a45294bbfc487be0528b9d3cb9f0d2b16d52258093a0c1e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page