[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: argz SMOB
From: |
Brian S McQueen |
Subject: |
Re: argz SMOB |
Date: |
Thu, 15 Jan 2004 10:43:03 -0800 (PST) |
Since scheme strings can contain the null character, I noticed there was
no need for an argz smob. I removed it by using scheme strings instead
and it works excellently. The C functions that produce argzs, are all
callable from scheme since the argz is defined by a pointer and a length,
just as are scheme strings. The C functions are wrapped in simple
functions which use the guile API, and the trailing null char in each argz
is dropped.
I am sure that nobody is particularly interested in argzs, but some
readers may be interested in a real life example of the guile API. Below
are some examples of how I gained access to some C function from guile.
If any of you veterans have any more constructive advice, I would be glad
to hear it, but don't ask me to get rid of the argz. They are here to
stay! Particularly, I wonder about the best way to produce a null
terminated C string from a scheme string. I used scm_must_malloc, memcpy,
memset. I expected a ready made guile call for this purpose, but
I did not find any.
A simple call to a function which is expecting an argz and returns
nothing:
static SCM printer_hostile_printer(SCM scm_out_buff) {
struct argz_holder out_buff;
SCM_ASSERT (SCM_STRINGP (scm_out_buff), scm_out_buff, SCM_ARG1,
"printer_hostile_printer");
out_buff.argz = SCM_STRING_CHARS(scm_out_buff);
out_buff.argz_len = SCM_STRING_LENGTH(scm_out_buff);
output_printer(&out_buff);
return SCM_UNDEFINED;
}
A call to a database query function which returns an argz full of query
results:
static SCM get_from_db(SCM scm_login) {
char *login_chrs;
int login_len;
char * login;
struct db_parm_holder login_parm = { 0 };
struct db_parm_holder argz_parm = { 0 };
SCM ret_val;
SCM_ASSERT (SCM_STRINGP (scm_login), scm_login, SCM_ARG1,
"get_from_db");
login_chrs = SCM_STRING_CHARS(scm_login);
login_len = SCM_STRING_LENGTH(scm_login);
login = (char *)scm_must_malloc(login_len + 1, "get_from_db");
memcpy(login, login_chrs, login_len);
memset(login + login_len, '\0', 1);
set_db_in_parm_str(&login_parm, "@login", USER_ID_LEN, login);
set_db_ret_parm_envz(&argz_parm, NULL);
db_query_va("get_from_db", &login_parm, &argz_parm, NULL);
//don't take the last null term on the argz
ret_val = scm_mem2string(argz_parm.data, argz_parm.data_len - 1);
free(argz_parm.data);
scm_must_free(login);
return ret_val;
}
- argz SMOB, Brian S McQueen, 2004/01/05
- Re: argz SMOB, Daniel Skarda, 2004/01/06
- Re: argz SMOB,
Brian S McQueen <=
- Re: argz SMOB, Paul Jarc, 2004/01/15
- null terminated strings (was: argz SMOB), Andreas Voegele, 2004/01/16
- Message not available
- Re: null terminated strings, Andreas Voegele, 2004/01/16
- Re: null terminated strings, Roland Orre, 2004/01/16
- Re: null terminated strings, Andreas Voegele, 2004/01/16
- Re: null terminated strings, Brian S McQueen, 2004/01/16
- Re: null terminated strings, Paul Jarc, 2004/01/16
- Re: null terminated strings, Tom Lord, 2004/01/16
- Re: null terminated strings, Paul Jarc, 2004/01/16
- Re: null terminated strings, Roland Orre, 2004/01/16