ARSperl
view release on metacpan or search on metacpan
supportrev.c view on Meta::CPAN
char *c, unsigned int *o);
static int
rev_ARAssignStruct_helper(ARControlStruct * ctrl,
HV * h, ARAssignStruct * m);
static int
rev_ARActiveLinkMacroStruct_helper(ARControlStruct * ctrl, HV * h,
ARActiveLinkMacroStruct * m);
static int
rev_ARAssignList_helper(ARControlStruct * ctrl,
HV * h, ARFieldAssignList * m, int i);
#if AR_EXPORT_VERSION >= 3
static int
#if AR_CURRENT_API_VERSION >= 14
rev_ARByteListStr2Type(ARControlStruct * ctrl,
char *ts, ARULong32 *tv);
#else
rev_ARByteListStr2Type(ARControlStruct * ctrl,
char *ts, unsigned long *tv);
#endif
static int
rev_ARCoordList_helper(ARControlStruct * ctrl,
HV * h, ARCoordList * m, int idx);
static int
rev_ARPropList_helper(ARControlStruct * ctrl,
HV * h, ARPropList * m, int idx);
#endif
/* ROUTINE
* revTypeName(TypeMapStruct *tms, char *type)
*
* DESCRIPTION
* given a typemapstruct and a string, return the
* enumeration value if string exists in struct.
*
* RETURNS
* >=0 on success
* TYPEMAP_LAST on failure
*/
unsigned int
revTypeName(TypeMapStruct *t, char *type)
{
if(type && *type && t) {
int i = 0;
while((t[i].number != TYPEMAP_LAST) && strcmp(t[i].name, type))
i++;
return t[i].number;
}
return TYPEMAP_LAST;
}
/* ROUTINE
* strcpyHVal(hash, key, buffer, bufferLen - 1)
*
* DESCRIPTION
* given a hash (HV *), a key, a pre-allocated buffer and
* the length of that buffer, retrieve the value from the hash
* (assuming it is a string value [PV]) and place it in the buffer.
*
* NOTES
* The value of hash is truncate at len bytes if it exceeds len.
* buffer, once filled in, will be null terminated. Thus the
* bufferLen should be the real length minus 1, because the
* address at buffer[bufferLen] is set to zero all the time.
*
* RETURNS
* 0 on success
* -1 on failure and pushes some info in the error hash
* -2 on warning and pushes some info into the error hash
*
*/
int
strcpyHVal(HV * h, char *k, char *b, int len)
{
SV **val;
if (!b) {
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"strcpyHVal: char buffer parameter is NULL");
return -1;
}
if (!h) {
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"strcpyHVal: hash parameter is NULL");
return -1;
}
if (SvTYPE((SV *) h) == SVt_PVHV) {
if (hv_exists(h, k, strlen(k) )) {
val = hv_fetch(h, k, strlen(k) , 0);
if (val && *val) {
if (SvPOK(*val)) {
strncpy(b, SvPV(*val, PL_na), len);
b[len] = 0;
return 0;
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"strcpyHVal: hash value is not a string");
} else {
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"strcpyHVal: hv_fetch returned null. key:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
k ? k : "[key null]");
return -2;
}
} else {
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"strcpyHVal: key doesn't exist. key specified in next message:");
ARError_add(AR_RETURN_WARNING, AP_ERR_CONTINUE,
k ? k : "[key null]");
return -2;
}
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"strcpyHVal: first argument is not a hash");
return -1;
}
/* same as above routine, but it will allocate (malloc()) the appropriate
* amount of memory. calling routine is responsible for free()ing it later on
*/
int
supportrev.c view on Meta::CPAN
static int
rev_ARDisplayStruct_helper(ARControlStruct * ctrl, HV * h, char *k, ARDisplayStruct * d)
{
SV **val;
if (!d) {
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARDisplayStruct_helper: DisplayList param is NULL");
return -1;
}
if (SvTYPE((SV *) h) == SVt_PVHV) {
if (hv_exists(h, k, strlen(k) )) {
val = hv_fetch(h, k, strlen(k) , 0);
if (val && *val) {
/* hash value should be an hash reference */
if (SvTYPE(SvRV(*val)) == SVt_PVHV) {
if (rev_ARDisplayStruct(ctrl, (HV *) SvRV(*val), d) != 0)
return -1;
return 0;
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARDisplayStruct_helper: hash value is not an array reference");
} else {
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARDisplayStruct_helper: hv_fetch returned null");
return -2;
}
} else {
ARError_add(AR_RETURN_WARNING, AP_ERR_GENERAL,
"rev_ARDisplayStruct_helper: key doesn't exist");
return -2;
}
} else
ARError_add(AR_RETURN_ERROR, AP_ERR_GENERAL,
"rev_ARDisplayStruct_helper: first argument is not a hash");
return -1;
}
/* ROUTINE
* rev_ARDisplayStruct(hv, displayStruct)
*
* DESCRIPTION
* given a hash that contains displaystruct keys
* and an empty (preallocated) displaystruct, fill
* in the display struct.
*/
int
rev_ARDisplayStruct(ARControlStruct * ctrl, HV * h, ARDisplayStruct * d)
{
int rv = 0, rv2 = 0;
char buf[1024];
rv += strcpyHVal(h, "displayTag", d->displayTag, AR_MAX_NAME_SIZE);
rv += strcpyHVal(h, "label", d->label, AR_MAX_NAME_SIZE);
rv += intcpyHVal(h, "x", &(d->x));
rv += intcpyHVal(h, "y", &(d->y));
rv += uintcpyHVal(h, "length", &(d->length));
rv += uintcpyHVal(h, "numRows", &(d->numRows));
/* variables that need some decoding before we store them */
/*
* "option" will be either "VISIBLE" or "HIDDEN" default: Visible
*/
if ((rv2 = strcpyHVal(h, "option", buf, sizeof(buf)-1)) == 0) {
if (strncasecmp(buf, "HIDDEN", sizeof(buf)) == 0)
d->option = AR_DISPLAY_OPT_HIDDEN;
else
d->option = AR_DISPLAY_OPT_VISIBLE;
} else
rv += rv2;
/*
* "labelLocation" will be either "Left" or "Top" default: Left
*/
if ((rv2 = strcpyHVal(h, "labelLocation", buf, sizeof(buf)-1)) == 0) {
if (strncasecmp(buf, "Top", sizeof(buf)) == 0)
d->labelLocation = AR_DISPLAY_LABEL_TOP;
else
d->labelLocation = AR_DISPLAY_LABEL_LEFT;
} else
rv += rv2;
/*
* "type" will be one of: NONE, TEXT, NUMTEXT, CHECKBOX, CHOICE,
* BUTTON default: NONE
*/
if ((rv2 = strcpyHVal(h, "type", buf, sizeof(buf)-1)) == 0) {
if (strncasecmp(buf, "TEXT", sizeof(buf)) == 0)
d->type = AR_DISPLAY_TYPE_TEXT;
else if (strncasecmp(buf, "NUMTEXT", sizeof(buf)) == 0)
d->type = AR_DISPLAY_TYPE_NUMTEXT;
else if (strncasecmp(buf, "CHECKBOX", sizeof(buf)) == 0)
d->type = AR_DISPLAY_TYPE_CHECKBOX;
else if (strncasecmp(buf, "CHOICE", sizeof(buf)) == 0)
d->type = AR_DISPLAY_TYPE_CHOICE;
else if (strncasecmp(buf, "BUTTON", sizeof(buf)) == 0)
d->type = AR_DISPLAY_TYPE_BUTTON;
else
d->type = AR_DISPLAY_TYPE_NONE;
} else
rv += rv2;
return rv;
}
/* ROUTINE
* rev_ARInternalIdList(hv, key, idliststruct)
*
* DESCRIPTION
* given a hash, a key and an empty idliststruct,
* pull out the hash value and populate the structure.
*
* RETURNS
( run in 0.572 second using v1.01-cache-2.11-cpan-f56aa216473 )