|
|
1.1 ! root 1: #ifndef lint ! 2: static char rcs_id[] = "$Header: util.c,v 1.14 87/09/11 08:18:35 toddb Exp $"; ! 3: #endif lint ! 4: /* ! 5: * COPYRIGHT 1987 ! 6: * DIGITAL EQUIPMENT CORPORATION ! 7: * MAYNARD, MASSACHUSETTS ! 8: * ALL RIGHTS RESERVED. ! 9: * ! 10: * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND ! 11: * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ! 12: * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ! 13: * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. ! 14: * ! 15: * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS, ! 16: * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT ! 17: * SET FORTH ABOVE. ! 18: * ! 19: * ! 20: * Permission to use, copy, modify, and distribute this software and its ! 21: * documentation for any purpose and without fee is hereby granted, provided ! 22: * that the above copyright notice appear in all copies and that both that ! 23: * copyright notice and this permission notice appear in supporting documentation, ! 24: * and that the name of Digital Equipment Corporation not be used in advertising ! 25: * or publicity pertaining to distribution of the software without specific, ! 26: * written prior permission. ! 27: */ ! 28: ! 29: /* util.c -- little miscellaneous utilities. */ ! 30: ! 31: #include "xmh.h" ! 32: #include <sys/file.h> ! 33: #include <sys/types.h> ! 34: #include <sys/stat.h> ! 35: #include <sys/time.h> ! 36: #include <errno.h> ! 37: #include <ctype.h> ! 38: ! 39: /* Something went wrong; panic and quit. */ ! 40: ! 41: Punt(str) ! 42: char *str; ! 43: { ! 44: extern void abort(); ! 45: (void) fprintf(stderr, "%s\nerrno = %d\007\n", str, errno); ! 46: (void) fflush(stderr); ! 47: abort(); ! 48: } ! 49: ! 50: ! 51: int myopen(path, flags, mode) ! 52: char *path; ! 53: int flags, mode; ! 54: { ! 55: int fid; ! 56: fid = open(path, flags, mode); ! 57: if (debug && fid >= 0) fprintf(stderr, "# %d : %s\n", fid, path); ! 58: return fid; ! 59: } ! 60: ! 61: ! 62: FILE *myfopen(path, mode) ! 63: char *path, *mode; ! 64: { ! 65: FILE *result; ! 66: result = fopen(path, mode); ! 67: if (debug && result) fprintf(stderr, "# %d : %s\n", result->_file, path); ! 68: return result; ! 69: } ! 70: ! 71: ! 72: ! 73: int myclose(fid) ! 74: { ! 75: if (close(fid) < 0) Punt("Error in myclose!"); ! 76: if (debug) fprintf(stderr, "# %d : <Closed>\n", fid); ! 77: } ! 78: ! 79: ! 80: int myfclose(file) ! 81: FILE *file; ! 82: { ! 83: int fid = file->_file; ! 84: if (fclose(file) < 0) Punt("Error in myfclose!"); ! 85: if (debug) fprintf(stderr, "# %d : <Closed>\n", fid); ! 86: } ! 87: ! 88: ! 89: ! 90: /* Return a unique file name. */ ! 91: ! 92: char *MakeNewTempFileName() ! 93: { ! 94: static char name[60]; ! 95: static int uniqueid = 0; ! 96: do { ! 97: (void) sprintf(name, "%s/xmh_%ld_%d", tempDir, getpid(), uniqueid++); ! 98: } while (FileExists(name)); ! 99: return name; ! 100: } ! 101: ! 102: ! 103: /* Make an array of string pointers big enough to hold n+1 entries. */ ! 104: ! 105: char **MakeArgv(n) ! 106: int n; ! 107: { ! 108: char **result; ! 109: result = ((char **) XtMalloc((unsigned) (n+1) * sizeof(char *))); ! 110: result[n] = 0; ! 111: return result; ! 112: } ! 113: ! 114: ! 115: char **ResizeArgv(argv, n) ! 116: char **argv; ! 117: int n; ! 118: { ! 119: argv = ((char **) XtRealloc((char *) argv, (unsigned) (n+1) * sizeof(char *))); ! 120: argv[n] = 0; ! 121: return argv; ! 122: } ! 123: ! 124: /* Open a file, and punt if we can't. */ ! 125: ! 126: FILEPTR FOpenAndCheck(name, mode) ! 127: char *name, *mode; ! 128: { ! 129: FILEPTR result; ! 130: result = myfopen(name, mode); ! 131: if (result == NULL) ! 132: Punt("Error in FOpenAndCheck"); ! 133: return result; ! 134: } ! 135: ! 136: ! 137: /* Read one line from a file. */ ! 138: ! 139: static char *DoReadLine(fid, lastchar) ! 140: FILEPTR fid; ! 141: char lastchar; ! 142: { ! 143: static char *buf; ! 144: static int maxlength = 0; ! 145: char *ptr, c; ! 146: int length = 0; ! 147: ptr = buf; ! 148: c = ' '; ! 149: while (c != '\n' && !feof(fid)) { ! 150: c = getc(fid); ! 151: if (length++ > maxlength - 5) { ! 152: if (maxlength) ! 153: buf = XtRealloc(buf, (unsigned) (maxlength *= 2)); ! 154: else ! 155: buf = XtMalloc((unsigned) (maxlength = 512)); ! 156: ptr = buf + length - 1; ! 157: } ! 158: *ptr++ = c; ! 159: } ! 160: if (!feof(fid) || length > 1) { ! 161: *ptr = 0; ! 162: *--ptr = lastchar; ! 163: return buf; ! 164: } ! 165: return NULL; ! 166: } ! 167: ! 168: ! 169: char *ReadLine(fid) ! 170: FILEPTR fid; ! 171: { ! 172: return DoReadLine(fid, 0); ! 173: } ! 174: ! 175: ! 176: /* Read a line, and keep the CR at the end. */ ! 177: ! 178: char *ReadLineWithCR(fid) ! 179: FILEPTR fid; ! 180: { ! 181: return DoReadLine(fid, '\n'); ! 182: } ! 183: ! 184: ! 185: ! 186: /* Delete a file, and Punt if it fails. */ ! 187: ! 188: DeleteFileAndCheck(name) ! 189: char *name; ! 190: { ! 191: if (strcmp(name, "/dev/null") != 0 && unlink(name) == -1) ! 192: Punt("DeleteFileAndCheck failed!"); ! 193: } ! 194: ! 195: CopyFileAndCheck(from, to) ! 196: char *from, *to; ! 197: { ! 198: int fromfid, tofid, n; ! 199: char buf[512]; ! 200: fromfid = myopen(from, O_RDONLY, 0666); ! 201: tofid = myopen(to, O_WRONLY | O_TRUNC | O_CREAT, 0666); ! 202: if (fromfid < 0 || tofid < 0) Punt("CopyFileAndCheck failed!"); ! 203: do { ! 204: n = read(fromfid, buf, 512); ! 205: if (n) (void) write(tofid, buf, n); ! 206: } while (n); ! 207: (void) myclose(fromfid); ! 208: (void) myclose(tofid); ! 209: } ! 210: ! 211: ! 212: RenameAndCheck(from, to) ! 213: char *from, *to; ! 214: { ! 215: if (rename(from, to) == -1) { ! 216: if (errno != EXDEV) Punt("RenameAndCheck failed!"); ! 217: CopyFileAndCheck(from, to); ! 218: DeleteFileAndCheck(from); ! 219: } ! 220: } ! 221: ! 222: ! 223: char *MallocACopy(str) ! 224: char *str; ! 225: { ! 226: return strcpy(XtMalloc((unsigned) strlen(str)+1),str); ! 227: } ! 228: ! 229: ! 230: ! 231: char *CreateGeometry(gbits, x, y, width, height) ! 232: int gbits; ! 233: Position x, y; ! 234: Dimension width, height; ! 235: { ! 236: char *result, str1[10], str2[10], str3[10], str4[10]; ! 237: if (gbits & WidthValue) ! 238: (void) sprintf(str1, "=%d", width); ! 239: else ! 240: (void) strcpy(str1, "="); ! 241: if (gbits & HeightValue) ! 242: (void) sprintf(str2, "x%d", height); ! 243: else ! 244: (void) strcpy(str2, "x"); ! 245: if (gbits & XValue) ! 246: (void) sprintf(str3, "%c%d", (gbits & XNegative) ? '-' : '+', abs(x)); ! 247: else ! 248: (void) strcpy(str3, ""); ! 249: if (gbits & YValue) ! 250: (void) sprintf(str4, "%c%d", (gbits & YNegative) ? '-' : '+', abs(y)); ! 251: else ! 252: (void) strcpy(str4, ""); ! 253: result = XtMalloc(22); ! 254: (void) sprintf(result, "%s%s%s%s", str1, str2, str3, str4); ! 255: return result; ! 256: } ! 257: ! 258: ! 259: FileExists(file) ! 260: char *file; ! 261: { ! 262: return (access(file, F_OK) == 0); ! 263: } ! 264: ! 265: LastModifyDate(file) ! 266: char *file; ! 267: { ! 268: struct stat buf; ! 269: if (stat(file, &buf)) return -1; ! 270: return buf.st_mtime; ! 271: } ! 272: ! 273: CurrentDate() ! 274: { ! 275: struct timeval time; ! 276: struct timezone zone; ! 277: (void) gettimeofday(&time, &zone); ! 278: return time.tv_sec; ! 279: } ! 280: ! 281: GetFileLength(file) ! 282: char *file; ! 283: { ! 284: struct stat buf; ! 285: if (stat(file, &buf)) return -1; ! 286: return buf.st_size; ! 287: } ! 288: ! 289: ! 290: ! 291: #ifdef NOTDEF ! 292: SetValues(dpy, window, arglist, argcount) ! 293: Display *dpy; ! 294: Window window; ! 295: ArgList arglist; ! 296: int argcount; ! 297: { ! 298: (void) XtSendMessage(dpy, window, messageSETVALUES, arglist, argcount); ! 299: } ! 300: ! 301: ! 302: GetValues(dpy, window, arglist, argcount) ! 303: Display *dpy; ! 304: Window window; ! 305: ArgList arglist; ! 306: int argcount; ! 307: { ! 308: (void) XtSendMessage(dpy, window, messageGETVALUES, arglist, argcount); ! 309: } ! 310: #endif ! 311: ! 312: ! 313: ChangeLabel(window, str) ! 314: Window window; ! 315: char *str; ! 316: { ! 317: labelarglist[0].value = (XtArgVal)MallocACopy(str); ! 318: XtLabelSetValues(DISPLAY window, labelarglist, XtNumber(labelarglist)); ! 319: } ! 320: ! 321: ! 322: ! 323: ! 324: Window CreateTextSW(scrn, position, name, options) ! 325: Scrn scrn; ! 326: int position; ! 327: char *name; ! 328: int options; ! 329: { ! 330: Window result; ! 331: static Arg arglist[] = { ! 332: {XtNname, NULL}, ! 333: {XtNtextOptions, NULL}, ! 334: {XtNfile, (XtArgVal)"/dev/null"} ! 335: }; ! 336: arglist[0].value = (XtArgVal)name; ! 337: arglist[1].value = (XtArgVal) (scrollVertical | options); ! 338: result = XtTextDiskCreate(DISPLAY scrn->window, ! 339: arglist, XtNumber(arglist)); ! 340: XtVPanedWindowAddPane(DISPLAY scrn->window, ! 341: result, position, 50, 1000, TRUE); ! 342: return result; ! 343: } ! 344: ! 345: ! 346: ! 347: Window CreateTitleBar(scrn, position) ! 348: Scrn scrn; ! 349: int position; ! 350: { ! 351: Window result; ! 352: int width, height; ! 353: static Arg arglist[] = { ! 354: {XtNname, (XtArgVal)"titlebar"}, ! 355: {XtNlabel, NULL}, ! 356: }; ! 357: arglist[1].value = (XtArgVal) Version(); ! 358: result = XtLabelCreate(DISPLAY scrn->window, arglist, XtNumber(arglist)); ! 359: GetWindowSize(result, &width, &height); ! 360: XtVPanedWindowAddPane(DISPLAY scrn->window, result, position, ! 361: height, height, TRUE); ! 362: return result; ! 363: } ! 364: ! 365: ! 366: GetWindowSize(window, width, height) ! 367: Window window; ! 368: int *width, *height; /* RETURN */ ! 369: { ! 370: WindowBox bbox, rbox; ! 371: if (XtMakeGeometryRequest(DISPLAY window, ! 372: XtgeometryGetWindowBox, &bbox, &rbox) == ! 373: XtgeometryYes) { ! 374: *width = rbox.width; ! 375: *height = rbox.height; ! 376: } else { ! 377: #ifdef X11 ! 378: Drawable root; ! 379: int x, y; ! 380: unsigned int borderwidth, depth; ! 381: (void) XGetGeometry(theDisplay, window, &root, &x, &y, ! 382: (unsigned int *)width, (unsigned int *)height, ! 383: &borderwidth, &depth); ! 384: #endif ! 385: #ifdef X10 ! 386: WindowInfo info; ! 387: XQueryWindow(window, &info); ! 388: *width = info.width; ! 389: *height = info.height; ! 390: #endif ! 391: } ! 392: } ! 393: ! 394: ! 395: Feep() ! 396: { ! 397: #ifdef X11 ! 398: XBell(theDisplay, 50); ! 399: #endif ! 400: #ifdef X10 ! 401: XFeep(0); ! 402: #endif ! 403: } ! 404: ! 405: ! 406: ! 407: MsgList CurMsgListOrCurMsg(toc) ! 408: Toc toc; ! 409: { ! 410: MsgList result; ! 411: Msg curmsg; ! 412: result = TocCurMsgList(toc); ! 413: if (result->nummsgs == 0 && (curmsg = TocGetCurMsg(toc))) { ! 414: FreeMsgList(result); ! 415: result = MakeSingleMsgList(curmsg); ! 416: } ! 417: return result; ! 418: } ! 419: ! 420: ! 421: ! 422: Toc SelectedToc(scrn) ! 423: Scrn scrn; ! 424: { ! 425: return TocGetNamed(BBoxNameOfButton(scrn->curfolder)); ! 426: } ! 427: ! 428: ! 429: ! 430: int strncmpIgnoringCase(str1, str2, length) ! 431: char *str1, *str2; ! 432: int length; ! 433: { ! 434: int i, diff; ! 435: for (i=0 ; i<length ; i++, str1++, str2++) { ! 436: diff = ((*str1 >= 'A' && *str1 <= 'Z') ? (*str1 + 'a' - 'A') : *str1) - ! 437: ((*str2 >= 'A' && *str2 <= 'Z') ? (*str2 + 'a' - 'A') : *str2); ! 438: if (diff) return diff; ! 439: } ! 440: return 0; ! 441: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.