Question about using File Selector

C and PASCAL (or any other high-level languages) in here please

Moderators: exxos, simonsunnyboy, Mug UK, Zorro 2, Moderator Team

User avatar
TheNameOfTheGame
Atari God
Atari God
Posts: 1049
Joined: Mon Jul 23, 2012 8:57 pm
Location: Almost Heaven, West Virginia

Question about using File Selector

Postby TheNameOfTheGame » Fri Oct 13, 2017 5:10 pm

I'm trying to get the return path from the file selector and add the filename to it so I can open the file.

I set up the path before calling the file selector, but when I return the path still has the wilcards at the end which I need to strip to replace with the filename.

Can someone give me an example of how to do this?

I was thinking of somehow using strrchr to get the last position with the '\' character and putting a NULL character there but I can't understand the syntax to do it.

Here is what I have so far.

Code: Select all

                        path[0] = Dgetdrv() + 65;
                        path[1] = ':';
                        Dgetpath( &path[2], 0 );
                        strcat( path, "\\*.*" );

                        /* TOS 1.04 and above */
                        result = fsel_exinput( path, name, &button, "Select file to open" );
                        if( result ) {
                           if( button == 1 ) {
                           
   **** Here is where I need to strip the wildcards/filetype specification off of path  ******
   
                              Dsetpath( &path[2] );
                              strcat( path, "\\" );
                              strcat( path, name );
                              printf("\n%s %s", path, name);
                           }
                           else {
                              form_alert( 1, "[1][Error - Not enough RAM?][OK]" );
                              exit_flag = 1;
                              break;   

User avatar
TheNameOfTheGame
Atari God
Atari God
Posts: 1049
Joined: Mon Jul 23, 2012 8:57 pm
Location: Almost Heaven, West Virginia

Re: Question about using File Selector

Postby TheNameOfTheGame » Fri Oct 13, 2017 5:51 pm

Think I got it...this seems to work:

Code: Select all

                              s = strrchr( path, '\\' );
                              strcpy( s, "\0");


where s is a char *

czietz
Hardware Guru
Hardware Guru
Posts: 478
Joined: Tue May 24, 2016 6:47 pm

Re: Question about using File Selector

Postby czietz » Fri Oct 13, 2017 5:54 pm

It's inefficient to use strcpy here, since all that you want to do is...

Code: Select all

*(strrchr(path,'\\')) = 0;

User avatar
jfl
Atari Super Hero
Atari Super Hero
Posts: 825
Joined: Tue Jul 18, 2006 10:55 pm
Location: Liège, Belgium
Contact:

Re: Question about using File Selector

Postby jfl » Fri Oct 13, 2017 6:10 pm

TheNameOfTheGame wrote:Think I got it...this seems to work:

Code: Select all

                              s = strrchr( path, '\\' );
                              strcpy( s, "\0");

where s is a char *

You can avoid the call to srtcpy with:

Code: Select all

*s = '\0';

And don't forget to check the return value of the strrchr call.
Jean-François
GEMDict – GEMClip

User avatar
TheNameOfTheGame
Atari God
Atari God
Posts: 1049
Joined: Mon Jul 23, 2012 8:57 pm
Location: Almost Heaven, West Virginia

Re: Question about using File Selector

Postby TheNameOfTheGame » Fri Oct 13, 2017 6:35 pm

czietz wrote:It's inefficient to use strcpy here, since all that you want to do is...

Code: Select all

*(strrchr(path,'\\')) = 0;


Yes, thank you that works well. But not for the case of root drive, since Dsetpath won't work then.
So I had to add a check with strchr in to the code:

Code: Select all

                              *(strrchr(path,'\\')) = 0;
                              if( strchr(path, '\\') == 0 ) {
                                 path[2] = '\\';
                                 path[3] = '\0';
                                 Dsetpath( &path[2] );
                                 strcat( path, name );
                              }
                              else {
                                 Dsetpath( &path[2] );
                                 strcat( path, "\\" );
                                 strcat( path, name );
                              }



jfl wrote:And don't forget to check the return value of the strrchr call.


Could you explain why? In case the user mangles the path specification and leaves out any '\'s'?

*edit* yeesh, the user can edit the directory line and totally screw up the path and the file selector still returns with button 1 and a mangled path string. 8O

User avatar
TheNameOfTheGame
Atari God
Atari God
Posts: 1049
Joined: Mon Jul 23, 2012 8:57 pm
Location: Almost Heaven, West Virginia

Re: Question about using File Selector

Postby TheNameOfTheGame » Fri Oct 13, 2017 7:26 pm

Went with jfl's code so I could check the return value of strrchar in case the directory path has no '\' in it and avoid a bus error.

Code: Select all

                              s = strrchr( path, '\\' );
                              if( s != NULL ) {
                                 *s = '\0';
                                 if( strchr(path, '\\') == NULL ) {
                                    path[2] = '\\';
                                    path[3] = '\0';
                                    Dsetpath( &path[2] );
                                    strcat( path, name );
                                 }
                                 else {
                                    Dsetpath( &path[2] );
                                    strcat( path, "\\" );
                                    strcat( path, name );
                                 }
                              }
                              else
                                 form_alert( 1, "[1][File path error][OK]" );



*Edit* Looks like Dsetpath has validation built-in so if the path is mangled it won't set it. That'll work and then obviously the Fopen will fail and I can catch that.

I think this will do. Does anyone see any other problems?

User avatar
TheNameOfTheGame
Atari God
Atari God
Posts: 1049
Joined: Mon Jul 23, 2012 8:57 pm
Location: Almost Heaven, West Virginia

Re: Question about using File Selector

Postby TheNameOfTheGame » Fri Oct 13, 2017 8:12 pm

Last thing is to set the new drive spec if valid.

Set up a variable for the bit mask of available drives:

Code: Select all

long drives;


Get the bit mask of available drives:

Code: Select all

drives = Dsetdrv(Dgetdrv());


Check after file selector returns if drive specification is valid:

Code: Select all

if(((drives) >> (path[0] - 65)) & 1)
       Dsetdrv( path[0] - 65);


So the whole routine is now:

Code: Select all

                     case MAIN_MENU_OPEN:
                        drives = Dsetdrv(Dgetdrv());
                        path[0] = Dgetdrv() + 65;
                        path[1] = ':';
                        Dgetpath( &path[2], 0 );
                        strcat( path, "\\*.*" );

                        /* TOS 1.04 and above */
                        result = fsel_exinput( path, name, &button, "Select file to open" );
                        if( result ) {
                           if( button == 1 ) {
                              s = strrchr( path, '\\' );
                              if( s != NULL ) {
                                 *s = '\0';
                                 if( strchr(path, '\\') == NULL ) {
                                    path[2] = '\\';
                                    path[3] = '\0';
                                    Dsetpath( &path[2] );
                                    strcat( path, name );
                                 }
                                 else {
                                    Dsetpath( &path[2] );
                                    strcat( path, "\\" );
                                    strcat( path, name );
                                 }
                                 if(((drives) >> (path[0] - 65)) & 1)
                                    Dsetdrv( path[0] - 65);
                              }
                              else
                                 form_alert( 1, "[1][File path error][OK]" );
                           }
                        }
                        else {
                           form_alert( 1, "[1][Error - Not enough RAM?][OK]" );
                           exit_flag = 1;
                        }
                        break;


Then I can attempt to open the file.

User avatar
charles
10 GOTO 10
10 GOTO 10
Posts: 2057
Joined: Tue Aug 17, 2004 12:11 am
Location: ont. Canada
Contact:

Re: Question about using File Selector

Postby charles » Fri Oct 13, 2017 10:33 pm

as far as I can recall you need to merge four strings together
and be on a 64 byte max vector
merge drive+path+filename+extention

a: + \xxx\xxx\xx\ + filename + extention

but like I mentioned it cant exceed a certain length...
atari compendium

dgetpath dgetdrive dpathconfig dsetpath dsetdrive fsel_input/fsel_exinput
atari is my lifestyle,not a hobby.
HOLD ON ! ! !,
Im printing unreadable characters ...!


Social Media

     

Return to “C / PASCAL etc.”

Who is online

Users browsing this forum: No registered users and 1 guest