Friday, July 16, 2010

AUTOLOAD in C

Recently, I attended a Perl training on Advanced Perl
(actually, I attended just to kill time, and most of the
subject matter being covered there was known to me :) )
and when learning perl modules, I came across AUTOLOAD

In brief, AUTOLOAD is like a default in a module, when one
tries to invoke a function which is not implemented in the
module, perl calls the function with name AUTOLOAD
passing the function name.
Having AUTOLOAD gives rise to interesting uses - atleast in
Perl. One can handle multiple calls in AUTOLOAD giving the
impression that there are lot of functions defined in the
library - especially useful when method names are like
get_a() get_b() get_c() etc.

I was trying to implement this in C, and its pretty
straight forward. All we need is a dynamic library and a
a default handler - which we shall call catch_all()
The only difference here would be, the responsibility
to call catch_all() will be with the invoker of the lib
(maybe this can be hidden behind neat APIs)

Lets create a library with a function and a catch_all

/* sotest.c */
#include
#include

void name1 ()
{
printf ("\n SOTEST: called %s\n", __FUNCTION__);
}
/* this is our AUTOLOAD method, which takes 1 param - name */
void catch_all (char *name)
{
/* If someone tried to call method hello() in this module */
if (0 == strcmp(name, "hello")) {
printf ("\n SOTEST: called hello()\n");
} else
printf ("\n SOTEST: %s, %s()\n", __FUNCTION__, name);
}

make lib: gcc -c -fPIC sotest.c; gcc -shared -fPIC -o libsotest.so sotest.o

Now for the invoker:

/* callso.c */
#include
#include

int main (int argc, char *argv[])
{
void *handle, (*fp)() = NULL, (*gfp)() = NULL;
char *fname = NULL;

if (argc <>\n", argv[0]);
exit (1);
}
fname = argv[1]; /* The function to be invoked in the lib */

handle = dlopen("./libsotest.so", RTLD_LOCAL | RTLD_LAZY);

fp = dlsym(handle, fname);
if (fp) {
fp(); /* If the named function exists, invoke it */
} else {
gfp = dlsym(handle, "catch_all");
gfp ? gfp(fname): 0; /* call the default handler if not */
}

return 0;
}

compile: gcc -L. callso.c -lsotest -ldl # Assume current dir, set LD_LIBRARY_PATH

Simple !. isn't it ? :)

Thursday, May 25, 2006

[Regex] Mastering ...

Hi all,

I purchased this book "Mastering Regular Expressions", 2nd Ed, by Jeffrey Friedl.
This book treats regex as a language on its own, and explains all the intricacies of crafting a regex, advanced syntaxes, regexes in various languages etc.
After 3-4 chapters, uhf... it's really heavy reading!, since I have lot of work nowadays, just managing to read a page/two per week!

--
Ani

Friday, May 12, 2006

[General - programming] Language features with dual behavior

Hi all,

Recently while writing some Python ane Perl code, I noticed that the features provided by the language are useful in dual roles. Perl is anyway famous for TIMTOWTDI.

Consider comments - multiline comments.

There is no dedicated multiline comment character-sequence in Perl/Python, but the common(and probably official way) is

In Perl:

Use the perl module documentation(pod) lines
E.g.
=head
... some code ...
=cut

In Python:

Use the triple-quote string
E.g.
"""
... code...
"""

Even though C/C++ provides the /* ... */ sequence, they cannot nest, so generally the
preprocessor is used to get rid of huge lines of code with

#if 0
...code...
#endif


Interesting....

[update-2/6/10]
After a short sprint with Lua, I found even Lua has a multiline string ([[ ... ]]) , similar to the triple-quote strings of Python, which can be turned into a comment with a leading --:

--[[
A multi
line

comment
]]

[update: 21-May-2015]
In bash, the null command can be used for multi-line comments!

: ' some
long boring
stuff
'

--
Ani

Monday, April 24, 2006

Tracing in linux

#include
#include

Sunday, April 23, 2006

Friday, April 21, 2006

AJAX

Hi Guys,
I hope most of you have heard about AJAX. Its the new buzzword

Here are some useful Links:
http://adaptivepath.com/publications/essays/archives/000385.php
http://www-128.ibm.com/developerworks/web/library/wa-ajaxintro2/#resources

We recently ajaxed a blog tool and these resources were very useful.

Those who want to try out AJAX , this would be good place to start.

[Only me?] It looks like ...

... I am the only one who is posting!
Are all of u busy or lost interest in Blogging already??

Atleast I know the status of a few who are geographically close to me:
Some are lost in TRANSLATIONs and some are lost in a DATABASE of ACTIVE items! ;)

Hmm...
I dont know Reddy's status, Ratish is very busy

--
Ani

[Book] Advance Linux Programming

Hi all,

ALP is a well known book in the Linux world, as of now I've completed 3/4 of the book, and I did not get bored at any point. It's really interesting, and highlights on so many concepts that I faintly remember reading from Advanced programming in Unix env by stevens and many unknown.

--
Ani

Tuesday, April 18, 2006

[General - Inspiring] The mastermind behind the product we work on

Here is a link which describes the founder of Winphoria (Now the Core Networks Division of Motorola) - Murali

http://www.norwestvc.com/portfolio/p_aravamudan.aspx

He has 17 patents and 25 pending!


--
Ani

Tuesday, April 11, 2006

SQL 99 - CASE

SQL 99 supports
CASE statement within SELECT

like

SELECT col_a, col_b
CASE col_c
WHEN col_c = 1 THEN 'ONE'
WHEN col_c = 2 THEN 'TWO'
ELSE 'OTHER'
END
FROM tbl;

Probably this does an outer join and a Union, not sure, but this is handy and much easier to use than JOINs.

If any of u know the internals of this , u'r welcome to describe it here.

--
Ani