Strcpy

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jack Klein

    #16
    Re: Strcpy

    On 21 Mar 2006 13:59:53 -0800, "Jake Thompson"
    <readytoride39@ hotmail.com> wrote in comp.lang.c:
    [color=blue]
    > Sorry for my outburst[/color]

    OK, but I'm still not sure that you're getting the point.
    [color=blue]
    > This is the function that I am calling[/color]

    You aren't showing a function at all.
    [color=blue]
    > char *folderid;
    > struct cm8linkstruc cm8link; <----------------structure tag set to
    > cm8link
    >
    >
    >
    > struct cm8linkstruc
    > {
    > char* type; /* type of item*/
    > <------------------------------------------field that I want to copy
    > the "13" too
    > char* desc; /* description of item */
    > char* item_increment; /*increment value for item
    > in folder */
    > char* itemid; /* id of returned item */
    > };[/color]

    At last, a definition of the structure! This structure contains four
    members (there is no such thing as a "field" defined by the C
    language), and each of the fields is a pointer to char.

    Up above you show the definition of an object of this type, named
    "cm8link". Since you're still not posting the real code that your
    compiler is seeing, there is information lacking.

    Is "cm8link" defined at file scope (outside of all functions), or is
    it defined at local scope (inside of a function)? It makes a
    difference, should your code ever compile, because you are heading for
    a run time problem.

    If "cm8link" is defined at file scope, the four char pointers are
    initialized to NULL. If it is defined in a local scope, the four char
    pointers are not initialized at all. In either case, they do not
    point to valid memory that you can read from or write to.
    [color=blue]
    > These are the lines of code that I am trying to execute in order to
    > copy the values too.
    >
    > strcpy(cm8link. type[count],"13"); //Copy the number 13 to indicate
    > folder[/color]

    I know you resent being asked for enough information to understand
    what mistakes you are making, BUT WHAT THE HELL IS "count"?!? WHERE
    IS "count" DEFINED?!?
    [color=blue]
    > strcpy(cm8link. desc[count],"Document "); //copy the description
    > strcpy(cm8link. desc[count],snumD); //copy the current doc counter to
    > the description[/color]

    WHAT THE HELL IS "snumD"?!?
    [color=blue]
    > strcpy(cm8link. item_increment[count],snumD); //copy Document counter
    > cm8link.itemid[count] = ((DKPidICM*)par t->getPidObject() )->getItemId()
    > ; //Get the itemid
    >
    > Is this enough information to go off of?[/color]

    No, actually, it is not. If you have actually properly initialized
    the character pointers to valid memory that you have the right to
    write to, then cm8link.desc[count] is a SINGLE CHARACTER, and you
    can't copy a string into a SINGLE CHARACTER. If you haven't
    initialized the character pointers, they don't point anywhere and you
    can't write to them at all.

    Multiple people have tried to explain to you, most of them patiently,
    but you aren't getting it.

    POST THE ACTUAL CODE THAT YOU ARE COMPILING. OF THE WHOLE FUNCTION.
    COPY IT FROM YOUR TEXT EDITOR AND PASTE IT INTO A MESSAGE. ALSO COPY
    THE DECLATATION OF EACH DATA TYPE, AND THE DEFINITION OF EACH OBJECT
    THAT IS MENTIONED IN THE CODE. PASTE IT ALL INTO YOUR MESSAGE.

    There are several possible different mistakes that you might be
    making, and nobody here is willing to put that much effort into
    guessing, maybe correctly or maybe incorrectly.

    STOP TRYING TO GUESS HOW LITTLE REAL INFORMATION PEOPLE NEED TO HELP
    YOU. YOU'RE GUESSING WRONG. IF YOU AREN'T WILLING TO PROVIDE
    EVERYTHING I ASKED FOR ABOVE, THEN YOU SHOULD GO AWAY AND FIGURE IT
    OUT FOR YOURSELF.

    Now I've got a sore throat from ALL THE SHOUTING.

    --
    Jack Klein
    Home: http://JK-Technology.Com
    FAQs for
    comp.lang.c http://c-faq.com/
    comp.lang.c++ http://www.parashift.com/c++-faq-lite/
    alt.comp.lang.l earn.c-c++

    Comment

    • Keith Thompson

      #17
      Re: Strcpy

      "Jake Thompson" <readytoride39@ hotmail.com> writes:[color=blue]
      > Sorry for my outburst[/color]

      A refreshing response, thank you. Everyone has bad moments every now
      and then.
      [color=blue]
      > This is the function that I am calling
      >
      >
      >
      > char *folderid;
      > struct cm8linkstruc cm8link; <----------------structure tag set to
      > cm8link
      >
      >
      >
      > struct cm8linkstruc
      > {
      > char* type; /* type of item*/
      > <------------------------------------------field that I want to copy
      > the "13" too
      > char* desc; /* description of item */
      > char* item_increment; /*increment value for item
      > in folder */
      > char* itemid; /* id of returned item */
      > };
      >
      >
      > These are the lines of code that I am trying to execute in order to
      > copy the values too.
      >
      > strcpy(cm8link. type[count],"13"); //Copy the number 13 to indicate
      > folder
      > strcpy(cm8link. desc[count],"Document "); //copy the description
      > strcpy(cm8link. desc[count],snumD); //copy the current doc counter to
      > the description
      > strcpy(cm8link. item_increment[count],snumD); //copy Document counter
      > cm8link.itemid[count] = ((DKPidICM*)par t->getPidObject() )->getItemId()
      > ; //Get the itemid
      >
      > Is this enough information to go off of?[/color]

      It's a good start.

      Consider the call

      strcpy(cm8link. type[count], "13");

      I'll assume count is an integer object.

      cm8link is of type struct cm8linkstruc.
      cm8link.type is of type char*.
      cm8link.type[count] is of type char
      The first argument to strcpy() is a char*, not a char.

      That's what you're doing wrong. What you should do is a trickier
      question.

      What is count? What does its value indicate? A count of what?

      Since cm8link.type is a char*, it's reasonable to have it point to
      (the first character of) the string "13". The simplest way to do this
      is by an assignment:

      cm8link.type = "13";

      cm8link.type will then point to the first character of a string
      literal. Allocation is taken care of for you, but you can't modify
      the contents of the string.

      (It might make more sense for cm8link.type to be an int, and just
      assign the value 13 to it -- or better yet, use some symbolic name
      like FOLDER, which could be a macro or an enum constant. But that's a
      design issue, not a correctness issue.)

      For a more general solution, you can either make cm8link.type point to
      an existing declared object (make sure the object doesn't cease to
      exist before you're done with it), or use malloc() to allocate space.
      For example:

      char *type = "13";
      ...
      cm8link.type = malloc(strlen(t ype) + 1);
      /* check whether malloc() succeeded */
      strcpy(cm8link. type, type);

      But it's still hard to tell just what you're trying to do. Your use
      of "count" seems to imply that you want an array of something. Do you
      want an array of struct cm8linkstruc objects? If so, you can either
      declare an array (if you know how many you want), or you can declare a
      *pointer* to a struct cm8linkstruc, and initialize it to point to an
      array by calling malloc().

      For example (this is a rough outline, not compiled or tested):

      struct cm8linkstruc *arr_ptr;
      arr_ptr = malloc(sizeof *arr_ptr * how_many);
      /* check whether malloc() succeeded */
      arr_ptr[count].type = "whatever";

      The code fragment you posted is certainly an improvement over what
      you've shown us previously, but it's still not valid C, and it's still
      incomplete. We still can't really tell how it fits into any larger
      context.

      I suspect the underlying problem is that you're writing code too
      early. You need to come up with a consistent design first, and then
      express it in C code. (With enough experience, you can often write
      the design directly in C, but frankly I don't think you're there yet.)

      --
      Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
      San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
      We must do something. This is something. Therefore, we must do this.

      Comment

      • Fred Kleinschmidt

        #18
        Re: Strcpy


        "Jake Thompson" <readytoride39@ hotmail.com> wrote in message
        news:1142975062 .133232.313260@ j33g2000cwa.goo glegroups.com.. .[color=blue]
        > First of all I appreciate the help and certainly there is no need to
        > lash out
        >
        > Secondly I did say that the field cm8link.type[count] is a char * field
        >
        > I don't see the need to have the entire program listed. It is a one
        > line statement that obviously I am using the wrong way.
        >
        > In a nutshell I need to move a literal to a char * that is part of an
        > array
        >
        > currently as an example I am doing the following just so you know count
        > is normally incremented in a loop but here i set it to clearly define
        > that I want to move the value 13 into
        >
        > cm8link.type[2],
        >
        > int count = 2;
        >
        > strcpy(cm8link. type[count],"13");
        >
        > resulting in the error
        >
        > error C2664: 'strcpy' : cannot convert parameter 1 from 'const char' to
        >
        > 'char *'
        >[/color]

        But you were probably wrong when you said "cm8link.ty pe[count] is a char *
        field".
        I'll bet that cm8link_type is a char * field, not cm8link.type[count]. In
        other words,
        somewhere you have:

        char *cm8link.type;
        of
        char cm8link.type[n]; /* where n is some number */

        If you want to place the characters "13" into cm8link.type beginning at
        position "count", then you want:
        strcpy (&cm8link.typ e[count], "13" );
        Hopefully cm8link.type is of length at least (count+3) or you will overwrite
        memory.
        --
        Fred L. Kleinschmidt
        Boeing Associate Technical Fellow
        Technical Architect, Software Reuse Project



        Comment

        • Flash Gordon

          #19
          Re: Strcpy

          Jake Thompson wrote:[color=blue]
          > First of all I appreciate the help and certainly there is no need to
          > lash out[/color]

          It tends to get frustrating when people ignore the advice to post enough
          information to allow them to be helped.
          [color=blue]
          > Secondly I did say that the field cm8link.type[count] is a char * field
          >
          > I don't see the need to have the entire program listed. It is a one
          > line statement that obviously I am using the wrong way.[/color]

          Since you don't know what is wrong, how do you know it isn't something
          else causing the problem?

          Man goes to mechanic, "my car won't start, here's the start motor, whats
          the problem?"
          Mechanic, "how do I know without the entire car?"

          Man tries the same else where with the same result.

          Swearing, man goes home and puts starter motor back in car. Man's wife
          comes out and says, "what are you up to? Oh, and by the way, the car ran
          out of petrol and I got some friends to help push it back here."
          [color=blue]
          > In a nutshell I need to move a literal to a char * that is part of an
          > array
          >
          > currently as an example I am doing the following just so you know count
          > is normally incremented in a loop but here i set it to clearly define
          > that I want to move the value 13 into
          >
          > cm8link.type[2],
          >
          > int count = 2;
          >
          > strcpy(cm8link. type[count],"13");
          >
          > resulting in the error
          >
          > error C2664: 'strcpy' : cannot convert parameter 1 from 'const char' to
          >
          > 'char *'[/color]

          That's easy. Either the error refers to a different line of
          cm8link.type[count] is of type const char * despite what you claim. Of
          course, there is the remote possibility that the compiler is lying, but
          you being wrong about the source of the problem is *far* more likely.

          In future post a *complete* program exhibiting the problem or it is
          highly unlikely that anyone will bother to even try and help you.
          --
          Flash Gordon, living in interesting times.
          Web site - http://home.flash-gordon.me.uk/
          comp.lang.c posting guidelines and intro:

          Comment

          • Keith Thompson

            #20
            Re: Strcpy

            "Default User" <defaultuserbr@ yahoo.com> writes:[color=blue]
            > Jake Thompson wrote:
            >[color=green]
            >> Well if it means dealing with a Dick as the alternative then hell yeah
            >> I will figure it out myself.
            >>
            >> Thank God your attitude is the minority here.[/color]
            >
            > As you can't be bothered to follow simple instructions when you're the
            > one wanting help, plus you refuse to quote any context, it's pretty
            > obvious what happens next.
            >
            >
            > *plonk*[/color]

            Then you probably missed his followup, in which he wrote:

            ] Sorry for my outburst

            FWIW.

            --
            Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
            San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
            We must do something. This is something. Therefore, we must do this.

            Comment

            • Jake Thompson

              #21
              Re: Strcpy

              This is the entire function from the module

              long u_dll_cm8_getfo lditemmatch(cha r *folderid, cm8linkstruc cm8link)
              {
              long l_stat = 0;
              short dataid;
              DKFolder* dkFOL = new DKFolder();
              DKParts* dkParts = new DKParts();
              DKLobICM* part = new DKLobICM();
              DKString list;
              int numD = 0;
              int numF = 0;
              DKString snumD;
              DKString snumF;
              DKString spnumber;
              int count;
              short itemPropertyTyp e;
              int h;


              /*Create an ddoobject based upon the passed folder id */
              DKDDO* ddoObject = dsICM->createDDO(fold erid);

              /*Get the contents of the folder */

              dkFOL = (DKFolder*)(dkC ollection*)
              ddoObject->getData(ddoObj ect->dataId(DK_CM_N AMESPACE_ATTR,D K_CM_DKFOLDER)) ;


              dataid = ddoObject->dataId(DK_CM_N AMESPACE_ATTR,D K_CM_DKFOLDER);
              if(dataid==0)
              {
              return 1; //No items in the folder
              }

              dkIterator* iter = dkParts->createIterator ();
              count = 0;
              while(iter->more()) // while there are still items, continue
              searching
              {
              part = (DKLobICM*) iter->next()->value(); // Move pointer
              to next element & get the first note found.

              itemPropertyTyp e =
              part->getPropertyByN ame(DK_CM_PROPE RTY_ITEM_TYPE);

              switch(itemProp ertyType)
              {
              case DK_CM_DOCUMENT:

              numD++;
              snumD = DKString(numD); //Convert number to a string
              strcpy(cm8link. type[count],"13"); //Copy the number 13 to indicate
              folder
              strcpy(cm8link. desc[count],"Document "); //copy the description
              strcpy(cm8link. desc[count],snumD); //copy the current doc counter
              to the description
              strcpy(cm8link. item_increment[count],snumD); //copy Document
              counter
              cm8link.itemid[count] =
              ((DKPidICM*)par t->getPidObject() )->getItemId() ; //Get the itemid
              break;

              case DK_CM_FOLDER:
              numF++;
              snumF = DKString(numF);//Convert number to a string
              strcpy(cm8link. type[count],"14"); //copy the number 14 to indicate
              folder
              strcpy(cm8link. desc[count],"Folder "); //copy the description
              strcpy(cm8link. desc[count],snumF); //copy the current folder
              counter to the description
              strcpy(cm8link. item_increment[count],snumF); //copy Folder counter
              cm8link.itemid[count] =
              ((DKPidICM*)par t->getPidObject() )->getItemId(); //Get the part number
              break;

              default:
              break;
              }
              count++; //Increment the counter
              }
              delete(iter); // Free Memory
              return 0;
              }

              This is the structure

              struct cm8linkstruc
              {
              char* type; /* type of item*/
              char* desc; /* description of item */
              char* item_increment; /*increment value for item
              in folder */
              char* itemid; /* id of returned item */
              };

              As far as including the earlier text I do not know how to do that. I
              am hitting reply so if I am not doing it right I apologize

              Comment

              • lawrence.jones@ugs.com

                #22
                Re: Strcpy

                Jake Thompson <readytoride39@ hotmail.com> wrote:[color=blue]
                >
                > First of all I appreciate the help and certainly there is no need to
                > lash out[/color]

                Apparently, there is. When we provide advice and you ignore it,
                additional emphasis is appropriate.
                [color=blue]
                > Secondly I did say that the field cm8link.type[count] is a char * field[/color]

                Yes, you did; but it's not. If it were, you wouldn't be getting the
                error you are. You have almost certainly declared it incorrectly, but
                we can't tell for sure since you steadfastly refuse to show us the
                actual declaration.
                [color=blue]
                > I don't see the need to have the entire program listed. It is a one
                > line statement that obviously I am using the wrong way.[/color]

                There are lots of things that can cause an error. If you don't know
                *what* the error is, then you have no way of knowing *where* the error
                is, no matter how "obvious" you might think it. Thus, it is absolutely
                necessary to provide a small but complete program that generates the
                error. Please delete the parts of your program that aren't related to
                the error, but make sure that the end result still compiles with the
                same error.

                -Larry Jones

                It's like SOMEthing... I just can't think of it. -- Calvin

                Comment

                • Default User

                  #23
                  Re: Strcpy

                  Keith Thompson wrote:
                  [color=blue]
                  > "Default User" <defaultuserbr@ yahoo.com> writes:[color=green]
                  > > Jake Thompson wrote:
                  > >[color=darkred]
                  > >> Well if it means dealing with a Dick as the alternative then hell[/color][/color]
                  > yeah >> I will figure it out myself.[color=green][color=darkred]
                  > >>
                  > >> Thank God your attitude is the minority here.[/color]
                  > >
                  > > As you can't be bothered to follow simple instructions when you're
                  > > the one wanting help, plus you refuse to quote any context, it's
                  > > pretty obvious what happens next.
                  > >
                  > >
                  > > plonk[/color]
                  >
                  > Then you probably missed his followup, in which he wrote:
                  >
                  > ] Sorry for my outburst
                  >
                  > FWIW.[/color]

                  Checking Google, that seems to have been in response to Kenneth. If
                  he'd like to specifically apologize for what he said to me, then I'd
                  certainly be ready to write it off as one of those things that happens
                  some times in a written forum. Doubtlessly someone will keep me
                  apprised should that transpire.



                  Brian

                  Comment

                  • Mark McIntyre

                    #24
                    Re: Strcpy

                    On 21 Mar 2006 13:04:22 -0800, in comp.lang.c , "Jake Thompson"
                    <readytoride39@ hotmail.com> wrote:
                    [color=blue]
                    >First of all I appreciate the help and certainly there is no need to
                    >lash out[/color]

                    Nobody lashed out. But if you are asked to do something out of
                    courtesy, and then ignore that request, expect rude responses.
                    Also, please read this:

                    <http://cfaj.freeshell. org/google/>
                    [color=blue]
                    >Secondly I did say that the field cm8link.type[count] is a char * field[/color]

                    Show us the definition. The error can't arise if that definition is as
                    you assert.
                    [color=blue]
                    >I don't see the need to have the entire program listed. It is a one
                    >line statement that obviously I am using the wrong way.[/color]

                    *sigh* You don't see the bug either. Do you see the connection?

                    Comment

                    • Mark McIntyre

                      #25
                      Re: Strcpy

                      On 21 Mar 2006 13:28:41 -0800, in comp.lang.c , "Jake Thompson"
                      <readytoride39@ hotmail.com> wrote:
                      [color=blue]
                      >Well if it means dealing with a Dick as the alternative then hell yeah
                      >I will figure it out myself.[/color]

                      You officially made it into the "arrogant newby who's too proud to
                      help himself" category. Well done.


                      Mark McIntyre
                      --
                      "Debugging is twice as hard as writing the code in the first place.
                      Therefore, if you write the code as cleverly as possible, you are,
                      by definition, not smart enough to debug it."
                      --Brian Kernighan

                      Comment

                      • Mark McIntyre

                        #26
                        Re: Strcpy

                        On 21 Mar 2006 13:59:53 -0800, in comp.lang.c , "Jake Thompson"
                        <readytoride39@ hotmail.com> wrote:
                        [color=blue]
                        >struct cm8linkstruc
                        >{
                        > char* type; /* type of item*/[/color]

                        type is of type char*.
                        [color=blue]
                        >strcpy(cm8link .type[count],"13"); //Copy the number 13 to indicate[/color]

                        Therefore type[count] is of type char.

                        Also, you need to allocate memory for type before you can copy
                        something into it.

                        Mark McIntyre
                        --
                        "Debugging is twice as hard as writing the code in the first place.
                        Therefore, if you write the code as cleverly as possible, you are,
                        by definition, not smart enough to debug it."
                        --Brian Kernighan

                        Comment

                        • Keith Thompson

                          #27
                          Re: Strcpy

                          "Jake Thompson" <readytoride39@ hotmail.com> writes:[color=blue]
                          > This is the entire function from the module[/color]

                          But it's still not a complete program, which drastically limits how
                          much help we can offer.
                          [color=blue]
                          > long u_dll_cm8_getfo lditemmatch(cha r *folderid, cm8linkstruc cm8link)
                          > {
                          > long l_stat = 0;
                          > short dataid;
                          > DKFolder* dkFOL = new DKFolder();
                          > DKParts* dkParts = new DKParts();[/color]
                          [...]

                          According to groups.google.c om, there have been 26 articles posted in
                          this thread. Until now, you've somehow managed to avoid posting
                          enough of your code to indicate that you're programming in C++, not C,
                          and therefore you're in the wrong newsgroup. (C and C++ are two
                          different languages; C has no "new" operator, among other
                          differences.)

                          If you really want help from comp.lang.c, post only C code. You may
                          be able to modify your code to be compatible with C (though so far you
                          haven't been able to show us code that's legal in any language).

                          Otherwise, the newsgroup you're looking for is comp.lang.c++.

                          Narrow down your program to a single, short, complete program, one
                          that doesn't depend on any external declarations or headers other than
                          those provided by the language standard. Show us something we can try
                          ourselves, and tell us what problem you're having with it. (In the
                          process of doing so, you might very well figure out the problem
                          yourself.)
                          [color=blue]
                          > As far as including the earlier text I do not know how to do that. I
                          > am hitting reply so if I am not doing it right I apologize[/color]

                          We have been trying to tell you how to quote properly. Pay attention.

                          Read <http://cfaj.freeshell. org/google/>. Read it now. Read it
                          before you post another followup to this or any other newsgroup.

                          --
                          Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
                          San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
                          We must do something. This is something. Therefore, we must do this.

                          Comment

                          • Jake Thompson

                            #28
                            Re: Strcpy

                            On 21 Mar 2006 13:59:53 -0800, in comp.lang.c , "Jake Thompson"


                            <readytorid...@ hotmail.com> wrote:[color=blue]
                            >struct cm8linkstruc
                            >{
                            > char* type; /* type of item*/[/color]


                            type is of type char*.

                            [color=blue]
                            >strcpy(cm8link .type[count],"13"); //Copy the number 13 to indicate[/color]


                            Therefore type[count] is of type char.

                            Also, you need to allocate memory for type before you can copy
                            something into it.


                            Mark McIntyre

                            Mark,

                            If I am understanding you correctly type is a char * and type[count] is
                            a char. Is is correct? Why does adding an array value to data type of
                            char * turn it into type char? Is there a better way to get the move
                            the data? I know the idea came up to turn type into an int (and that
                            would work for the number) but I have another strcpy statement that
                            copies "Document " to another char * in the struture. I would really
                            like to understand so I can learn from this issue.

                            Thanks
                            Jake

                            Can

                            Comment

                            • CBFalconer

                              #29
                              Re: Strcpy

                              Jake Thompson wrote:[color=blue]
                              >
                              > Well if it means dealing with a Dick as the alternative then hell
                              > yeah I will figure it out myself.
                              >
                              > Thank God your attitude is the minority here.
                              >
                              > I don't know who pissed in your breakfast but dude lighten up[/color]

                              Have fun. PLONK. I won't be seeing you.

                              --
                              "Churchill and Bush can both be considered wartime leaders, just
                              as Secretariat and Mr Ed were both horses." - James Rhodes.
                              "We have always known that heedless self-interest was bad
                              morals. We now know that it is bad economics" - FDR


                              Comment

                              • CBFalconer

                                #30
                                Re: Strcpy

                                lawrence.jones@ ugs.com wrote:[color=blue]
                                > Jake Thompson <readytoride39@ hotmail.com> wrote:
                                >[/color]
                                .... snip ...[color=blue]
                                >[color=green]
                                >> I don't see the need to have the entire program listed. It is
                                >> a one line statement that obviously I am using the wrong way.[/color]
                                >
                                > There are lots of things that can cause an error. If you don't
                                > know *what* the error is, then you have no way of knowing *where*
                                > the error is, no matter how "obvious" you might think it. Thus,
                                > it is absolutely necessary to provide a small but complete
                                > program that generates the error. Please delete the parts of
                                > your program that aren't related to the error, but make sure that
                                > the end result still compiles with the same error.[/color]

                                Well, he has already been plonked for atrocious attitude by about
                                one-half of the people who could give him help. And that is just
                                those that announced it.

                                --
                                "Churchill and Bush can both be considered wartime leaders, just
                                as Secretariat and Mr Ed were both horses." - James Rhodes.
                                "We have always known that heedless self-interest was bad
                                morals. We now know that it is bad economics" - FDR


                                Comment

                                Working...