// $Id: Mem_Map_Test.cpp 80826 2008-03-04 14:51:23Z wotte $
// ============================================================================
//
// = LIBRARY
// tests
//
// = FILENAME
// Mem_Map_Test.cpp
//
// = DESCRIPTION
// This test illustrates the use of ACE_Mem_Map to reverse a
// file. The test first creates a dummy file for testing, then
// reverses the file and then reverses it again to get back the
// original file.
//
// = AUTHOR
// Prashant Jain <pjain></pjain>
//
// ============================================================================
#include "test_config.h"
#include "ace/Mem_Map.h"
#include "ace/ACE.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_fcntl.h"
#include "ace/OS_Memory.h"
ACE_RCSID(tests, Mem_Map_Test, "Mem_Map_Test.cpp,v 4.36 2003/11/01 11:15:25 dhinton Exp")
#if !defined (ACE_LACKS_MMAP)
static const char ACE_ALPHABET[] = "abcdefghijklmnopqrstuvwxyz";
static const int LINE_LENGTH = 10;
static const int NUM_LINES = 15;
static void
reverse_file (ACE_HANDLE file_handle,
char *array,
size_t size)
{
int count = 0;
// LynxOS 3.0.0/PowerPC needs the volatile qualifier, with -O2
// optimization enabled and without ACE_HAS_INLINE.
volatile size_t i = size;
--i;
if (array[i] == '\0')
array[i] = '\n';
while (i-- > 0)
{
if (array[i] == '\n')
{
ACE_OS::write (file_handle, array + i + 1, count);
ACE_OS::write (file_handle, ACE_TEXT ("\n"), 1);
count = 0;
}
else
count++;
}
ACE_OS::write (file_handle, array, count+1);
}
static int
create_test_file (ACE_TCHAR *filename, int line_length, int num_lines)
{
char *mybuf = 0;
ACE_NEW_RETURN (mybuf, char[line_length + 1], -1);
const char *c = ACE_ALPHABET;
const char *d = c;
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS // For NTO has to applied to open the file, as Mem_Map can map only shared memory
ACE_Mem_Map mmap_4_open;
mmap_4_open.open (filename, O_RDWR | O_CREAT | O_TRUNC, ACE_DEFAULT_FILE_PERMS);
ACE_HANDLE file_handle = mmap_4_open.handle();
#else
ACE_HANDLE file_handle = ACE_OS::open (filename,
O_RDWR | O_CREAT | O_TRUNC,
ACE_DEFAULT_FILE_PERMS);
#endif
if (file_handle == ACE_INVALID_HANDLE)
{
delete [] mybuf;
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("Open failed for %s\n"),
filename),
-1);
}
for (int j = 0; j for (int i = 0; i if (ACE_OS::write (file_handle, mybuf, line_length) != line_length)
{
delete [] mybuf;
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p (%d) \n"),
ACE_TEXT ("Write to file failed:"),
errno,
filename),
-1);
}
if (ACE_OS::write (file_handle, ACE_TEXT ("\n"), 1) != 1)
{
delete [] mybuf;
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("write to file %s failed\n"),
filename),
-1);
}
}
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS else
ACE_OS::close (file_handle);
#endif
delete [] mybuf;
return 0;
}
#endif /* !ACE_LACKS_MMAP */
int
run_main (int, ACE_TCHAR *[])
{
ACE_START_TEST (ACE_TEXT ("Mem_Map_Test"));
#if !defined (ACE_LACKS_MMAP)
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS mmap on QNX Neutrino/VxWorks can map only shared memory files\n")));
#endif
// = Initialize the temporary variable names
ACE_TCHAR test_file[MAXPATHLEN + 1];
ACE_TCHAR temp_file1[MAXPATHLEN + 1];
ACE_TCHAR temp_file2[MAXPATHLEN + 1];
// Get the temporary directory
// - 18 is for the filenames, ace_mem_map_temp_1 is the longest
if (ACE::get_temp_dir (test_file, MAXPATHLEN - 18) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("Temporary path too long\n")),
-1);
// Copy the temp directory to the other variables
ACE_OS::strcpy (temp_file1, test_file);
ACE_OS::strcpy (temp_file2, test_file);
// Add the filenames to the end
ACE_OS::strcat (test_file,
ACE_TEXT ("ace_mem_map_test"));
ACE_OS::strcat (temp_file1,
ACE_TEXT ("ace_mem_map_temp_1"));
ACE_OS::strcat (temp_file2,
ACE_TEXT ("ace_mem_map_temp_2"));
// First create a test file to work on
if (create_test_file (test_file, LINE_LENGTH, NUM_LINES) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("Create test file failed\n")),
-1);
ACE_Mem_Map mmap;
// First memory map the test file
if (mmap.map (test_file) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%n: %p %s\n%a"),
ACE_TEXT ("mmap"),
test_file),
-1);
// Now create a temporary file for intermediate processing
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS else
ACE_HANDLE temp_file_handle = ACE_OS::open (temp_file1,
O_RDWR | O_TRUNC | O_CREAT,
ACE_DEFAULT_FILE_PERMS);
#endif
if (temp_file_handle == ACE_INVALID_HANDLE)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("Open failed\n")),
-1);
// Reverse the original file and write the output to the temporary
// file.
reverse_file (temp_file_handle,
(char *) mmap.addr (),
mmap.size ());
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS else
ACE_OS::close (temp_file_handle);
#endif
ACE_Mem_Map temp_mmap;
// Now memory map the temporary file
if (temp_mmap.map (temp_file1) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%n: %p %s\n%a"),
ACE_TEXT ("mmap"),
temp_file1),
-1);
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS else
temp_file_handle = ACE_OS::open (temp_file2,
O_RDWR | O_TRUNC | O_CREAT,
ACE_DEFAULT_FILE_PERMS);
#endif
if ( temp_file_handle == ACE_INVALID_HANDLE)
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Open failed\n")), -1);
// Now reverse the temporary file and write everything to the second
// temporary file.
reverse_file (temp_file_handle,
(char *) temp_mmap.addr (),
temp_mmap.size ());
#if defined (__QNXNTO__) || (defined (ACE_VXWORKS) && (ACE_VXWORKS else
ACE_OS::close (temp_file_handle);
#endif
// Memory map the second temporary file
ACE_Mem_Map temp_mmap2;
if (temp_mmap2.map (temp_file2) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%n: %p %s\n%a"),
ACE_TEXT ("mmap"),
temp_file2),
-1);
// Now do a memcmp -- the orig file and the second temporary file
// should be identical.
ACE_ASSERT (ACE_OS::memcmp (temp_mmap2.addr (),
mmap.addr (),
mmap.size ()) == 0);
// Delete the test file
mmap.remove ();
// Delete ACE_TEMP_TEST_FILE
temp_mmap.remove ();
// Delete ACE_TEMP_TEST_FILE_2
temp_mmap2.remove ();
#else /* !ACE_LACKS_MMAP */
ACE_ERROR ((LM_INFO,
ACE_TEXT ("mmap is not supported on this platform\n")));
#endif /* !ACE_LACKS_MMAP */
ACE_END_TEST;
return 0;
}
分享到:
相关推荐
### 使用TexStudio中的语法高亮功能详解 #### 一、前言 在现代文本编辑器领域,TexStudio作为一款颇受欢迎的LaTeX编辑器,以其强大的功能和良好的用户体验获得了广泛的应用。特别是在学术界和科研领域,它凭借其...
在Go语言的开发环境中,Vim可以通过安装特定的插件来增强对Go语言的支持,其中包括语法高亮功能。"vim go 语法高亮"这个主题正是关于如何在Vim中实现Go语言代码的色彩突出显示,提高代码的可读性和编辑体验。 Go...
适合测试语法高亮主题。 猛击 #! /bin/bash # ##### BEGIN CONFIG ACCEPTED_HOSTS= " /root/.hag_accepted.conf " BE_VERBOSE=false # ##### END CONFIG if [ " $UID " -ne 0 ] then echo " Superuser rights is ...
5. **测试和调整**:发布一个带有代码的测试帖子,检查语法高亮效果是否正常。如果不满意,可以调整CSS样式或JavaScript配置以达到理想效果。 语法高亮不仅可以提升用户的阅读体验,还能够提高论坛的技术氛围。对于...
本插件是为WPS 2009文字处理软件开发的语法高亮插件,主要功能有: 1.语法高亮,目前支持的语言有C++/C#/JAVA,将陆续支持其它语言 2.自定义高亮色彩,令您插入到文档的代码显示最具个性 3.可选可调的背景着色,突出...
**jQuery语法高亮插件详解** 在Web开发中,为了让代码更具可读性和美观性,开发者通常会使用语法高亮工具。"jQuery语法高亮插件"是一个专门为jQuery代码提供色彩鲜明、易于阅读的显示效果的插件。该插件能够帮助...
它支持多种编程语言,并且允许用户自定义语言的语法高亮,以提升代码的可读性。然而,Notepad++默认并未内置Scala语言的语法高亮支持,这可能会对Scala开发者造成一些不便。本文将详细介绍如何在Notepad++中设置...
在编程领域,语法高亮是提高代码可读性和编辑体验的重要功能。本项目是一个使用C语言编写的,针对C/C++/Java关键字进行语法高亮分析的工具。它旨在为开发者提供与Visual Studio 2008和Eclipse等专业集成开发环境...
6. **测试效果**:现在,重启Zsh或打开一个新的终端窗口,输入命令,你应该能看到语法高亮效果。不同的命令元素会用不同的颜色显示,如关键字、变量、函数等。 7. **优化设置**:`zsh-syntax-highlighting`插件提供...
开发者可以在这个页面上加载编辑器,查看其工作状态,测试代码补全和语法高亮效果是否符合预期。 在实际应用中,这样的MySQL在线编辑器插件可以帮助开发者轻松完成以下任务: - 实时编写和执行SQL查询,查看结果。...
Notepad++ 是一款广受欢迎的免费源代码编辑器,支持多种编程语言,并且具有语法高亮、代码折叠和宏等功能。然而,Notepad++ 默认并不支持nesC的语法高亮。因此,为了在Notepad++中获得nesC的友好开发环境,我们需要...
### 让Source Insight支持AT&T汇编语法高亮 #### 背景介绍 Source Insight是一款功能强大的编辑器,能够帮助开发者高效地进行代码编写、分析及管理等工作。它不仅支持多种编程语言,还能通过自定义配置来扩展对特定...
这款插件的主要功能是提供代码提示和语法高亮,极大地提升了开发者在编写小程序代码时的效率和舒适度。 代码提示功能是开发工具中的关键特性,它能自动补全代码,减少手动输入,避免拼写错误。对于微信小程序来说,...
在VS中,有四类插件特别受欢迎:JS语法检查插件、高亮显示插件、折叠插件以及单元测试插件。下面将详细介绍这些插件的功能、作用以及如何使用它们。 1. **JS语法检查插件**: 这类插件的主要任务是实时检查...
源码的结构通常包括主程序文件、配置文件、测试用例等,你可以借此了解Python的模块化设计、命令行参数处理、数据库接口使用以及如何实现命令行界面的自动完成和语法高亮。 总的来说,litecli是Python开发中的一个...
在编程世界中,语法高亮是一项非常重要的功能,它能够帮助程序员更好地阅读和理解代码,减少错误,并提高编码效率。WPS,全称是“Writing PostScript”,在这里指的是金山公司的办公软件套件,包括文字处理、电子...
【标题】:“基于WPF的语法高亮控件”是一个专为Windows Presentation Foundation(WPF)框架设计的组件,用于在用户界面中显示代码时实现语法的色彩突出显示。这个控件不仅美观,而且功能强大,能提升开发者的用户...
本文件是一个使用Minted宏包实现MATLAB语法高亮的测试案例,编译环境是MikTeX 2.9在Windows 7操作系统下,通过XeLaTeX编译器来完成。下面我们将详细介绍这个过程以及相关的知识点。 首先,MikTeX是一个完整的开源...
在IT领域,编辑器是开发人员日常工作中不可或缺的工具,其中“显示行号的语法高亮编辑器”尤其受到欢迎。这种编辑器不仅提供基本的文本编辑功能,还能帮助程序员更高效地阅读和理解代码,因为它们能以不同的颜色和...
《EditPlus中的Python语法高亮与编辑调试环境详解》 在编程世界中,拥有一个功能强大的文本编辑器对于提升开发效率至关重要。EditPlus是一款广泛使用的轻量级文本编辑器,它支持多种编程语言,并允许用户自定义语法...