⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc_hw.c

📁 mesa-6.5-minigui源码
💻 C
字号:
/* * PC/HW routine collection v1.3 for DOS/DJGPP * *  Copyright (C) 2002 - Daniel Borca *  Email : dborca@yahoo.com *  Web   : http://www.geocities.com/dborca */#include <dpmi.h>#include <fcntl.h>#include <sys/stat.h> /* for mode definitions */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "pc_hw.h"/* * atexit */#define MAX_ATEXIT 32static volatile int atexitcnt;static VFUNC atexittbl[MAX_ATEXIT];static void __attribute__((destructor))doexit (void){   while (atexitcnt) atexittbl[--atexitcnt]();}intpc_clexit (VFUNC f){   int i;   for (i = 0; i < atexitcnt; i++) {      if (atexittbl[i] == f) {         for (atexitcnt--; i < atexitcnt; i++) atexittbl[i] = atexittbl[i+1];         atexittbl[i] = 0;         return 0;      }   }   return -1;}intpc_atexit (VFUNC f){   pc_clexit(f);   if (atexitcnt < MAX_ATEXIT) {      atexittbl[atexitcnt++] = f;      return 0;   }   return -1;}/* * locked memory allocation */void *pc_malloc (size_t size){   void *p = malloc(size);   if (p) {      if (_go32_dpmi_lock_data(p, size)) {         free(p);         return NULL;      }   }   return p;}/* * standard redirection */static char outname[L_tmpnam];static int h_out, h_outbak;static char errname[L_tmpnam];static int h_err, h_errbak;intpc_open_stdout (void){   tmpnam(outname);   if ((h_out=open(outname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {      h_outbak = dup(STDOUT_FILENO);      fflush(stdout);      dup2(h_out, STDOUT_FILENO);   }   return h_out;}voidpc_close_stdout (void){   FILE *f;   char *line = alloca(512);   if (h_out > 0) {      dup2(h_outbak, STDOUT_FILENO);      close(h_out);      close(h_outbak);      f = fopen(outname, "rt");      while (fgets(line, 512, f)) {         fputs(line, stdout);      }      fclose(f);      remove(outname);   }}intpc_open_stderr (void){   tmpnam(errname);   if ((h_err=open(errname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {      h_errbak = dup(STDERR_FILENO);      fflush(stderr);      dup2(h_err, STDERR_FILENO);   }   return h_err;}voidpc_close_stderr (void){   FILE *f;   char *line = alloca(512);   if (h_err > 0) {      dup2(h_errbak, STDERR_FILENO);      close(h_err);      close(h_errbak);      f = fopen(errname, "rt");      while (fgets(line, 512, f)) {         fputs(line, stderr);      }      fclose(f);      remove(errname);   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -