Re: Compiling Pro*C Programs on AIX
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