A locale is a description of certain conventions your program might be expected to follow under certain circumstances. It’s mostly helpful to internationalize your program.
If you were going to print an amount of money, would you always use a dollar sign? Not if your program was going to run in the United Kingdom; there, you’d use a pound sign. In some countries, the currency symbol goes before the number; in some, it goes after. Where does the sign go for a negative number? How about the decimal point? A number that would be printed 1,234.56 in the United States should appear as 1.234,56 in some other countries. Same value, different convention. How are times and dates displayed? The only short answer is, differently. These are some of the technical reasons why some programmers whose programs have to run all over the world have so many headaches.
8. Is there a way to jump out of a function or functions?
The standard library functions setjmp() and longjmp() are used to provide a goto that can jump out of a function or functions, in the rare cases in which this action is useful. To correctly use setjmp() and longjmp(), you must apply several conditions.
You must #include the header file setjmp.h. This file provides the prototypes for setjmp() and longjmp(), and it defines the type jmp_buf. You need a variable of type jmp_buf to pass as an argument to bothsetjmp() and longjmp(). This variable will contain the information needed to make the jump occur.
You must call setjmp() to initialize the jmp_buf variable. If setjmp() returns 0, you have just initialized thejmp_buf. If setjmp() returns anything else, your program just jumped to that point via a call to longjmp(). In that case, the return value is whatever your program passed to longjmp().
Conceptually, longjmp() works as if when it is called, the currently executing function returns. Then the function that called it returns, and so on, until the function containing the call to setjmp() is executing. Then execution jumps to where setjmp() was called from, and execution continues from the return of setjmp(), but with the return value of setjmp() set to whatever argument was passed to longjmp(). In other words, if function f() calls setjmp() and later calls function g(), and function g() calls function h(), which callslongjmp(), the program behaves as if h() returned immediately, then g() returned immediately, then f()executed a goto back to the setjmp() call.
What this means is that for a call to longjmp() to work properly, the program must already have calledsetjmp() and must not have returned from the function that called setjmp(). If these conditions are not fulfilled, the operation of longjmp() is undefined (meaning your program will probably crash). The program The below program illustrates the use of setjmp() and longjmp(). It is obviously contrived, because it would be simpler to write this program without using setjmp() and longjmp(). In general, when you are tempted to use setjmp() and longjmp(), try to find a way to write the program without them, because they are easy to misuse and can make a program difficult to read and maintain.
#define RETRY_PROCESS 1
#define QUIT_PROCESS 2
if (gets(buf) && strcmp(buf, “done”))
if (strcmp(buf, “quit”) == 0)
if (strcmp(buf, “restart”) == 0)
printf(“Enter items, followed by ‘done’.\n”);
printf(“At any time, you can type ‘quit’ to exit\n”);
printf(“or ‘restart’ to start over again\n”);
nitems = 0;
for ( ; ; )
printf(“You typed in %d items.\n”,