--- a
+++ b/src/_op_transform.cc
@@ -0,0 +1,97 @@
+/* -*- coding: utf-8 -*- */
+#define HELPTEXT "\
+Calling PROJ.4 library from GNU Octave"
+/******************************************************************************/
+/******************************************************************************/
+#include<octave/oct.h>
+#include<string>
+#include<cstdio>
+#include<cstdlib>
+#include"projwrap.h"
+/******************************************************************************/
+/******************************************************************************/
+#define ERRORTEXT 1000
+/******************************************************************************/
+/******************************************************************************/
+DEFUN_DLD(_op_transform,args,,HELPTEXT)
+{
+    //error message
+    char errorText[ERRORTEXT]="_op_geod2geoc:\n\t";
+    //output list
+    octave_value_list outputList;
+    ////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////
+    //checking input arguments
+    if(args.length()!=5)
+    {
+        //error text
+        sprintf(&errorText[strlen(errorText)],
+                "Incorrect number of input arguments\n\t"
+                "See help _op_transform");
+        //error message
+        error(errorText);
+    }
+    else
+    {
+        //loop index
+        size_t i=0;
+        //input coordinates from GNU Octave
+        ColumnVector xIn=args(0).column_vector_value();
+        ColumnVector yIn=args(1).column_vector_value();
+        ColumnVector zIn=args(2).column_vector_value();
+        //parameters strings
+        std::string paramsStart=args(3).string_value();
+        std::string paramsEnd=args(4).string_value();
+        //number of imput data
+        size_t nElem=static_cast<size_t>(xIn.rows());
+        size_t nElemZ=static_cast<size_t>(zIn.rows());
+        //output coordinates for GNU Octave
+        ColumnVector xOut(nElem);
+        ColumnVector yOut(nElem);
+        ColumnVector zOut(nElemZ);
+        //pointers to output data
+        double* x=NULL;
+        double* y=NULL;
+        double* z=NULL;
+        ////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////
+        //copy input data in working arrays
+        for(i=0;i<nElem;i++)
+        {
+            xOut(i) = xIn(i);
+            yOut(i) = yIn(i);
+            if(nElemZ)
+            {
+                zOut(i) = zIn(i);
+            }
+        }
+        //pointers to output data
+        x = const_cast<double*>(xOut.data());
+        y = const_cast<double*>(yOut.data());
+        if(nElemZ)
+        {
+            z = const_cast<double*>(zOut.data());
+        }
+        ////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////
+        //transformation
+        if(proj_transform(x,y,z,nElem,nElemZ,paramsStart.c_str(),
+                          paramsEnd.c_str(),&errorText[strlen(errorText)]))
+        {
+            //error message
+            error(errorText);
+            //exit
+            return outputList;
+        }
+        ////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////
+        //adding results to output list
+        outputList(0) = xOut;
+        outputList(1) = yOut;
+        outputList(2) = zOut;
+    }
+    ////////////////////////////////////////////////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////
+    //exit
+    return outputList;
+}