/* --------------------------------------------------------------------------- * Prompting for value * * Author : J.B.Lane UCL March 1998 ask.c * --------------------------------------------------------------------------- */ #include "ask.h" #include "vme.h" #include "timlet.h" #include /* ULONG_MAX */ #include /* strtoul */ #include /* strchr */ #define MAXLINE 128 /* maximum input line size (last for \0) */ int tim_vme (const int vme_size) { unsigned int vme_base_addr; int r, vme_mode; r = askyn ("Select VME A24 address mode? [A32]", 'N'); if (r == ASK_YES) { vme_mode = VME_MODE_A24; vme_base_addr = VME_BASE_A24; } else /* NO or DEFAULT or EOF */ { vme_mode = VME_MODE_A32; vme_base_addr = VME_BASE_A32; } r = ask("Enter VME base address", vme_base_addr, &vme_base_addr); memory_ptr = vme_get_window (vme_size, vme_base_addr, vme_mode); reg = memory_ptr; /***/ reg32 = (unsigned int *)memory_ptr; /***/ if (vme_size > 0x8000) { ram_ptr = memory_ptr + TIM_RAM_SIZE ; /* offset is 16-bit words */ } else { vme_base_addr = 0x8000 + vme_base_addr ; ram_ptr = vme_get_window (0x8000, vme_base_addr, vme_mode) ; } return r; } unsigned short* ask_vme (const int vme_size) { unsigned short *memory_ptr; unsigned int vme_base_addr; int r, vme_mode; r = askyn ("Select VME A32 address mode? [A24]", 'N'); if (r == ASK_YES) { vme_mode = VME_MODE_A32; vme_base_addr = VME_BASE_A32; } else /* NO or DEFAULT or EOF */ { vme_mode = VME_MODE_A24; vme_base_addr = VME_BASE_A24; } r = ask("Enter VME base address", vme_base_addr, &vme_base_addr); memory_ptr = vme_get_window (vme_size, vme_base_addr, vme_mode); return memory_ptr; } int askyn (const char *Prompt, const int Default) { char line[MAXLINE]; /* first char read if %c is LF */ int code; int r; printf ("%s [%c] : ", Prompt, Default); r = ask_getline ("", line); if (r != ASK_OK) /* for DEFAULT and EOF returns */ { return r; /* maybe just return DEFAULT ***/ } switch (line[0]) { case 'Y': case 'y': code = ASK_YES ; break; case 'N': case 'n': code = ASK_NO ; break; case'\n': default : code = ASK_DEFAULT; break; } return code; } int ask_int (const char *Prompt, const int Default, int *word) { return ask (Prompt, Default, (unsigned *)word); } int ask (const char *Prompt, const unsigned int Default, unsigned int *word) { char line[MAXLINE]; /* first char read if %c is LF */ char*linep; /* line==linep IF linep=gets(line); */ char*endp; int base; unsigned int unsint; unsigned long unslong; int r; printf ("%s [4x%4X] : ", Prompt, Default); r = ask_getline ("", line); if (r != ASK_OK) /* for DEFAULT and EOF returns */ { *word = Default; return r; } linep = line; switch (line[0]) { case 'N': case 'n': base = 2; ++linep; break; case 'O': case 'o': base = 8; ++linep; break; case 'I': case 'i': base = 10; ++linep; break; case 'H': case 'h': base = 16; ++linep; break; default : base = 16; break; } /* endp is initialised to NULL but this does't matter on ax8 */ /* conversion stops at eg a 2 char... test endp * also error ULONG_MAX is "Result too large" */ unslong = strtoul (linep, &endp, base); if (unslong == ULONG_MAX) { *word = Default; putchar('\a'); } else { /* unsint = unslong ... cc: Info: Assignment might result in data loss */ unsint = *(unsigned int *) &unslong; *word = unsint; } if (unslong > UINT_MAX) putchar('\a'); if (*endp != '\n' && *endp != '\0') putchar('\a'); return ASK_OK; /* r2 = sscanf (line, "%x", word); */ /* if r2 is 0 (eg Z char) or -1 (EOF eg junk), word is unchanged */ /* EOF is error or end of file */ } int ask_line (const char *Prompt, const char *Default, char line[]) { int r; printf ("%s [%s] : ", Prompt, Default); r = ask_getline (Default, line); /* sscanf %s removes \n but also everything after first blank */ /* consider line overflow ***/ return r; } int ask_getline (const char *Default, char string[]) { char line[MAXLINE]; /* first char read if %c is LF */ char *chr; /* Force any buffered prompt to display */ fflush (NULL); /* scanf doesn't respect CR. fflush(stdin) does nothing on NT with gcc */ /* this disallows type-ahead */ /* gets has no MAXLINE protection: use fgets */ if (fflush(stdin) == EOF) putchar('\a'); /* flush \n left by scanf */ if (fgets(line, MAXLINE, stdin) == NULL) { putchar('\a'); strcpy(string, Default); return EOF; } if (line[0] == '\n') { strcpy(string, Default); return ASK_DEFAULT; } /* if no \n flush, if \n not next error else still in buffer for next read */ chr = strchr(line, '\n'); if (chr == NULL) { printf ("no end\n"); /* becomes default ***/ if (getchar() != '\n') { (void)fflush(stdin); putchar('\a'); } } else *chr = '\0'; /* remove \n */ strcpy(string, line); return ASK_OK; }