This site might be helpful to someone interesting in embedded programming:
+ http://www.embedded.com/books , including the books references
#!/bin/bash #Valentin Heinitz, www.heinitz-it.de, 2008-11-13 #Reader for MS Windows 3.1 Ini-files #Usage: inireader.sh # e.g.: inireader.sh win.ini ERRORS DISABLE # would return value "no" from the section of win.ini #[ERRORS] #DISABLE=no INIFILE=$1 SECTION=$2 ITEM=$3 cat $INIFILE | sed -n /^\[$SECTION\]/,/^\[.*\]/p | grep "^[:space:]*$ITEM[:space:]*=" | sed s/.*=[:space:]*//
I got it from here.
Linux bash shell provides 2 types of test:
+ ( -ot ) : is other than
+ ( -nt ) : is newer than
#!/bin/sh
if [ "$file1" -nt "$file2" ]
then
echo -e "$file1 is newer than $file2"
else
echo -e "$file1 is older than $file2"
fi
I write this bash script to automate the process of creating Linux libraries in C/C++
#!/bin/bash clear echo -e "##########################################" echo -e "# LIBRARY AUTO-CREATOR by [JaPh] #" echo -e "#========================================#" echo -e "Usage: `basename $0` lib_name type path " echo -e "Example: " echo -e " + creating libraries from hello.c in current directory" echo -e " `basename $0` hello C . " echo -e " + creating libraries from bye.cpp to '/opt/lib' directory" echo -e " `basename $0` bye C++ /opt/lib" echo -e "Feel free to contact, pete.houston.17187@gmail.com\n" ARG=3 if [ "$#" -ne "$ARG" ] then echo -e "[?] wrong input arguments!" exit fi libname=lib"$1" if [ "$2" == "C" ] then filename="$1.c" compiler="gcc" elif [ "$2" == "C++" ] then filename="$1.cpp" compiler="g++" else echo -e "[?] unknown filetype" exit fi echo -e "< Static Library: $libname.a >" command="$compiler -Wall -c $filename" echo -e "\$ $command" if [ !`$command` ] then echo -e ".created: $1.o" else echo -e ".[?] cannot create object $1.o" exit fi echo -e "\$ ar -cvq $libname.a $1.o" ar -cvq $libname.a $1.o echo -e ".created: $libname.a" echo -e "< Static Library '$libname.a' created ! >" rm -f $1.o echo -e "< Shared Object Library: $libname.so.1.0 >" command="$compiler -Wall -fPIC -c $1.c" echo -e "\$ $command" if [ !`$command` ] then echo -e ".created: $1.o" else echo -e ".[?] cannot create object $1.o" exit fi command="$compiler -shared -Wl,-soname,$libname.so.1 -o $libname.so.1.0 $1.o" echo -e "\$ $command" if [ !`$command` ] then echo -e ".created: $libname.so.1.0" else echo -e ".[?] cannot create shared object $libname.so.1.0" exit fi ln -sf $libname.so.1.0 $libname.so ln -sf $libname.so.1.0 $libname.so.1 echo -e "< Shared Object Library '$libname.so.1.0' created ! >" if [ "$3" != "." ] then mv $libname.* "$3" echo -e "[!] All files moved to $3" fi
STATIC LIBRARY (.a)
+ Compile
$ gcc -Wall -c *.c+ Create library
$ ar -cvq libtest *.o+ List files in library
$ ar -t libtest.a+ Linking with library
$ gcc -o executable-name prog.c libtest.a $ gcc -o executable-name prog.c -L/path/to/library-dir -ltest
Shared Object: DYNAMICALLY LINKED LIBRARY
+ Compile object
$ gcc -Wall -fPIC -c *.c+ Create shared object
$ gcc -shared -Wl,-soname,libtest.so.1 -o libtest.so.1.0 -o *.o+ Move library to destination
$ mv libtest.so.1.0 /path/to/lib-dir+ Allow naming convention like -ltest
$ ln -sf /path/to/lib-dir/libtest.so.1.0 /path/to/lib-dir/libtest.so+ Allow run-time binding to work
$ ln -sf /path/to/lib-dir/libtest.so.1.0 /path/to/lib-dir/libtest.so.1+ Testing executable file dependencies
$ ldd executable-file
Reference: Yo-Linux
Original Discussion -> [Cviet]
Code Relax #3 [ by rox_rook ]
- Write a class that allows operator overloading as long as possible and no syntax error.
Example, the following expression must be evaluated:
+++++++++++++++++++++++++++++++x; // must be valid and evaluated- Language in use: C++
Solution [ by me ]
#include <iostream>
using namespace std;
template< typename X >
class MyOperator {
private:
X value;
public:
MyOperator( X _value = 0 ) : value(_value) { };
MyOperator& operator+() {
++value;
}
MyOperator& operator++() {
++value;
}
X getValue() const { return value; }
};
int main( )
{
MyOperator<int> x(7);
++++++++++++++++++++++++++++++++++x;
cout << x.getValue() << endl;
MyOperator<double> j(1.4);
+++++++++++++++j;
cout << j.getValue() << endl;
return 0;
}
Evaluation
- The keyword 'operator' in C++ can be use to make cool things. I just found out about this 'til today testing it.
Original Discussion: -> [Cviet]
Code Relax #2 [ by rox_rook ]
Given a template to get sum below
template< typename T >
inline
T calculate_sum_of_element( const T* i, const T* e )
{
T sum = T( ); // a zero value for any type
while( i != e )
{
sum += *i;
++i;
}
return sum;
}
Try this on int and char array
#include <iostream>
using namespace std;
template< typename T >
inline
T calculate_sum_of_element( const T* i, const T* e )
{
T sum = T( ); // a zero value for any type
while( i != e )
{
sum += *i;
++i;
}
return sum;
}
int main( )
{
int int_ary[ 3 ] = { 1, 2, 3 };
cout << calculate_sum_of_element( int_ary, int_ary + 3 ) << endl;
char char_ary[ 3 ] = { 'a', 'b', 'c' };
cout << calculate_sum_of_element( char_ary, char_ary + 3 ) << endl;
return 0;
}
The result for int is 6 as expected; however, for char it supposed to be 97 + 98 + 99 = 294, but the character '&' is printed out.
Requirement
+ Re-write the given template function to make char data type return an int value
+ Language in use: C++
Solution [ by author, rox_rook ]
#include <iostream>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
template< typename T >
class Trait;
template< >
class Trait< char >
{
public :
typedef int SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< short >
{
public :
typedef short SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< unsigned >
{
public :
typedef unsigned SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< double >
{
public :
typedef double SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< int >
{
public :
typedef int SumType;
static SumType zero( )
{
return 0;
}
};
template< typename T >
inline
typename Trait< T >::SumType calculate_sum_of_element( const T* i, const T* e )
{
typedef typename Trait< T >::SumType SumType; // create shortcut, less typo
SumType sum = Trait< T >::zero( );
while( i != e )
{
sum += *i;
++i;
}
return sum;
}
int main( )
{
char char_ary[ 3 ] = { 'a', 'b', 'c' };
cout << calculate_sum_of_element( char_ary, char_ary + 3 ) << endl;
double d_ary[ 3 ] = { 1.1, 2.2 , 3.3 };
cout << calculate_sum_of_element( d_ary , d_ary + 3 ) << endl;
int i_ary[ 3 ] = { 1, 2 , 3 };
cout << calculate_sum_of_element( i_ary , i_ary + 3 ) << endl;
}
Evaluation
- It's freaking unthinking of....lol