00001 /******************************************************************************* 00002 00003 @file EndianWriter.d 00004 00005 Copyright (c) 2004 Kris Bell 00006 00007 This software is provided 'as-is', without any express or implied 00008 warranty. In no event will the authors be held liable for damages 00009 of any kind arising from the use of this software. 00010 00011 Permission is hereby granted to anyone to use this software for any 00012 purpose, including commercial applications, and to alter it and/or 00013 redistribute it freely, subject to the following restrictions: 00014 00015 1. The origin of this software must not be misrepresented; you must 00016 not claim that you wrote the original software. If you use this 00017 software in a product, an acknowledgment within documentation of 00018 said product would be appreciated but is not required. 00019 00020 2. Altered source versions must be plainly marked as such, and must 00021 not be misrepresented as being the original software. 00022 00023 3. This notice may not be removed or altered from any distribution 00024 of the source. 00025 00026 4. Derivative works are permitted, but they must carry this notice 00027 in full and credit the original source. 00028 00029 00030 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 00031 00032 00033 @version Initial version, March 2004 00034 @author Kris 00035 00036 00037 *******************************************************************************/ 00038 00039 module mango.io.EndianWriter; 00040 00041 public import mango.io.Writer; 00042 00043 private import mango.convert.Type; 00044 00045 private import mango.sys.ByteSwap; 00046 00047 /******************************************************************************* 00048 00049 *******************************************************************************/ 00050 00051 class EndianWriter : Writer 00052 { 00053 /*********************************************************************** 00054 00055 Construct EndianWriter upon the given IBuffer 00056 00057 ***********************************************************************/ 00058 00059 this (IBuffer buffer) 00060 { 00061 super (buffer); 00062 } 00063 00064 /*********************************************************************** 00065 00066 ***********************************************************************/ 00067 00068 protected override IWriter write (void* src, uint bytes, int type) 00069 { 00070 void write (int mask, void function (void* dst, uint bytes) mutate) 00071 { 00072 uint writer (void[] dst) 00073 { 00074 // cap bytes written 00075 uint len = dst.length & mask; 00076 if (len > bytes) 00077 len = bytes; 00078 00079 dst [0..len] = src [0..len]; 00080 mutate (dst, len); 00081 return len; 00082 } 00083 00084 while (bytes) 00085 { 00086 //flush if we used all buffer space 00087 if (bytes -= buffer.write (&writer)) 00088 buffer.makeRoom (bytes); 00089 } 00090 } 00091 00092 00093 switch (type) 00094 { 00095 case Type.Short: 00096 case Type.UShort: 00097 case Type.Utf16: 00098 write (~1, &ByteSwap.swap16); 00099 break; 00100 00101 case Type.Int: 00102 case Type.UInt: 00103 case Type.Float: 00104 case Type.Utf32: 00105 write (~3, &ByteSwap.swap32); 00106 break; 00107 00108 case Type.Long: 00109 case Type.ULong: 00110 case Type.Double: 00111 write (~7, &ByteSwap.swap64); 00112 break; 00113 00114 case Type.Real: 00115 write (~15, &ByteSwap.swap80); 00116 break; 00117 00118 default: 00119 super.write (src, bytes, type); 00120 break; 00121 } 00122 return this; 00123 } 00124 } 00125