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

📄 input.c

📁 一款运行在linux上的象棋游戏。用GTK/GNOME环境下用GLADE开发。
💻 C
字号:
/* GNU Chess 5.0 - input.c - Input thread and related   Copyright (c) 2002 Free Software Foundation, Inc.   GNU Chess is based on the two research programs    Cobalt by Chua Kong-Sian and Gazebo by Stuart Cracraft.   GNU Chess is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2, or (at your option)   any later version.   GNU Chess is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with GNU Chess; see the file COPYING.  If not, write to   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.   Contact Info:      bug-gnu-chess@gnu.org     cracraft@ai.mit.edu, cracraft@stanfordalumni.org, cracraft@earthlink.net     lukas@debian.org*//* * All the pthread stuff should be hidden here, all the * readline things, too. (I.e., all the potentially troublesome * libraries. */#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>#include "common.h"#ifdef HAVE_LIBREADLINE# ifdef HAVE_READLINE_READLINE_H#  include <readline/readline.h>#  include <readline/history.h># elseextern char* readline(char *);extern void add_history(char *);# endif#endif/* Variable used to communicate with the main thread */volatile int input_status = INPUT_NONE;  char inputstr[MAXSTR];/* * The readline getline(), notice that even if we have readline, * it is not used if stdin is not a tty. */#ifdef HAVE_LIBREADLINEvoid getline_readline(char * p){  char *inp;  inp = readline(p);  dbg_printf("getline_readline() called, input is >%s<\n", inp ? inp : "NULL");  if (inp && *inp) {    add_history(inputstr);    strncpy(inputstr, inp, MAXSTR-1);    inputstr[MAXSTR-1] = '\0';  } else {    inputstr[0] = '\0';  }  if (inp) {    free(inp);  }}#endif /* HAVE_LIBREADLINE *//* The generic input routine */void getline_standard(char *p){  if (!(flags & XBOARD)) {    fputs(p, stdout);    fflush(stdout);  }  fgets(inputstr, MAXSTR, stdin);}static pthread_t input_thread;/* Mutex and condition variable for thread communication */static pthread_mutex_t input_mutex = PTHREAD_MUTEX_INITIALIZER;static pthread_cond_t input_cond = PTHREAD_COND_INITIALIZER;static pthread_mutex_t wakeup_mutex = PTHREAD_MUTEX_INITIALIZER;static pthread_cond_t wakeup_cond = PTHREAD_COND_INITIALIZER;/* * Posix threads are used to allow efficent polling for * input when the program is pondering. * * input_status is a boolean to indicate if a command * is being parsed and processed. It is set by * input function, and must be cleared by the thread * that uses the input. * * The main loop may explicitly wait_for_input, or * when pondering will examine the input_status * variable in Iterate. * */void *input_func(void *arg __attribute__((unused)) ){  char prompt[MAXSTR] = "";  while (!(flags & QUIT)) {    if (!(flags & XBOARD)) {      sprintf(prompt,"%s (%d) : ", 	      RealSide ? "Black" : "White", 	      (RealGameCnt+1)/2 + 1 );    }    pthread_mutex_lock(&input_mutex);    getline(prompt);    input_status = INPUT_AVAILABLE;    pthread_cond_signal(&input_cond);    pthread_mutex_unlock(&input_mutex);    pthread_mutex_lock(&wakeup_mutex);    /*     * Posix waits can wake up spuriously     * so we must ensure that we keep waiting     * until we are woken by something that has      * consumed the input     */    while ( input_status == INPUT_AVAILABLE ){     pthread_cond_wait(&wakeup_cond, &wakeup_mutex);    }    pthread_mutex_unlock(&wakeup_mutex);  }  return NULL;}void input_wakeup(void){    pthread_mutex_lock(&input_mutex);  input_status = INPUT_NONE;  pthread_mutex_unlock(&input_mutex);  pthread_mutex_lock(&wakeup_mutex);  pthread_cond_signal(&wakeup_cond);  pthread_mutex_unlock(&wakeup_mutex);}void wait_for_input(void){	// Read without mutex -- whoops  while (input_status == INPUT_NONE) {    pthread_mutex_lock(&input_mutex);    if (input_status == INPUT_NONE)      pthread_cond_wait(&input_cond, &input_mutex);    pthread_mutex_unlock(&input_mutex);  }}void InitInput(void){#ifdef HAVE_LIBREADLINE  if (isatty(STDIN_FILENO)) {    getline = getline_readline;    using_history();  } else {    getline = getline_standard;  }#else  getline = getline_standard;#endif  /* Start input thread */  pthread_create(&input_thread, NULL, input_func, NULL);}void CleanupInput(void){  pthread_join(input_thread, NULL);}

⌨️ 快捷键说明

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