/* Program Name: c_saw.c Copyright (c) 1990, Falcon Software This program will demonstrate many of the functions that are included with the C_SAW Tools. To compile this program in Microsoft C 5.x type: cl /c /AL c_saw.c Then to link type: link c_saw+gen,,,c_sawl */ #include #include int snow = 0; /* This variable is global to all functions */ /* It makes functions determine whether or not */ /* to use fast screen writes or not */ #define DCHAR 22 char *gen_parms [4]; /* set up an array of parameter pointers to pass to gen function */ char parms [4] [3]; /* storage area for parameters */ struct { /* setup a simple structure for our data entry */ char name [31]; char address [31]; char city [19]; char state [3]; char zipcode [9]; char phone [15]; char last_date [9]; char mail_code [5]; double ytd_sales; } list; char demo_scr [4000]; /* These are our screen files */ char screen [4000]; char many_screen [9] [4000]; char screen_file [13]; int x; /* loop variable */ int y; /* loop variable */ int z; /* temp variable */ char ret; /* getch() char */ char scan_code; /* for getchi() */ int field; /* for data entry routine. Field position */ main() { int pos; int menu_bar_color; int change_flag; /* for menu section */ gen_parms [0] = parms [0]; gen_parms [1] = parms [1]; gen_parms [2] = parms [2]; gen_parms [3] = parms [3]; cls(); /* clear the screen */ strcpy (parms [1], "/M"); /* default to monochrome screens */ printf ("Do you wish to display this demo in Color or Black & White (C/B)? "); do { ret = getchi (&scan_code); /* get answer */ ret = toupper (ret); /* convert it to upper case */ } while ((ret != 'B') && (ret != 'C')); putch (ret); if (ret == 'C') { menu_bar_color = MAGENTA; /* set color for menu */ change_flag = CHANGE_BACKGROUND; /* in color we change only bg */ strcpy (screen_file, "c_saw.scr"); /* demo.scr has color screens */ } else { strcpy (screen_file, "c_saw.bw"); /* c_saw.bw has black & white screens */ strcpy (parms [2], "/B"); menu_bar_color = WHITE; /* set monochrome menu bar */ change_flag = CHANGE_BOTH; /* in mono we change both fg & bg */ } if ((ret = display_type()) == COLOR) /* get adapter type */ { printf ("\nDoes your screen flicker when fast screen writes are used (Y/N)?"); do { ret = getchi (&scan_code); ret = toupper (ret); } while ((ret != 'Y') && (ret != 'N')); putch (ret); if (ret == 'Y') { snow = 1; strcpy (parms [3], "/S"); } } cur_type (CURSOR_HIDE, 0); /* hide cursor */ dispx (screen_file, 1, demo_scr); /* read and display first screen */ /* This section will change the foreground color of the opening screen */ do { pause (.7); if (kbhit()) break; setatt (3,8, 10,28, LT_GREEN, BLUE, CHANGE_FOREGROUND); setatt (3,30, 10,69, LT_CYAN, BLUE, CHANGE_FOREGROUND); setatt (13,12, 20,64, LT_RED, BLUE, CHANGE_FOREGROUND); pause (.7); if (kbhit()) break; setatt (3,8, 10,28, LT_BROWN, BLUE, CHANGE_FOREGROUND); setatt (3,30, 10,69, LT_WHITE, BLUE, CHANGE_FOREGROUND); setatt (13,12, 20,64, LT_GREEN, BLUE, CHANGE_FOREGROUND); pause (.7); if (kbhit()) break; setatt (3,8, 10,28, LT_CYAN, BLUE, CHANGE_FOREGROUND); setatt (3,30, 10,69, LT_RED, BLUE, CHANGE_FOREGROUND); setatt (13,12, 20,64, LT_BROWN, BLUE, CHANGE_FOREGROUND); pause (.7); if (kbhit()) break; setatt (3,8, 10,28, LT_WHITE, BLUE, CHANGE_FOREGROUND); setatt (3,30, 10,69, LT_GREEN, BLUE, CHANGE_FOREGROUND); setatt (13,12, 20,64, LT_CYAN, BLUE, CHANGE_FOREGROUND); pause (.7); if (kbhit()) break; setatt (3,8, 10,28, LT_RED, BLUE, CHANGE_FOREGROUND); setatt (3,30, 10,69, LT_BROWN, BLUE, CHANGE_FOREGROUND); setatt (13,12, 20,64, LT_WHITE, BLUE, CHANGE_FOREGROUND); if (kbhit()) break; } while (! kbhit()); ret = getchi (&scan_code); /* clear keyboard buffer */ rdscr (screen_file, 2, demo_scr); /* read in the next screen but don't display it */ /* This routine will part the current screen while it displays the screen we just read */ y = 39; for (x = 40; x <= 77; x ++) { horizw (LEFT, 1, WHITE, BLUE, 1,2, 24, y); horizw (RIGHT, 1, WHITE, BLUE, 1,x, 24,79); dispvw (demo_scr, 1,y, 24,x, 1,y); y --; } cl_key(); /* clear keyboard buffer */ dispv (demo_scr); /* display whole screen to clean up any mess from our scrolling routine */ ret = getchi(&scan_code); /* get key from user */ /********************************************************* * menu routine starts here * ********************************************************/ pos = 1; do { dispx (screen_file, 3, demo_scr); /* display menu */ do { if (pos > 11) pos = 1; if (pos < 1) pos = 11; setatt (pos + 7,28, pos + 7,51, BLACK, menu_bar_color, change_flag); ret = getchi (&scan_code); ret = toupper (ret); if ((ret == 'S') || (ret == 'V') || (ret == 'D') || (ret == 'T') || (ret == 'M') || (ret == 'E')) { pos = 0; break; } if (ret == CR) break; if (ret) continue; if (scan_code == DOWN_ARROW) /* the setatt() function */ { /* displays or kills the menu bar */ setatt (pos + 7,28, pos + 7,51, WHITE, BLUE, change_flag); pos += 2; continue; } if (scan_code == UP_ARROW) { setatt (pos + 7,28, pos + 7,51, WHITE, BLUE, change_flag); pos -= 2; continue; } } while (1); if ((pos == 1) || (ret == 'S')) sdu(); /* screen design utility */ if ((pos == 3) || (ret == 'V')) video(); /* Video Routines */ if ((pos == 5) || (ret == 'D')) data_entry(); /* Data Entry Routines */ if ((pos == 7) || (ret == 'T')) string(); /* String Manipulation */ if ((pos == 9) || (ret == 'M')) misc(); /* Miscellaneous Functions */ if ((pos == 11) || (ret == 'E')) quit(); pos = 1; } while (1); } sdu() /* Screen Design Utility */ { disp (screen_file, 4, demo_scr); /* intro screen to SDU */ if (! get_key()) return; /* key a get but if user hits esc, quit routine */ disp (screen_file, 11, demo_scr); /* mail list screen */ if (! get_key()) return; scroll (DOWN, 1, WHITE, BLACK, 20,1, 20,79); /* get rid of part of screen */ dispw (screen_file, 12, demo_scr, 13,1, 21,52, 5,6); /* window in mail screen*/ if (! get_key()) return; x = 14; do { if (x < 14) x = 14; /* display source code screens*/ disp (screen_file, x, demo_scr); /* let them page up or down */ ret = getchi (&scan_code); if (ret == ESC) quit(); if (scan_code == PG_UP) x -=2; x ++; } while (x < 20); disp (screen_file, 13, demo_scr); /* show last screen before going */ if (! get_key()) return; /* into the Screen Design Utility */ gen(4, gen_parms); /* run gen & macro */ /* we must pass gen_parms, because the gen function is expecting an array of pointers just as a main (argc, argv) fuction would */ for (x = 1; x <=26; x++) /* quickly display all of the */ disp (screen_file, x, demo_scr); /* screen files */ } video() /* video routines......*/ { float weight_factor; int foreground = 7; int background = 1; disp (screen_file, 5, screen); /* display first screen */ if (! get_key()) return; dispw (screen_file, 6, demo_scr, 1,1, 15,59, 5,10); /* display window */ if (! get_key()) return; dispv (screen); /* restore screen */ y = 1; z = 0; for (x = 1; x <= 17; x += 2) /* display overlapping windows */ { copyscr (many_screen [z]); dispvw (demo_scr, 16,1, 24,42, x, y); y += 4; z ++; } if (! get_key()) return; for (x = 8; x >= 0; x --) /* unlap or restore windows one at a time */ { dispv (many_screen [x]); pause (.01); } if (! get_key()) return; disp (screen_file, 7, demo_scr); if (! get_key()) return; disp (screen_file, 8, demo_scr); weight_factor = .01; /* pause() is only accurate to */ /* nearest .05 seconds */ do { for (x = 1; x <=7; x ++) /* show scrolling box */ { pause (weight_factor); scroll (DOWN, 1, WHITE, BLUE, 8 + x, 6, 13 + x, 21); } if (check_key(&weight_factor)) break; for (x = 1; x <= 10; x ++) { pause (weight_factor); horizw (RIGHT, 1, WHITE, BLUE, 15, 5 + x, 20, 21 + x); } if (check_key(&weight_factor)) break; for (x = 1; x <= 7; x ++) { pause (weight_factor); scroll (UP, 1, WHITE, BLUE, 16 - x, 15, 21 - x, 31); } if (check_key(&weight_factor)) break; for (x = 1; x <= 10; x ++) { pause (weight_factor); horizw (RIGHT, 1, WHITE, BLUE, 9, 15 + x, 13, 31 + x); } if (check_key(&weight_factor)) break; for (x = 1; x <=7; x ++) { pause (weight_factor); scroll (DOWN, 1, WHITE, BLUE, 8 + x, 26, 13 + x, 41); } if (check_key(&weight_factor)) break; for (x = 1; x <= 10; x ++) { pause (weight_factor); horizw (RIGHT, 1, WHITE, BLUE, 15, 25 + x, 20, 41 + x); } if (check_key(&weight_factor)) break; for (x = 1; x <= 7; x ++) { pause (weight_factor); scroll (UP, 1, WHITE, BLUE, 16 - x, 36, 21 - x, 51); } if (check_key(&weight_factor)) break; for (x = 1; x <= 30; x ++) { pause (weight_factor); horizw (LEFT, 1, WHITE, BLUE, 9, 36 - x, 13, 52 - x); } if (check_key(&weight_factor)) break; } while (1); /* loop until break */ disp (screen_file, 9, demo_scr); /* change attributes routine */ do { setatt (13, 7, 17,25, foreground, background, CHANGE_BACKGROUND); setatt (13, 30, 17,48, foreground, background, CHANGE_FOREGROUND); setatt (13, 53, 17,71, foreground, background, CHANGE_BOTH); pause (.3); foreground ++; background ++; foreground = foreground % 16; background = background % 8; } while (! kbhit()); ret = getchi (&scan_code); /* clear keyboard buffer */ rdscr (screen_file, 1, screen); /* read screen but don't display yet */ disp (screen_file, 10, demo_scr); pause (.5); dispvw (screen, 3,9, 10,18, 11,65); /* scroll c_saw horizontally */ for (y = 65; y >= 9; y --) horizw (LEFT, 1, WHITE, BLUE, 11, y - 1, 18, y + 9); dispvw (screen, 3,21, 10,28, 11,65); for (y = 65; y >= 21; y --) horizw (LEFT, 1, WHITE, BLUE, 11, y - 1, 18, y + 9); dispvw (screen, 3,31, 10,38, 11,65); for (y = 65; y >= 31; y --) horizw (LEFT, 1, WHITE, BLUE, 11, y - 1, 18, y + 9); dispvw (screen, 3,42, 10,50, 11,65); for (y = 65; y >= 42; y --) horizw (LEFT, 1, WHITE, BLUE, 11, y - 1, 18, y + 9); dispvw (screen, 3,53, 10,68, 11,59); for (y = 59; y >= 53; y --) horizw (LEFT, 1, WHITE, BLUE, 11, y - 1, 18, y + 15); if (! get_key()) return; } check_key(weight_factor) float *weight_factor; { if (kbhit()) { ret = getchi (&scan_code); if ((ret == 'F') || (ret == 'f')) { *weight_factor = 0; return (0); } if ((ret == 'S') || (ret == 's')) { *weight_factor = .01; return (0); } return (1); } } data_entry() { disp (screen_file, 25, demo_scr); /* display opening screen */ if (! get_key()) return; disp (screen_file, 11, demo_scr); /* mail list screen */ scroll (DOWN, 5, WHITE, BLACK, 20,1, 20,79); cur_type (CURSOR_NORMAL, 0); /* restore cursor */ field = 1; /* begin data entry on mail list screen */ do { if (field < 1) field = 9; if (field > 9) field = 1; switch (field) { case 1: ret = enter (list.name, ' ', 19,10,50, "Enter the full name.", 5,13,30, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, ""); break; case 2: ret = enter (list.address, ' ', 19,10,50, "Enter the address.", 7,13,30, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, ""); break; case 3: ret = enter (list.city, ' ', 19,10,50, "Enter the city.", 9,13,18, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, ""); break; case 4: ret = enter (list.state, 'U', 19,10,50, "Enter the state.", 9,39,2, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, ""); break; case 5: ret = enter (list.zipcode, 'N', 19,10,50, "Enter the zipcode.", 9,52,5, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, ""); break; case 6: ret = enter (list.phone, 'N', 19,10,50, "Enter the phone number.", 11,13,14, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, "(###)-###-####"); break; case 7: ret = get_num (&list.ytd_sales, 19,10,50, "Enter their YTD Sales Amount", 11, 56, 11, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR); break; case 8: ret = enter (list.last_date, ' ', 19,10,50, "Enter the last mail date.", 14,20,8, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, "##/##/##"); break; case 9: ret = enter (list.mail_code, 'U', 19,10,50, "Enter the mail code.", 14,47,4, LT_GREEN, BLACK, LT_WHITE, BLUE, DCHAR, ""); break; default : break; } if (ret == UP_ARROW) { field --; continue; } if (ret == DOWN_ARROW) { field ++; continue; } field ++; } while ((ret != F10) && (ret != ESC)); disp (screen_file, 26, demo_scr); if (! get_key()) return; } string() { disp (screen_file, 20, demo_scr); if (! get_key()) return; } misc () { disp (screen_file, 21, demo_scr); if (! get_key()) return; } get_key() { char ret; ret = getchi(&scan_code); if (! ret) ret = scan_code; /* check for function key */ if (ret == ESC) return (0); return (ret); } quit () { rdscr (screen_file, 24, demo_scr); cls(); for (x = 1; x <= 19; x ++) { dispvw (demo_scr, x,3, x,78, 24,3); scroll (UP, 1, WHITE, BLACK, 1,3, 24,78); } pause (.7); setatt (6,6, 22,75, LT_RED, BLUE, CHANGE_FOREGROUND); pause (.7); setatt (6,6, 22,75, LT_CYAN, BLUE, CHANGE_FOREGROUND); pause (.7); setatt (6,6, 22,75, LT_BLUE, BLUE, CHANGE_FOREGROUND); pause (.7); setatt (6,6, 22,75, LT_GREEN, BLUE, CHANGE_FOREGROUND); pause (.7); setatt (6,6, 22,75, LT_WHITE, BLUE, CHANGE_FOREGROUND); pause (.7); setatt (6,6, 22,75, LT_BROWN, BLUE, CHANGE_FOREGROUND); locate (24, 1); cur_type (CURSOR_NORMAL, 0); exit (0); }