gregames 01/06/07 14:38:14
Added: apr2_0intro/TstAprRoutines aprfile.cpp aprmemory.cpp
aprmisc.cpp aprsocket.cpp aprthreads.cpp ReadMe.txt
StdAfx.cpp StdAfx.h TstAprRoutines.cpp
TstAprRoutines.dsp TstAprRoutines.plg
Log:
add sample APR test routines
Submitted by: Christian Gross
Reviewed by: Greg Ames
Revision Changes Path
1.1 apr-site/apr2_0intro/TstAprRoutines/aprfile.cpp
Index: aprfile.cpp
===================================================================
#include "stdafx.h"
#include "apr_file_io.h"
#include "apr_general.h"
#include "apr_strings.h"
static apr_pool_t *context;
void TstDirectory() {
apr_dir_t *dir;
apr_file_t *file = NULL;
apr_size_t bytes;
apr_finfo_t dirent;
printf( "Opening the root directory\n");
if (apr_dir_open(&dir, "c:\\", context) != APR_SUCCESS) {
printf( "Could not open the root directory\n");
exit( -1);
}
printf( "Reading the directory\n");
if ((apr_dir_read( &dirent, APR_FINFO_DIRENT, dir)) != APR_SUCCESS) {
printf( "Could not read the directory\n");
exit( -1);
}
do {
printf( "Entry is %s\n", dirent.name);
} while (apr_dir_read( &dirent,
APR_FINFO_DIRENT | APR_FINFO_TYPE | APR_FINFO_SIZE |
APR_FINFO_MTIME, dir) == APR_SUCCESS);
return;
}
void TstReadWriteFile() {
char *buffer;
char ch;
int status;
apr_file_t *fd;
apr_status_t rv;
apr_finfo_t finfo;
buffer = apr_pstrdup(context, "Hello world");
// Open the file for writing
printf( "Writing to a file \n");
apr_file_open( &fd, "c:\\filetest.txt", APR_WRITE | APR_CREATE, -1,
context);
int length = strlen(buffer);
if( apr_file_write( fd, buffer, &length) != APR_SUCCESS) {
printf( "Yikes could not write\n");
exit( -1);
}
else {
printf( "Data (%s) was written to the file\n", buffer);
}
apr_file_close( fd);
// Getting some information about the file
rv = apr_stat(&finfo, "c:\\filetest.txt", APR_FINFO_NORM, context);
if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) {
printf( "Could not get the file information\n");
exit(1);
}
printf( "File size %ld\n", finfo.size);
// Open the file for reading
printf( "Reading from the file\n");
status = apr_file_open( &fd, "c:\\filetest.txt", APR_READ, -1, context);
while (!status) {
status = apr_file_getc(&ch, fd);
if (status == APR_EOF ) {
printf( "\nAt the end of the file read\n");
}
else if (status == APR_SUCCESS) {
printf( "%c", ch);
}
}
apr_file_close( fd);
return;
}
void APRFiles() {
// Create the pool context
if (apr_pool_create(&context, NULL) != APR_SUCCESS) {
fprintf(stderr, "Couldn't allocate context.");
exit(-1);
}
TstReadWriteFile();
TstDirectory();
apr_pool_destroy( context);
return;
}
1.1 apr-site/apr2_0intro/TstAprRoutines/aprmemory.cpp
Index: aprmemory.cpp
===================================================================
#include "stdafx.h"
#include "apr_strings.h"
#include "apr_pools.h"
static apr_pool_t *context;
static apr_pool_t *subMemoryPool, *subSubMemoryPool;
static apr_status_t StringClear(void *data)
{
// This function is called when apr_pool_destroy is called
printf( "The data to manipulate is (%s)\n", (char *)data);
return APR_SUCCESS;
}
void TstSubDataSetting() {
char *buffer;
char *retBuffer;
if(( apr_pool_create( &subMemoryPool, context)) != APR_SUCCESS) {
printf( "Could not create memory sub-pool\n");
exit( -1);
}
buffer = apr_pstrdup(subMemoryPool, "Hello World");
// Create a buffer reference that corresponds to a specific index
apr_pool_userdata_set( buffer, "TEST", StringClear, subMemoryPool);
apr_pool_userdata_get((void **)&retBuffer, "TEST", subMemoryPool);
apr_pool_destroy( subMemoryPool);
}
void TstSubStringAllocation() {
if(( apr_pool_create( &subMemoryPool, context)) != APR_SUCCESS) {
printf( "Could not create memory sub-pool\n");
exit( -1);
}
// Example routines to show how to manipulate strings
char *buffer;
char *newBuffer;
buffer = apr_pstrdup( subMemoryPool, "Hello world");
newBuffer = apr_pstrcat( subMemoryPool, buffer, " and yet more data",
NULL);
apr_pool_destroy( subMemoryPool);
return;
}
void TstSubMemoryAllocation() {
// This function calls the above function, but also copies
// the parent properties, which is context, this calls the function
// apr_pool_sub_make and sets the parent attributes as default
if(( apr_pool_create( &subMemoryPool, context)) != APR_SUCCESS) {
printf( "Could not create memory sub-pool\n");
exit( -1);
}
// Lets start by allocating memory
char *buffer;
// QUESTION... Is this thread safe???? No lock on block splitting
// Flag ALLOC_USE_MALLOC uses malloc which would be thread safe
if(( buffer = (char *)apr_palloc( subMemoryPool, 100)) == NULL) {
printf( "Could not allocate memory\n");
exit( -1);
}
strcpy( buffer, "Hello world");
char *buffer2;
// Lets play with the pool memory, by first "clearing" the pool
apr_pool_clear( subMemoryPool);
if(( buffer2 = (char *)apr_palloc( subMemoryPool, 100)) == NULL) {
printf( "Could not allocate memory\n");
exit( -1);
}
if( buffer == buffer2) {
printf( "wow they match (but we expected this)\n");
}
// Now lets actually delete the pool memory, note that the above
// function is called, but the memory is actually yanked
apr_pool_destroy( subMemoryPool);
// *********************************************************************
// WARNING by default this will work as APR is installed
// Open up aprpools.h and uncomment the flags ALLOC_DEBUG and
APR_POOL_DEBUG
// Then the following function call will properly fail
//if(( buffer2 = (char *)apr_palloc( subMemoryPool, 100)) == NULL) {
// printf( "Could not allocate memory\n");
// exit( -1);
//}
// *********************************************************************
if(( apr_pool_create( &subMemoryPool, context)) != APR_SUCCESS) {
printf( "Could not create memory sub-pool\n");
exit( -1);
}
// *********************************************************************
apr_pool_clear( context);
// The next function only works if APR_POOL_DEBUG is enabled
// The next set of functions do not work because apr_pool_clear actually
// destroys the sub pools
//if( apr_pool_is_ancestor( context, subMemoryPool) != false) {
// printf( "Yes the pool have a parent child relationship\n");
//}
// Now lets allocate from the sub pool
//if(( buffer = (char *)apr_palloc( subMemoryPool, 100)) == NULL) {
// printf( "Could not allocate memory\n");
// exit( -1);
//}
// *********************************************************************
}
void TstSimpleMemoryAllocation() {
char *buffer;
if(( buffer = (char *)apr_palloc( context, 100)) == NULL) {
printf( "Could not allocate memory\n");
exit( -1);
}
strcpy( buffer, "Hello world");
}
void APRMemory() {
// Create the pool context
if (apr_pool_create(&context, NULL) != APR_SUCCESS) {
printf( "Could not allocate context\n");
exit( -1);
}
TstSimpleMemoryAllocation();
TstSubMemoryAllocation();
TstSubStringAllocation();
TstSubDataSetting();
// Clear the pool
apr_pool_destroy( context);
return;
}
1.1 apr-site/apr2_0intro/TstAprRoutines/aprmisc.cpp
Index: aprmisc.cpp
===================================================================
#include "stdafx.h"
#include "apr_general.h"
#include "apr_strings.h"
#include "apr_thread_proc.h"
#include "apr_dso.h"
#include "apr_errno.h"
static apr_pool_t *context;
#define LIB_NAME ""
#define FILE_NAME
"C:\\projects\\ApacheAPR\\TstApr\\SampleDLL\\Debug\\sampledll.dll"
typedef int (*SampleFunc)(void);
void TstDSO() {
apr_dso_handle_t *h = NULL;
apr_dso_handle_sym_t func = NULL;
apr_status_t status;
SampleFunc function;
int retval;
char filename[256];
printf( "Loading the DSO\n");
if ((status = apr_dso_load(&h, FILE_NAME, context)) != APR_SUCCESS){
char my_error[256];
apr_strerror(status, my_error, sizeof(my_error));
printf( "%s!\n", my_error);
exit (-1);
}
if ((status = apr_dso_sym(&func, h, "fnSampleDLL")) != APR_SUCCESS) {
char my_error[256];
apr_dso_error(h, my_error, sizeof(my_error));
printf( "%s\n", my_error);
exit (-1);
}
function = (SampleFunc)func;
retval = (*function)();
if (apr_dso_unload(h) != APR_SUCCESS) {
printf( "Failed unload!\n");
exit (-1);
}
}
void APRMisc() {
// Create the pool context
if (apr_pool_create(&context, NULL) != APR_SUCCESS) {
fprintf(stderr, "Couldn't allocate context.");
exit(-1);
}
//TstDSO();
apr_pool_destroy( context);
return;
}
1.1 apr-site/apr2_0intro/TstAprRoutines/aprsocket.cpp
Index: aprsocket.cpp
===================================================================
#include "stdafx.h"
#include "apr_general.h"
#include "apr_strings.h"
#include "apr_thread_proc.h"
static apr_pool_t *context;
void APRSocket() {
// Create the pool context
if (apr_pool_create(&context, NULL) != APR_SUCCESS) {
fprintf(stderr, "Couldn't allocate context.");
exit(-1);
}
apr_pool_destroy( context);
return;
}
1.1 apr-site/apr2_0intro/TstAprRoutines/aprthreads.cpp
Index: aprthreads.cpp
===================================================================
#include "stdafx.h"
#include "apr_general.h"
#include "apr_strings.h"
#include "apr_thread_proc.h"
#include "apr_lock.h"
static apr_pool_t *context;
static apr_lock_t *lock;
static long counter = 25000;
void DeleteData( void *data) {
printf( "Initial Count is %ld\n", *((long *)data));
return;
}
void * APR_THREAD_FUNC ExThreadFunc1( void *data)
{
long *count;
apr_threadkey_t *threadData;
long initialCount = *((long *)data);
if( apr_threadkey_private_create( &threadData, DeleteData, context) !=
APR_SUCCESS) {
printf( "Could not create Private Data area");
exit( -1);
}
apr_threadkey_private_set( &initialCount, threadData);
if( apr_threadkey_private_get( (void **)&count, threadData) !=
APR_SUCCESS) {
printf( "Oops an error\n");
exit( -1);
}
int i;
for (i = 0; i < *count; i++) {
apr_lock_acquire(lock);
counter ++;
apr_lock_release(lock);
}
return NULL;
}
void * APR_THREAD_FUNC ExThreadFunc2( void *data)
{
while( counter > 0) {
apr_lock_acquire( lock);
counter --;
apr_lock_release( lock);
}
return NULL;
}
void TstThreadWithLock() {
apr_status_t status;
apr_thread_t *thread1;
apr_thread_t *thread2;
long initialCount = 1000;
status = apr_lock_create( &lock, APR_MUTEX, APR_INTRAPROCESS, "my.lock",
context);
if( apr_thread_create( &thread1, NULL, ExThreadFunc1, &initialCount,
context) != APR_SUCCESS) {
printf( "Could not create the thread\n");
exit( -1);
}
if( apr_thread_create( &thread2, NULL, ExThreadFunc2, NULL, context) !=
NULL) {
printf( "Could not create the thread\n");
exit( -1);
}
apr_thread_join( &status, thread1);
apr_thread_join( &status, thread2);
}
void * APR_THREAD_FUNC ExThreadFunc( void *data)
{
printf( "Hello world");
// Question: Does this really do anything
return NULL;
}
void TstSimpleThread() {
apr_thread_t *thread;
if( apr_thread_create(&thread, NULL, ExThreadFunc, NULL, context) !=
NULL) {
printf( "Could not create the thread\n");
exit( -1);
}
apr_status_t status;
apr_thread_join( &status, thread);
return;
}
void APRThreads() {
// Create the pool context
if (apr_pool_create(&context, NULL) != APR_SUCCESS) {
fprintf(stderr, "Couldn't allocate context.");
exit(-1);
}
TstSimpleThread();
TstThreadWithLock();
apr_pool_destroy( context);
return;
}
1.1 apr-site/apr2_0intro/TstAprRoutines/ReadMe.txt
Index: ReadMe.txt
===================================================================
========================================================================
CONSOLE APPLICATION : TstAprRoutines
========================================================================
AppWizard has created this TstAprRoutines application for you.
This file contains a summary of what you will find in each of the files that
make up your TstAprRoutines application.
TstAprRoutines.dsp
This file (the project file) contains information at the project level and
is used to build a single project or subproject. Other users can share the
project (.dsp) file, but they should export the makefiles locally.
TstAprRoutines.cpp
This is the main application source file.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named TstAprRoutines.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////
1.1 apr-site/apr2_0intro/TstAprRoutines/StdAfx.cpp
Index: StdAfx.cpp
===================================================================
// stdafx.cpp : source file that includes just the standard includes
// TstAprRoutines.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
1.1 apr-site/apr2_0intro/TstAprRoutines/StdAfx.h
Index: StdAfx.h
===================================================================
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__12BC5F39_5451_438A_80A9_4BCA0493E6DA__INCLUDED_)
#define AFX_STDAFX_H__12BC5F39_5451_438A_80A9_4BCA0493E6DA__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <apr.h>
#include "apr_general.h"
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately
before the previous line.
#endif //
!defined(AFX_STDAFX_H__12BC5F39_5451_438A_80A9_4BCA0493E6DA__INCLUDED_)
1.1 apr-site/apr2_0intro/TstAprRoutines/TstAprRoutines.cpp
Index: TstAprRoutines.cpp
===================================================================
// TstAprRoutines.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
void APRFiles();
void APRMemory();
void APRThreads();
void APRMisc();
// Routine used to cleanup the APR when exiting
static void closeapr(void)
{
apr_terminate();
}
int main(int argc, char* argv[])
{
printf( "Initializing the APR\n");
if (apr_initialize() != APR_SUCCESS) {
printf( "Could not initialize\n");
exit(-1);
}
atexit(closeapr);
printf( "Testing APR file routines\n");
// Memory handling routines
APRMemory();
// File handling routines
APRFiles();
// Thread handling routines
APRThreads();
// Misc handling routines
APRMisc();
printf( "Done...\n");
return 0;
}
1.1 apr-site/apr2_0intro/TstAprRoutines/TstAprRoutines.dsp
Index: TstAprRoutines.dsp
===================================================================
# Microsoft Developer Studio Project File - Name="TstAprRoutines" - Package
Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=TstAprRoutines - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "TstAprRoutines.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "TstAprRoutines.mak" CFG="TstAprRoutines - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "TstAprRoutines - Win32 Release" (based on "Win32 (x86) Console
Application")
!MESSAGE "TstAprRoutines - Win32 Debug" (based on "Win32 (x86) Console
Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "TstAprRoutines - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
"_MBCS" /Yu"stdafx.h" /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS"
/Yu"stdafx.h" /FD /c
# ADD BASE RSC /l 0x1009 /d "NDEBUG"
# ADD RSC /l 0x1009 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /subsystem:console /machine:I386
!ELSEIF "$(CFG)" == "TstAprRoutines - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D
"_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D
"_MBCS" /FR /Yu"stdafx.h" /FD /GZ /c
# ADD BASE RSC /l 0x1009 /d "_DEBUG"
# ADD RSC /l 0x1009 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "TstAprRoutines - Win32 Release"
# Name "TstAprRoutines - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\aprfile.cpp
# End Source File
# Begin Source File
SOURCE=.\aprmemory.cpp
# End Source File
# Begin Source File
SOURCE=.\aprmisc.cpp
# End Source File
# Begin Source File
SOURCE=.\aprthreads.cpp
# End Source File
# Begin Source File
SOURCE=.\StdAfx.cpp
# ADD CPP /Yc"stdafx.h"
# End Source File
# Begin Source File
SOURCE=.\TstAprRoutines.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\StdAfx.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Group "Library Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\..\..\bin\libapr.lib
# End Source File
# End Group
# End Target
# End Project
1.1 apr-site/apr2_0intro/TstAprRoutines/TstAprRoutines.plg
Index: TstAprRoutines.plg
===================================================================
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: TstAprRoutines - Win32
Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\cgross\LOCALS~1\Temp\RSP16.tmp" with
contents
[
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D
"_MBCS" /FR"Debug/" /Fp"Debug/TstAprRoutines.pch" /Yu"stdafx.h" /Fo"Debug/"
/Fd"Debug/" /FD /GZ /c
"C:\projects\ApacheAPR\TstApr\TstAprRoutines\aprmisc.cpp"
"C:\projects\ApacheAPR\TstApr\TstAprRoutines\TstAprRoutines.cpp"
]
Creating command line "cl.exe @C:\DOCUME~1\cgross\LOCALS~1\Temp\RSP16.tmp"
Creating temporary file "C:\DOCUME~1\cgross\LOCALS~1\Temp\RSP17.tmp" with
contents
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo
/subsystem:console /incremental:yes /pdb:"Debug/TstAprRoutines.pdb" /debug
/machine:I386 /out:"Debug/TstAprRoutines.exe" /pdbtype:sept
.\Debug\aprfile.obj
.\Debug\aprmemory.obj
.\Debug\aprmisc.obj
.\Debug\aprthreads.obj
.\Debug\StdAfx.obj
.\Debug\TstAprRoutines.obj
..\..\..\bin\libapr.lib
]
Creating command line "link.exe @C:\DOCUME~1\cgross\LOCALS~1\Temp\RSP17.tmp"
<h3>Output Window</h3>
Compiling...
aprmisc.cpp
C:\projects\ApacheAPR\TstApr\TstAprRoutines\aprmisc.cpp(21) : warning C4101:
'filename' : unreferenced local variable
TstAprRoutines.cpp
Generating Code...
Linking...
Creating command line "bscmake.exe /nologo /o"Debug/TstAprRoutines.bsc"
.\Debug\StdAfx.sbr .\Debug\aprfile.sbr .\Debug\aprmemory.sbr
.\Debug\aprmisc.sbr .\Debug\aprthreads.sbr .\Debug\TstAprRoutines.sbr"
Creating browse info file...
<h3>Output Window</h3>
<h3>Results</h3>
TstAprRoutines.exe - 0 error(s), 1 warning(s)
</pre>
</body>
</html>