public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/26742]  New: force code block in default clause of switch statement
@ 2006-03-18  7:41 william dot p dot henry dot jr at gmail dot com
  2006-03-18 15:18 ` [Bug c/26742] " pinskia at gcc dot gnu dot org
  0 siblings, 1 reply; 2+ messages in thread
From: william dot p dot henry dot jr at gmail dot com @ 2006-03-18  7:41 UTC (permalink / raw)
  To: gcc-bugs

Without a code block around my "default" clause of my switch statement the
compiler can't parse the following instructions. 
 I'm including the text of a file which, when compiled, will run without a bug
(you will need to delete some of the local dependencies and references to
global variables). If you remove the curly braces around the switch statement's
default clause you'll find the compiler can't parse the file. The next
declaration after the default clause introduction ("default:") is "char
*myArgv[64];" and the compiler will tell you there's an error: syntax error
before "char" on that line.
  (I messed with this for about 30 minutes before I figured out that it was a
curly brace thing.)
  System/package info: 
gcc --version: gcc (GCC) 3.3.5 (Debian 1:3.3.5-8ubuntu2.1)


here's the code: 
/*******************************************************************
    Author: William P. Henry Jr.
      Name: mysh.c 
     Class: CS 360
Assignment: lab2
   Purpose: Simulate the UNIX command prompt and command processing.
                        For purpose of understanding how Unix sh works by using
                        fork() and exec(...), also string operations.           
*******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

//contains static global variable for operations
//including a string table for commands
#include "commandGlobals.h"
#include "commandProcessing.h"

#define DIRECTORY_LOCAL
#include "directoryGlobals.h"
#define PATH_LOCAL
#include "pathGlobals.h"
#include "pathProcessing.h"

//initialize array of recognized commands (global from 
//the commandGlobals.h file change the size there if you
//make any additions or removals here */
const char *cmd[] = {"mkdir", "rmdir", "ls",    "cd",   "pwd", "creat", "rm",
"quit", "help", "?", "menu", "reload", "echo", "exit", 0};

enum commandEnums {MKDIR = 0, RMDIR, LS, CD, PWD, CREAT, RM, QUIT, HELP,
QUESTION, MENU, RELOAD, ECHO, EXIT };

int main( int argc, char **argv, char **env )
{
        printf("\n*************BEGIN MYSH.C MAIN****************\n");

        initEnvironInfo(env);
        printf("Home string is: %s\n", homeBuf);
        printf("Path variables (in pathPointers[0-n]) are: \n");
        int m = 0;
        while( 0 != pathPointers[m] )
        {
                printf("\t%s\n", pathPointers[m++]);
        }//end while more path variables, print variables
        printf("PWD is: %s\n", getenv("PWD"));

        int ID = 0;
        char *fullInputString = malloc(256*(sizeof(char)));
        char *command = malloc(256*(sizeof(char)));
        char *arguments = malloc(256*(sizeof(char)));
        char localBuf[256];

        //used in child process
        char *fullCmd = malloc(256*(sizeof(char)));

        int pid = 0;
        int retval = 0;
        int status = 0;

        while(1)
        {
                printf("wphix $: ");
                fgets(inputLine, 256, stdin);
                //copy the full input string for use passing into
                //other functions, overwrite the final '\n'
                //leftover from user hitting "enter"
//              fullInputString[0] = '\0';
                strcpy(fullInputString, inputLine);
                fullInputString[strlen(fullInputString)-1] = '\0';
                inputLine[strlen(inputLine)-1] = '\0';          

                command = strtok(inputLine, " ");
                //copy all arguments after the initial command
                arguments = strtok( 0, "\n");

                //returns values as enumerated above
                ID = findCmd(command);

                switch(ID)
                {
                        case(CD): 
                                //printf("found %s at index %d\n", cmd[ID],
ID); 
                                if( 0 == arguments )
                                {
                                        //printf("no argument given for cd\n");
                                        chdir(homeBuf);
                                        localBuf[0]='\0';
                                        if( 0 == getcwd(localBuf, 256) )
                                        {
                                                printf("getcwd(localBuf, 256)
failed\n");
                                        }//end if
                                        else
                                        {
                                                printf("PWD is: %s\n",
localBuf);
                                        }//end else (so getcwd worked)
                                }//end if no arguments are passed
                                else if( 0 == chdir( arguments ) )
                                {
                                        //printf("was given %s to change to\n",
arguments);
                                        localBuf[0]='\0';
                                        if( 0 == getcwd(localBuf, 256) )
                                        {
                                                printf("getcwd(localBuf, 256)
failed\n");
                                        }//end if
                                        else
                                        {
                                                printf("PWD is: %s\n",
localBuf);
                                        }//end else (so getcwd worked)
                                }//end if worked, print blah
                                else
                                {
                                        printf("%s isn't a recognized
directory\n", arguments);
                                }//else failed to chdir
                                break;
                        case(QUIT): 
                                printf("quitting\n");
                                //using goto to handle freeing of malloc'ed
stuff
                                goto quitCleanUp;
                                break;
                        case(ECHO): 
                                if( 0 == arguments )
                                {
                                        printf("\n");
                                }//end if null 
                                else
                                {
                                        printf("%s\n", arguments);
                                }//end else print args
                                break;
                        case(EXIT):
                                printf("exiting\n");
                                free(fullInputString);
                                free(command);
                                free(arguments);
                                free(fullCmd);
                                exit(0);
                                break;
                        default: 
                        {  //I HATE THAT THIS HAS TO BE HERE...BUT THE CODE
WON'T 
                           //COMPILE WITHOUT THIS 
                                //arguments to pass in to new function
                                //pointers will point to memory in parent that
                                //will not be modified during child's execution
                                char *myArgv[64];
                                char buf[64];

                                //using fullInputString, tokenized, as the
argv's to pass in
                                int counter = 0;
                                myArgv[counter] = (char*)strtok(
fullInputString, " " );
                                do
                                {
                                        //strtok returns null on last call, so
the 
                                        //index past the last valid path will
hold zero
                                        myArgv[++counter] = (char*)strtok( NULL
, " " ); 
                                }//end while return not null
                                while( 0 != myArgv[counter] );

                                //************FORK*********************//       
                                printf("parent mysh with PID:%d forks child\n",
getpid());
                                pid = fork();
                                if(0 == pid)
                                {

                                        //CHILD
                                        printf("in child\n");
                                        //if path is absolute, pass it as
argument
                                        //if path is relative, rebuild path
from cwd
                                        if( isAbsolute(command) )
                                        {
                                                if( -1 == execve(command,
myArgv, env) )
                                                {
                                                        //printf("attempt to
run \"%s\" failed\n", command);
                                                        exit(2);
                                                }//end if
                                        }//end if is absolute path
                                        else
                                        {
                                                int num = 0;
                                                do
                                                {
                                                        fullCmd[0]='\0';
                                                       
strcpy(fullCmd,pathPointers[num]);
                                                        strcat(fullCmd,"/");
                                                        strcat(fullCmd,
command);
                                                        //printf("trying %s, ",
fullCmd);
                                                        execve(fullCmd, myArgv,
env);
                                                        ++num;
                                                }//end do
                                                while( 0 != pathPointers[num]
);
                                                printf("\n");
                                        }//end else is relative
                                        exit(3);

                                }//end if zero is pid, so in child
                                else
                                {
                                        //PARENT
                                        retval = waitpid(pid, &status, 0);
                                        printf("in parent\n");
                                        if( WIFEXITED(status) )
                                        {
                                                printf("child pid:%d exited
normally\n", pid);
                                                printf("with exit status:%d\n",
WEXITSTATUS(status));
                                                if( retval != pid )
                                                {
                                                        printf("and waitpid's
retval:%d\n", retval);
                                                }//end if inequal retval and
pid
                                        }//end if exited normally
                                }//end else
                                break;
                        //I HATE THAT THIS HAS TO BE HERE, AND I HAVE NO IDEA
WHY,
                        //BUT AFTER I DOWNLOADED A NEW COMPILER VERSION IT GAVE
                        //ME THE STRANGEST ERROR ON CODE THAT HAD BEEN WORKING
                        //SO I MESSED WITH IT AND FINALLY FOUND THE PROBLEM BY
                        //PUTTING CURLY BRACES AROUND THE CODE BLOCK
                        }//end default block
                }//end switch
        }//end while loop
quitCleanUp:
        free(fullInputString);
        free(command);
        free(arguments);
        free(fullCmd);
        printf("**************END MYSH.C MAIN*****************\n\n");   
        return 0;
}//end main


-- 
           Summary: force code block in default clause of switch statement
           Product: gcc
           Version: 3.3.5
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: william dot p dot henry dot jr at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26742


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Bug c/26742] force code block in default clause of switch statement
  2006-03-18  7:41 [Bug c/26742] New: force code block in default clause of switch statement william dot p dot henry dot jr at gmail dot com
@ 2006-03-18 15:18 ` pinskia at gcc dot gnu dot org
  0 siblings, 0 replies; 2+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-03-18 15:18 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from pinskia at gcc dot gnu dot org  2006-03-18 15:18 -------
This is how C99 is designed.

This is a dup of an older invalid bug, PR 7508.


*** This bug has been marked as a duplicate of 7508 ***


-- 

pinskia at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |DUPLICATE


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26742


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-03-18 15:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-03-18  7:41 [Bug c/26742] New: force code block in default clause of switch statement william dot p dot henry dot jr at gmail dot com
2006-03-18 15:18 ` [Bug c/26742] " pinskia at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).