Читать «Справочное руководство по C++» онлайн - страница 108

Бьярн Страустрап

 case '*':

 case '/':

 case '+':

 case '-':

 case '(':

 case ')':

 case '=':

  return curr_tok=ch;

 case '0': case '1': case '2': case '3': case '4':

 case '5': case '6': case '7': case '8': case '9':

 case '.':

  cin.putback(ch);

  cin ›› number_value;

  return curr_tok=NUMBER;

 default:

  if (isalpha(ch)) {

   char* p = name_string;

   *p++ = ch;

   while (cin.get(ch) && isalnum(ch)) *p++ = ch;

   cin.putback(ch);

   *p = 0;

   return curr_tok=NAME;

  }

  error ("bad token");

  return curr_tok=PRINT;

 }

}

int main(int argc, char* argv[])

{

 switch (argc) {

 case 1:

  break;

 case 2:

  cin = *new istream(strlen(argv[1]),argv[1]);

  break;

 default:

  error("too many arguments");

  return 1;

 }

 // insert predefined names:

 insert("pi")-›value = 3.1415926535897932385;

 insert("e")-›value = 2.7182818284590452354;

 while (1) {

  get_token();

  if (curr_tok == END) break;

  if (curr_tok == PRINT) continue;

  cout ‹‹ expr() ‹‹ "\n";

 }

 return no_of_errors;

}

b3_2_6a.cxx

extern void strcpy(char *,char *);

extern void exit(int);

extern int strlen(char *);

char *save_string(char* p)

{

 char* s = new char[strlen(p)+1];

 strcpy(s,p);

 return s;

}

int main (int argc, char* argv[])

{

 if (argc ‹ 2) exit(1);

 int size = strlen(argv[1])+1;

 char* p = save_string (argv[1]);

 delete[size] p;

}

b3_2_6b.cxx

#include ‹stream.hxx›

extern void exit(int);

void out_of_store()

{

 cout ‹‹ "operator new failed: out of store\n";

 exit(1);

}

typedef void (*PF)();

extern PF set_new_handler(PF);

main()

{

 set_new_handler(&out_of_store);

 char *p = new char[100000000];

 cout ‹‹ "done, p = " ‹‹ long(p) ‹‹ "\n";

}

b4_6_8.cxx

// This version of the program does not assume sizeof(int) == sizeof(char*)!

#include ‹stream.hxx›

#include ‹stdarg.hxx›

extern void exit(int);

void error (int …);

main(int argc, char* argv[])

{

 switch (argc) {

 case 1:

  error(0,argv[0],(char*)0);

  break;

 case 2:

  error(0,argv[0],argv[1],(char*)0);

  break;

 default:

  error(1,"with",dec(argc-1),"arguments",(char*)0);

 }

}

void error(int n …)

{

 va_list ap;

 va_start(ap,n);

 for (;;) {

  char *p = va_arg(ap,char*);