Re: Compiling Pro*C Programs on AIX

From: Cedric Dandoy <cdandoy_at_be.oracle.com>
Date: Thu, 04 Feb 1999 17:47:33 +0100
Message-ID: <36B9CF24.73EBBB1B_at_be.oracle.com>


J.,

The reason is that most compilers default the char type to be signed (which is not specified in K&R).
The Pro*C expands your VARCHAR to a structure containing an unsigned char. Ex:

    VARCHAR username[20];
expands to

    struct { unsigned short len; unsigned char arr[20]; } username; and the strcpy is defined to take [signed] char* parameters. As there is no guarantee that the .arr part of the VARCHAR is null terminated, it is a good thing
to have a warning in that case.

I have my own include file to replace strcpy(), strncpy(), strcmp(), strncmp() from a VARCHAR to a char* and vice-versa.

-Cedric

#include <string.h>
#ifndef min
# define min(a,b) ((a)<(b)?(a):(b))
#endif

#define VVSTRCPY(d_v, s_s) {d_v.len=min(sizeof(d_v.arr), s_s.len);memcpy(d_v.arr, s_s.arr, d_v.len);}
#define VVSTRNCPY(d_v, s_s, n) {d_v.len=min(n, min(sizeof(d_v.arr), s_s.len));memcpy(d_v.arr, s_s.arr, d_v.len);} #define VVSTRCMP(s1_v, s2_v) memcmp(s1_v.arr,s2_v.arr,min(s1_v.len,s2_v.len)) #define VVSTRNCMP(s1_v, s2_v, n) memcmp(s1_v.arr, s2_v.arr, min(n, min(s1_v.len, s2_v.len)))

#define SVSTRCPY(d_s, s_v) ((char*)memcpy(d_s, s_v.arr, s_v.len),d_s[s_v.len] = '\0')
#define SVSTRNCPY(d_s, s_v, n) ((char*)memcpy(d_s, s_v.arr, min(s_v.len,n)),d_s[min(s_v.len,n)] = '\0') #define SVSTRCMP(s1_s, s2_v) memcmp(s1_s,s2_v.arr,min(strlen(s1_s), s2_v.len)) #define SVSTRNCMP(s1_s, s2_v, n) memcmp(s1_s, s2_v.arr, min(strlen(s1_s), min(n, s2_v.len)))

#define VSSTRCPY(d_v, s_s) memcpy(d_v.arr, s_s, d_v.len = min(sizeof(d_v.arr), strlen(s_s)))
#define VSSTRNCPY(d_v, s_s, n) strncpy((char*)d_v.arr, s_s, d_v.len=min(n, sizeof(d_v.arr)))
#define VSSTRCMP(s1_v, s2_s) strncmp((char*)s1_v.arr,s2_s,s1_v.len) #define VSSTRNCMP(s1_v, s2_s, n) strncmp((char*)s1_v.arr, s2_s, min(n, s1_v.len))

#define SLSTRCPY(d_s, s_v) {d_s=(char *)calloc(1, s_v.len+1);((char*)memcpy(d_s, s_v.arr, s_v.len),d_s[s_v.len] = '\0');}

jagreiner_at_cssconsulting.com wrote:

> I am compiling pro*c programs and have run into some error messages that are
> not consistent. I can compile a small program (< 1000 lines), with no error.
> When I compile a large pro*c program (5000 + lines) I get errors on strcpy,
> strcat statements.
>
> error (E) Function argument assignment between types "char *" and "unsigned
> char *" is not allowed.
>
> This occurs on statements like
> strcpy(select1.arr, "Select *");
> strcat(select1.arr, "From table1");
> etc...
>
> What confuses, me is it works on smaller programs. Thanks in advance for any
> help. Please reply to jagreiner_at_cssconsulting.com
>
> -----------== Posted via Deja News, The Discussion Network ==----------
> http://www.dejanews.com/ Search, Read, Discuss, or Start Your Own
Received on Thu Feb 04 1999 - 17:47:33 CET

Original text of this message