|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)save.c 4.1 12/24/82"; ! 3: #endif ! 4: ! 5: #include "mille.h" ! 6: #include "unctrl.h" ! 7: #include <sys/types.h> ! 8: #include <sys/stat.h> ! 9: #include <time.h> ! 10: ! 11: typedef struct stat STAT; ! 12: typedef struct tm TIME; ! 13: ! 14: char *ctime(); ! 15: ! 16: int read(), write(); ! 17: ! 18: /* ! 19: * This routine saves the current game for use at a later date ! 20: */ ! 21: extern int errno; ! 22: extern char *sys_errlist[]; ! 23: ! 24: save() { ! 25: ! 26: reg char *sp; ! 27: reg int outf; ! 28: reg TIME *tp; ! 29: char buf[80]; ! 30: TIME tme; ! 31: STAT junk; ! 32: ! 33: tp = &tme; ! 34: if (Fromfile && getyn("Same file? ")) ! 35: strcpy(buf, Fromfile); ! 36: else { ! 37: over: ! 38: mvaddstr(MOVE_Y, MOVE_X, "file: "); ! 39: clrtoeol(); ! 40: leaveok(Board, FALSE); ! 41: refresh(); ! 42: sp = buf; ! 43: while ((*sp = getch()) != '\n') { ! 44: if (*sp == _tty.sg_kill) ! 45: goto over; ! 46: else if (*sp == _tty.sg_erase) { ! 47: if (--sp < buf) ! 48: sp = buf; ! 49: else { ! 50: addch('\b'); ! 51: /* ! 52: * if the previous char was a control ! 53: * char, cover up two characters. ! 54: */ ! 55: if (*sp < ' ') ! 56: addch('\b'); ! 57: clrtoeol(); ! 58: } ! 59: } ! 60: else ! 61: addstr(unctrl(*sp++)); ! 62: refresh(); ! 63: } ! 64: *sp = '\0'; ! 65: leaveok(Board, TRUE); ! 66: } ! 67: ! 68: /* ! 69: * check for existing files, and confirm overwrite if needed ! 70: */ ! 71: ! 72: if (sp == buf || (!Fromfile && stat(buf, &junk) > -1 ! 73: && getyn("Overwrite File? ") == FALSE)) ! 74: return FALSE; ! 75: ! 76: if ((outf = creat(buf, 0644)) < 0) { ! 77: error(sys_errlist[errno]); ! 78: return FALSE; ! 79: } ! 80: mvwaddstr(Score, ERR_Y, ERR_X, buf); ! 81: wrefresh(Score); ! 82: time(tp); /* get current time */ ! 83: strcpy(buf, ctime(tp)); ! 84: for (sp = buf; *sp != '\n'; sp++) ! 85: continue; ! 86: *sp = '\0'; ! 87: varpush(outf, write); ! 88: close(outf); ! 89: wprintw(Score, " [%s]", buf); ! 90: wclrtoeol(Score); ! 91: wrefresh(Score); ! 92: return TRUE; ! 93: } ! 94: ! 95: /* ! 96: * This does the actual restoring. It returns TRUE if the ! 97: * backup was made on exiting, in which case certain things must ! 98: * be cleaned up before the game starts. ! 99: */ ! 100: rest_f(file) ! 101: reg char *file; { ! 102: ! 103: reg char *sp; ! 104: reg int inf; ! 105: char buf[80]; ! 106: STAT sbuf; ! 107: ! 108: if ((inf = open(file, 0)) < 0) { ! 109: perror(file); ! 110: exit(1); ! 111: } ! 112: if (fstat(inf, &sbuf) < 0) { /* get file stats */ ! 113: perror(file); ! 114: exit(1); ! 115: } ! 116: varpush(inf, read); ! 117: close(inf); ! 118: strcpy(buf, ctime(&sbuf.st_mtime)); ! 119: for (sp = buf; *sp != '\n'; sp++) ! 120: continue; ! 121: *sp = '\0'; ! 122: /* ! 123: * initialize some necessary values ! 124: */ ! 125: sprintf(Initstr, "%s [%s]\n", file, buf); ! 126: Fromfile = file; ! 127: return !On_exit; ! 128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.