Difference between revisions of "User:Lkates"
(→BTP600) |
|||
Line 15: | Line 15: | ||
BTP600 course material goes here. I wouldn't mind doing the Wikipedia Design Pattern stub. | BTP600 course material goes here. I wouldn't mind doing the Wikipedia Design Pattern stub. | ||
+ | |||
+ | ==Code Reading Exercise== | ||
+ | |||
+ | #Which file(s) did you have to examine? | ||
+ | |||
+ | First I looked at loadargc, since argc reminds me of the C/C++ standard command line variables that you use in main. However, that turned out to be a load balancing program. Next I looked at Main.h, since main seems like a good start, and headers tend to define stuff. But there wasn’t anything useful there. So I opened Main.c, and voila! Code that has to do with command line switches. | ||
+ | |||
+ | #What are your first reactions to these files when you examine them? | ||
+ | |||
+ | I don’t think I can put them down, in accordance to Seneca’s Acceptable Use Policy. But the sheer amount of code and underscores and structs were a bit overwhelming. | ||
+ | |||
+ | #How is the code for working with command-line switches organized at the method, class and project levels? (e.g. is is all in one class? broken across multiple classes? spread across many methods? etc) | ||
+ | |||
+ | There are a couple methods defined right near the beginning: | ||
+ | |||
+ | <code> | ||
+ | static void decode_switches PARAMS ((int argc, char **argv, int env)); | ||
+ | static void decode_env_switches PARAMS ((char *envar, unsigned int len)); | ||
+ | </code> | ||
+ | |||
+ | Almost immediately afterwards, there's the structure for an acceptable command line switch | ||
+ | |||
+ | <code> | ||
+ | /* The structure that describes an accepted command switch. */ | ||
+ | |||
+ | struct command_switch | ||
+ | { | ||
+ | int c; /* The switch character. */ | ||
+ | |||
+ | enum /* Type of the value. */ | ||
+ | { | ||
+ | flag, /* Turn int flag on. */ | ||
+ | flag_off, /* Turn int flag off. */ | ||
+ | string, /* One string per switch. */ | ||
+ | positive_int, /* A positive integer. */ | ||
+ | floating, /* A floating-point number (double). */ | ||
+ | ignore /* Ignored. */ | ||
+ | } type; | ||
+ | |||
+ | char *value_ptr; /* Pointer to the value-holding variable. */ | ||
+ | |||
+ | unsigned int env:1; /* Can come from MAKEFLAGS. */ | ||
+ | unsigned int toenv:1; /* Should be put in MAKEFLAGS. */ | ||
+ | unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */ | ||
+ | |||
+ | char *noarg_value; /* Pointer to value used if no argument is given. */ | ||
+ | char *default_value;/* Pointer to default value. */ | ||
+ | |||
+ | char *long_name; /* Long option name. */ | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Main.c then goes on to define a usage output, that is used to define, in English, how to use all the different flags. Presumably, this is used when the /h switch is used | ||
+ | |||
+ | <code> | ||
+ | /* The usage output. We write it this way to make life easier for the | ||
+ | translators, especially those trying to translate to right-to-left | ||
+ | languages like Hebrew. */ | ||
+ | |||
+ | static const char *const usage[] = | ||
+ | ... | ||
+ | N_("\ | ||
+ | -h, --help Print this message and exit.\n"), | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Afterwards, there is a table of the command switches, along with a bunch of flags and numbers I don't understand. | ||
+ | |||
+ | <code> | ||
+ | /* The table of command switches. */ | ||
+ | |||
+ | static const struct command_switch switches[] = | ||
+ | { 'b', ignore, 0, 0, 0, 0, 0, 0, 0 }, | ||
+ | { 'B', flag, (char *) &always_make_flag, 1, 1, 0, 0, 0, "always-make" }, | ||
+ | ... | ||
+ | </code> | ||
+ | |||
+ | |||
+ | It also defines "long names" for short switches, like when you use --help rather than /h | ||
+ | |||
+ | <code> | ||
+ | /* Secondary long names for options. */ | ||
+ | |||
+ | static struct option long_option_aliases[] = | ||
+ | { | ||
+ | { "quiet", no_argument, 0, 's' }, | ||
+ | { "stop", no_argument, 0, 'S' }, | ||
+ | { "new-file", required_argument, 0, 'W' }, | ||
+ | { "assume-new", required_argument, 0, 'W' }, | ||
+ | { "assume-old", required_argument, 0, 'o' }, | ||
+ | { "max-load", optional_argument, 0, 'l' }, | ||
+ | { "dry-run", no_argument, 0, 'n' }, | ||
+ | { "recon", no_argument, 0, 'n' }, | ||
+ | { "makefile", required_argument, 0, 'f' }, | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Main.h also defines a structure called "file", which has error handling in it for empty filenames: | ||
+ | |||
+ | <code> | ||
+ | static struct file * | ||
+ | enter_command_line_file (name) | ||
+ | char *name; | ||
+ | { | ||
+ | if (name[0] == '\0') | ||
+ | fatal (NILF, _("empty string invalid as file name")); | ||
+ | </code> | ||
=Other Wiki Courses= | =Other Wiki Courses= | ||
[[lkates:dps909]] | [[lkates:dps909]] |
Revision as of 17:21, 18 January 2007
Lorne Kates' User Page.
Me
I'm a 4/5/6/7th semester BSD student. I transferred in after completing CTY. Since the programs are similar yet different, I'm taking courses from all over the cirriculum.
In my spare time (what little there is), I pursue a myrid of hobbies in a very Jack-of-all-Trades manner. I read, write, play the guitar, and cook. My first short story was published earlier this year in the anthology Mythspring
I also run a yard haunt in Newmarket. Pictures from 2004, and some from 2005, are posted on the haunt's site.
My email: lkates@learn.senecac.on.ca
IRC handle: halcyon1234
BTP600
BTP600 course material goes here. I wouldn't mind doing the Wikipedia Design Pattern stub.
Code Reading Exercise
- Which file(s) did you have to examine?
First I looked at loadargc, since argc reminds me of the C/C++ standard command line variables that you use in main. However, that turned out to be a load balancing program. Next I looked at Main.h, since main seems like a good start, and headers tend to define stuff. But there wasn’t anything useful there. So I opened Main.c, and voila! Code that has to do with command line switches.
- What are your first reactions to these files when you examine them?
I don’t think I can put them down, in accordance to Seneca’s Acceptable Use Policy. But the sheer amount of code and underscores and structs were a bit overwhelming.
- How is the code for working with command-line switches organized at the method, class and project levels? (e.g. is is all in one class? broken across multiple classes? spread across many methods? etc)
There are a couple methods defined right near the beginning:
static void decode_switches PARAMS ((int argc, char **argv, int env)); static void decode_env_switches PARAMS ((char *envar, unsigned int len));
Almost immediately afterwards, there's the structure for an acceptable command line switch
/* The structure that describes an accepted command switch. */
struct command_switch
{ int c; /* The switch character. */
enum /* Type of the value. */ {
flag, /* Turn int flag on. */ flag_off, /* Turn int flag off. */ string, /* One string per switch. */ positive_int, /* A positive integer. */ floating, /* A floating-point number (double). */ ignore /* Ignored. */
} type;
char *value_ptr; /* Pointer to the value-holding variable. */
unsigned int env:1; /* Can come from MAKEFLAGS. */ unsigned int toenv:1; /* Should be put in MAKEFLAGS. */ unsigned int no_makefile:1; /* Don't propagate when remaking makefiles. */
char *noarg_value; /* Pointer to value used if no argument is given. */ char *default_value;/* Pointer to default value. */
char *long_name; /* Long option name. */ };
Main.c then goes on to define a usage output, that is used to define, in English, how to use all the different flags. Presumably, this is used when the /h switch is used
/* The usage output. We write it this way to make life easier for the
translators, especially those trying to translate to right-to-left languages like Hebrew. */
static const char *const usage[] = ...
N_("\ -h, --help Print this message and exit.\n"),
...
Afterwards, there is a table of the command switches, along with a bunch of flags and numbers I don't understand.
/* The table of command switches. */
static const struct command_switch switches[] =
{ 'b', ignore, 0, 0, 0, 0, 0, 0, 0 }, { 'B', flag, (char *) &always_make_flag, 1, 1, 0, 0, 0, "always-make" },
...
It also defines "long names" for short switches, like when you use --help rather than /h
/* Secondary long names for options. */
static struct option long_option_aliases[] =
{ { "quiet", no_argument, 0, 's' }, { "stop", no_argument, 0, 'S' }, { "new-file", required_argument, 0, 'W' }, { "assume-new", required_argument, 0, 'W' }, { "assume-old", required_argument, 0, 'o' }, { "max-load", optional_argument, 0, 'l' }, { "dry-run", no_argument, 0, 'n' }, { "recon", no_argument, 0, 'n' }, { "makefile", required_argument, 0, 'f' }, };
Main.h also defines a structure called "file", which has error handling in it for empty filenames:
static struct file *
enter_command_line_file (name)
char *name;
{
if (name[0] == '\0') fatal (NILF, _("empty string invalid as file name"));