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

📄 main_ros.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* * main_ros.c * * Released under GPL * * Copyright (C) 1998-2005 A.J. van Os * * This program 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 * of the License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. * * Description: * The main program of !Antiword (RISC OS version) */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "DeskLib:Dialog2.h"#include "DeskLib:Error.h"#include "DeskLib:Event.h"#include "DeskLib:EventMsg.h"#include "DeskLib:Handler.h"#include "DeskLib:Menu.h"#include "DeskLib:Resource.h"#include "DeskLib:Screen.h"#include "DeskLib:Template.h"#include "DeskLib:Window.h"#if defined(__GNUC__)#include "flexlib:flex.h"#endif /* __GNUC__ */#include "version.h"#include "antiword.h"/* The name of this program */static char	*szTask = "!Antiword";/* The window handle of the choices window */static window_handle	tChoicesWindow = 0;/* Dummy diagram with the iconbar menu pointer */static diagram_type	tDummyDiagram;/* Program information Box */static dialog2_block	*pInfoBox = NULL;/* Info box fields */#define PURPOSE_INFO_FIELD	2#define AUTHOR_INFO_FIELD	3#define VERSION_INFO_FIELD	4#define STATUS_INFO_FIELD	5/* Iconbar menu fields */#define ICONBAR_INFO_FIELD	0#define ICONBAR_CHOICES_FIELD	1#define ICONBAR_QUIT_FIELD	2/* * bBarInfo - Show iconbar information */static BOOLbBarInfo(event_pollblock *pEvent, void *pvReference){	diagram_type	*pDiag;	TRACE_MSG("bBarInfo");	fail(pEvent == NULL);	fail(pEvent->type != event_SEND);	fail(pEvent->data.message.header.action != message_MENUWARN);	fail(pvReference == NULL);	pDiag = (diagram_type *)pvReference;	if (menu_currentopen != pDiag->pSaveMenu ||	    pEvent->data.message.data.menuwarn.selection[0] != ICONBAR_INFO_FIELD) {		return FALSE;	}	Dialog2_OpenDialogMenuLeaf(pEvent, pInfoBox);	return TRUE;} /* end of bBarInfo *//* * vBarInfoSetText - Set the iconbar infobox text */static voidvBarInfoSetText(dialog2_block *pBox){	TRACE_MSG("vBarInfoSetText");	fail(pBox == NULL);	fail(pBox != pInfoBox);	Icon_SetText(pBox->window, PURPOSE_INFO_FIELD, PURPOSESTRING);	Icon_SetText(pBox->window, AUTHOR_INFO_FIELD, AUTHORSTRING);	Icon_SetText(pBox->window, VERSION_INFO_FIELD, VERSIONSTRING);	Icon_SetText(pBox->window, STATUS_INFO_FIELD, STATUSSTRING);} /* end of vBarInfoSetText *//* * bMouseButtonClick - respond to mouse button click */static BOOLbMouseButtonClick(event_pollblock *pEvent, void *pvReference){	diagram_type	*pDiag;	menu_ptr	pMenu;	int		iPosY;	TRACE_MSG("bMouseButtonClick");	fail(pEvent == NULL);	fail(pEvent->type != event_CLICK);	fail(pvReference == NULL);	pDiag = (diagram_type *)pvReference;	if (pEvent->data.mouse.button.data.menu) {		pMenu = pDiag->pSaveMenu;		iPosY = (pMenu == tDummyDiagram.pSaveMenu) ?					-1 : pEvent->data.mouse.pos.y;		Menu_Show(pMenu, pEvent->data.mouse.pos.x, iPosY);		return TRUE;	}	if (pEvent->data.mouse.window == pDiag->tMainWindow &&	    pEvent->data.mouse.icon == -1) {		vMainButtonClick(&pEvent->data.mouse);		return TRUE;	}	if (pEvent->data.mouse.window == pDiag->tScaleWindow &&	    pEvent->data.mouse.icon >= 0) {		vScaleButtonClick(&pEvent->data.mouse, pDiag);		return TRUE;	}	return FALSE;} /* end of bMouseButtonClick *//* * bAutoRedrawWindow - the redraw is handled by the WIMP */static BOOLbAutoRedrawWindow(event_pollblock *pEvent, void *pvReference){	return TRUE;} /* end of bAutoRedrawWindow */static BOOLbSaveSelect(event_pollblock *pEvent, void *pvReference){	TRACE_MSG("bSaveSelect");	fail(pEvent == NULL);	fail(pEvent->type != event_MENU);	fail(pvReference == NULL);	DBG_DEC(pEvent->data.selection[0]);	switch (pEvent->data.selection[0]) {	case SAVEMENU_SCALEVIEW:		return bScaleOpenAction(pEvent, pvReference);	case SAVEMENU_SAVEDRAW:		return bSaveDrawfile(pEvent, pvReference);	case SAVEMENU_SAVETEXT:		return bSaveTextfile(pEvent, pvReference);	default:		DBG_DEC(pEvent->data.selection[0]);		return FALSE;	}} /* end of bSaveSelect *//* * Create the window for the text from the given file */static diagram_type *pCreateTextWindow(const char *szFilename){	diagram_type	*pDiag;	TRACE_MSG("pCreateTextWindow");	fail(szFilename == NULL || szFilename[0] == '\0');	/* Create the diagram */	pDiag = pCreateDiagram(szTask+1, szFilename);	if (pDiag == NULL) {		werr(0, "Sorry, no new diagram object");		return NULL;	}	/* Prepare a save menu for this diagram */	pDiag->pSaveMenu = Menu_New(szTask+1,		">Scale view,"		">Save (Drawfile)   F3,"		">Save (Text only) \213F3");	if (pDiag->pSaveMenu == NULL) {		werr(1, "Sorry, no Savemenu object");	}	Menu_Warn(pDiag->pSaveMenu, SAVEMENU_SCALEVIEW,					TRUE, bScaleOpenAction, pDiag);	Menu_Warn(pDiag->pSaveMenu, SAVEMENU_SAVEDRAW,					TRUE, bSaveDrawfile, pDiag);	Menu_Warn(pDiag->pSaveMenu, SAVEMENU_SAVETEXT,					TRUE, bSaveTextfile, pDiag);	/* Claim events for the main window */        Event_Claim(event_REDRAW, pDiag->tMainWindow, icon_ANY,                                        bRedrawMainWindow, pDiag);        Event_Claim(event_CLOSE, pDiag->tMainWindow, icon_ANY,                                        bDestroyDiagram, pDiag);        Event_Claim(event_CLICK, pDiag->tMainWindow, icon_ANY,                                        bMouseButtonClick, pDiag);        Event_Claim(event_KEY, pDiag->tMainWindow, icon_ANY,                                        bMainKeyPressed, pDiag);	/* Claim events for the scale window */	Event_Claim(event_REDRAW, pDiag->tScaleWindow, icon_ANY,					bAutoRedrawWindow, NULL);        Event_Claim(event_CLICK, pDiag->tScaleWindow, icon_ANY,                                        bMouseButtonClick, pDiag);        Event_Claim(event_KEY, pDiag->tScaleWindow, icon_ANY,                                        bScaleKeyPressed, pDiag);	/* Set the window title */	vSetTitle(pDiag);	return pDiag;} /* end of pCreateTextWindow *//* * vProcessFile - process one file */static voidvProcessFile(const char *szFilename, int iFiletype){	options_type	tOptions;	FILE		*pFile;	diagram_type	*pDiag;	long		lFilesize;	int		iWordVersion;	TRACE_MSG("vProcessFile");	fail(szFilename == NULL || szFilename[0] == '\0');	DBG_MSG(szFilename);	pFile = fopen(szFilename, "rb");	if (pFile == NULL) {		werr(0, "I can't open '%s' for reading", szFilename);		return;	}	lFilesize = lGetFilesize(szFilename);	if (lFilesize < 0) {		(void)fclose(pFile);		werr(0, "I can't get the size of '%s'", szFilename);		return;	}	iWordVersion = iGuessVersionNumber(pFile, lFilesize);	if (iWordVersion < 0 || iWordVersion == 3) {		if (bIsRtfFile(pFile)) {			werr(0, "%s is not a Word Document."				" It is probably a Rich Text Format file",				szFilename);		} if (bIsWordPerfectFile(pFile)) {			werr(0, "%s is not a Word Document."				" It is probably a Word Perfect file",				szFilename);		} else {			werr(0, "%s is not a Word Document.", szFilename);		}		(void)fclose(pFile);		return;	}	/* Reset any reading done during file-testing */	rewind(pFile);	if (iFiletype != FILETYPE_MSWORD) {		vGetOptions(&tOptions);		if (tOptions.bAutofiletypeAllowed) {			vSetFiletype(szFilename, FILETYPE_MSWORD);		}	}	pDiag = pCreateTextWindow(szFilename);	if (pDiag == NULL) {		(void)fclose(pFile);		return;	}	(void)bWordDecryptor(pFile, lFilesize, pDiag);	Error_CheckFatal(Drawfile_VerifyDiagram(&pDiag->tInfo));	vShowDiagram(pDiag);	TRACE_MSG("After vShowDiagram");	TRACE_MSG("before debug print");	DBG_HEX(pFile);	TRACE_MSG("before fclose");	(void)fclose(pFile);	TRACE_MSG("after fclose");} /* end of vProcessFile *//* * vSendAck - send an acknowledge */static voidvSendAck(event_pollblock *pEvent){	message_block	tMessage;	TRACE_MSG("vSendAck");	fail(pEvent == NULL);	fail(pEvent->type != event_SEND && pEvent->type != event_SENDWANTACK);	fail(pEvent->data.message.header.action != message_DATALOAD &&		pEvent->data.message.header.action != message_DATAOPEN);	tMessage.header.action = message_DATALOADACK;	tMessage.header.size = sizeof(tMessage);	tMessage.header.yourref = pEvent->data.message.header.myref;	Error_CheckFatal(Wimp_SendMessage(event_SEND, &tMessage,				pEvent->data.message.header.sender, 0));} /* end of vSendAck */static BOOLbEventMsgHandler(event_pollblock *pEvent, void *pvReference){	TRACE_MSG("bEventMsgHandler");	fail(pEvent == NULL);	switch (pEvent->type) {	case event_SEND:	case event_SENDWANTACK:		switch (pEvent->data.message.header.action) {		case message_CLOSEDOWN:			exit(EXIT_SUCCESS);			break;		case message_DATALOAD:		case message_DATAOPEN:			vProcessFile(				pEvent->data.message.data.dataload.filename,				pEvent->data.message.data.dataload.filetype);			vSendAck(pEvent);			break;		default:			DBG_DEC(pEvent->data.message.header.action);			break;		}		return TRUE;	default:		DBG_DEC(pEvent->type);		return FALSE;	}} /* end of bEventMsgHandler *//* * bMenuSelect - select from the iconbar menu */static BOOLbMenuSelect(event_pollblock *pEvent, void *pvReference){	TRACE_MSG("bMenuSelect");	fail(pEvent == NULL);	fail(pEvent->type != event_MENU);	DBG_DEC(pEvent->data.selection[0]);	switch (pEvent->data.selection[0]) {	case ICONBAR_INFO_FIELD:		return bBarInfo(pEvent, pvReference);	case ICONBAR_CHOICES_FIELD:		vChoicesOpenAction(tChoicesWindow);		Window_BringToFront(tChoicesWindow);		break;	case ICONBAR_QUIT_FIELD:		TRACE_MSG("before exit");		exit(EXIT_SUCCESS);		break;	default:		DBG_DEC(pEvent->data.selection[0]);		break;	}	return TRUE;} /* end of bMenuSelect *//* * bMenuClick - respond to an menu click */static BOOLbMenuClick(event_pollblock *pEvent, void *pvReference){	TRACE_MSG("bMenuClick");	fail(pEvent == NULL);	fail(pEvent->type != event_MENU);	if (menu_currentopen == tDummyDiagram.pSaveMenu) {		return bMenuSelect(pEvent, pvReference);	} else if (pvReference == NULL) {		return FALSE;	}	return bSaveSelect(pEvent, pvReference);} /* end of bMenuClick */static voidvTemplates(void){	TRACE_MSG("vTemplates");	Template_Initialise();	Template_LoadFile("Templates");	tChoicesWindow = Window_Create("Choices", template_TITLEMIN);	if (tChoicesWindow == 0) {		werr(1, "I can't find the 'Choices' template");	}	/* Claim events for the choices window */	Event_Claim(event_REDRAW, tChoicesWindow, icon_ANY,					bAutoRedrawWindow, NULL);	Event_Claim(event_CLICK, tChoicesWindow, icon_ANY,					bChoicesMouseClick, NULL);	Event_Claim(event_KEY, tChoicesWindow, icon_ANY,					bChoicesKeyPressed, NULL);} /* end of vTemplates */static voidvInitialise(void){	int	aiMessages[] = {0};	icon_handle	tBarIcon;	TRACE_MSG("vInitialise");	Resource_Initialise(szTask+1);	Event_Initialise3(szTask+1, 310, aiMessages);	EventMsg_Initialise();	Screen_CacheModeInfo();#if defined(__GNUC__)	flex_init(szTask+1, 0, 0);	flex_set_budge(1);#endif /* __GNUC__ */	vTemplates();	/* Prepare iconbar menu */	tDummyDiagram.tInfo.data = NULL;	tDummyDiagram.tInfo.length = 0;	tDummyDiagram.pSaveMenu = Menu_New(szTask+1, ">Info,Choices...,Quit");	if (tDummyDiagram.pSaveMenu == NULL) {		werr(1, "Sorry, no Barmenu object");	}	pInfoBox = Dialog2_CreateDialogBlock("ProgInfo", -1, -1,					vBarInfoSetText, NULL, NULL);	if (pInfoBox == NULL) {		werr(1, "Sorry, no Infobox object");	}	Menu_Warn(tDummyDiagram.pSaveMenu, ICONBAR_INFO_FIELD,					TRUE, bBarInfo, &tDummyDiagram);	/* Create an icon on the icon bar */	tBarIcon = Icon_BarIcon(szTask, iconbar_RIGHT);	Event_Claim(event_CLICK, window_ICONBAR, tBarIcon,					bMouseButtonClick, &tDummyDiagram);	/* Generic claims */	Event_Claim(event_OPEN, window_ANY, icon_ANY,					Handler_OpenWindow, NULL);	Event_Claim(event_CLOSE, window_ANY, icon_ANY,					Handler_CloseWindow, NULL);	Event_Claim(event_MENU, window_ANY, icon_ANY,					bMenuClick, NULL);	EventMsg_Claim(message_DATALOAD, window_ICONBAR,					bEventMsgHandler, NULL);	EventMsg_Claim(message_MODECHANGE, window_ANY,					Handler_ModeChange, NULL);} /* end of vInitialise */intmain(int argc, char **argv){	int	iFirst, iFiletype;	TRACE_MSG("main");	vInitialise();	iFirst = iReadOptions(argc, argv);	if (iFirst != 1) {		return EXIT_FAILURE;	}	if (argc > 1) {		iFiletype = iGetFiletype(argv[1]);		if (iFiletype < 0) {			return EXIT_FAILURE;		}		vProcessFile(argv[1], iFiletype);		TRACE_MSG("main after vProcessFile");	}	for (;;) {		Event_Poll();	}} /* end of main */

⌨️ 快捷键说明

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