Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ (2) — Plan9 1st Edition

Media Vault

Software Library

Restoration Projects

Artifacts Sought

ARG(2)

NAME

ARGBEGIN, ARGEND, ARGC, ARGF, arginit, argopt − process option letters from argv

SYNOPSIS

­#include <u.h>
­#include <libc.h>

­ARGBEGIN {
­char ∗ARGF();
­Rune ARGC();
­} ARGEND

­extern char ∗argv0;

/∗ Alef only ∗/

Arg  ∗arginit(int argc, byte ∗∗argv);

Rune argopt(Arg ∗arg);

byte ∗argf(Arg ∗arg);

DESCRIPTION

These macros assume the names ­argc and ­argv are in scope; see exec(2). ­ARGBEGIN and ­ARGEND surround code for processing program options.  The code should be the cases of a C switch on option characters; it is executed once for each option character.  Options end after an argument --, before an argument -, or before an argument that doesn’t begin with -. 

­ARGC() returns the current option character. 

­ARGF() returns the current option argument: a pointer to the rest of the option string if not empty, or the next argument in ­argv if any, or 0.  ­ARGF must be called just once for each option that takes an argument. 

After ARGBEGIN, ­argv0 is a copy of argv[0] (conventionally the name of the program). 

After ARGEND, ­argv points at a zero-terminated list of the remaining ­argc arguments. 

Alef

The Alef argument processing routines are unrelated.  Instead, an ­aggr called ­Arg is initialized by a call to arginit. Successive calls to ­argopt return successive option characters, or zero at the end of the options.  After a call to argopt, ­argf will return any argument string associated with the option. 

EXAMPLES

This C program can take option ­b and option f, which requires an argument. 

#include <u.h>
#include <libc.h>
void
main(int argc, char ∗argv[])
{
char ∗f;
print("%s", argv[0]);
ARGBEGIN {
case ’b’:
print(" -b");
break;
case ’f’:
print(" -f(%s)", (f=ARGF())? f: "no arg");
break;
default:
print(" badflag(’%c’)", ARGC());
} ARGEND
print(" %d args:", argc);
while(∗argv)
print(" ’%s’", ∗argv++);
print("\n");
exits(0);
}

Here is the output for the run prog -bffile1 -r -f file2 arg1 arg2

prog -b -f(file1) badflag(’r’) -f(file2) 2 args: ’arg1’ ’arg2’

This Alef program accepts options ­b and, with an attached file name, f. 

#include <alef.h>
void
main(int argc, byte ∗∗argv)
{
int a, ac, bflag;
byte ∗file;
Arg ∗arg;
 arg = arginit(argc, argv);
while(ac = argopt(arg)) switch(ac){
case ’b’:
bflag = 1;
break;
case ’f’:
file = argf(arg);
break;
}
for(a=0; a<arg->ac; a++)
print("argument %s\n", arg->av[a]);
}

SOURCE

­/sys/include/libc.h

Plan 9  —  April 04, 1995

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026