Hi Guys,

Three things were fooling me:

1) I was calling this using a C function so I 'assumed' that it was  
converting to C strings

2) when I grab the string, if under 36 characters, it always seems to  
have a 0 termination at the end
        [ assembly might be right filling the string with this ]

3) I do not see the first values at the start of the string for length
   - I can handle this as a C string and have no garbage at the  
beginning and it terminates properly if < 36 chars

The way I am using this is:

        DIR_LIST_t *tFileList;
        
        GetFileType(tFileList->dl_dir.d_name);                  /* calling 
function */

        short GetFileType(char *FileName)
                {
                printf("FileName: [%s]\n", FileName);           /* this prints 
out the  
filename just fine if < 36 chars */

                }


Unless I am missing something, it seems that the C call (haven't had  
time to dig up the source file yet) does at last a partial conversion  
from the QDOS structure.  Whether it on purpose adds the termination  
for items < 36 chars or not, don't know.

With that said, going to take a break outside now that the rain has  
'stopped' for a bit (3 day weekend, last of summer = rain).

Cheers,
jim


On Sep 4, 2006, at 10:51 AM, Dave Walker wrote:

> James,
>
> The header is correct - it defines a memory structure in QDOS, not a
> structure designed for use with C.   As such the definition is  
> fixed and
> cannot be changed.   You will find that under QDOS all strings are  
> preceded
> by a 2-byte field that defines the length of the following string, and
> strings are not zero-terminated.   When programming in C one should  
> always
> therefore take account of this, and make sure that you use the length
> limiting variants of copies and moves as you cannot assume a zero
> termination to such strings.
>
> It can be advantageous to look at the .hdr versions of the header  
> files
> supplied on one of the source disks.    These include comments  
> which can
> make the files much easier to peruse.   You can also rename them  
> and put
> them in place of the supplied .h files which have been processed to  
> remove
> all comments and formatting to reduce their size for those using  
> floppy
> based systems.  Those using hard disk based systems are better off  
> using the
> commented versions
>
> Dave
> .
> ----- Original Message -----
> From: "James Hunkins" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Monday, September 04, 2006 3:18 PM
> Subject: [ql-users] bug in qlib_h C68 support file
>
>
>> Guys,
>>
>> I think that I found a bug in the qlib_h include file used by C68.
>> Here are the details:
>>
>> In the 'qdirect' structure, the member 'd_name' is defined as:
>> char d_name[36];
>>
>> This works as long as the directory/file name is 35 or fewer
>> characters and holds a properly terminated C string (terminates with
>> a '0').  However, if the total name length is actually 36 characters,
>> then there is no termination.  As far as I can tell the structure
>> does properly hold everything and isn't corrupt, just no termination
>> in that one case.
>>
>> This might explain why in a few problems with long file names, I see
>> handling problems but not in others (compiled in C68 versus assembly
>> or compiled SBASIC for example?).
>>
>> If I am correct this structure should define it as:
>>
>> char d_name[37];
>>
>> to allow room for the termination character of a C string.
>>
>> Jim
>>
>> _______________________________________________
>> QL-Users Mailing List
>> http://www.q-v-d.demon.co.uk/smsqe.htm
>
> _______________________________________________
> QL-Users Mailing List
> http://www.q-v-d.demon.co.uk/smsqe.htm

_______________________________________________
QL-Users Mailing List
http://www.q-v-d.demon.co.uk/smsqe.htm

Reply via email to