package com.sun.jna; /* * A string block consists of a null-terminated block of null-terminated strings. * Note that an ANSI environment block is terminated by two zero bytes: * one for the last string, one more to terminate the block. * A Unicode environment block is terminated by four zero bytes: * two for the last string, two more to terminate the block. */ public class StringBlock extends Memory { private boolean wide; /** Create a native array of strings. */ public StringBlock(String[] strings) { this(strings, false); } /** Create a native block of strings. */ public StringBlock(String[] strings, boolean wide) { this((Object[]) strings, wide); } /** Create a native block of wide strings. */ public StringBlock(WString[] strings) { this(strings, true); } private StringBlock(Object[] strings, boolean wide) { super(calculateLength(strings, wide)); this.wide = wide; int offset = 0; for (int i = 0; i < strings.length; i++) { if (strings[i] != null) { setString(offset, strings[i].toString(), wide); if (wide) offset += (strings[i].toString().length()) * Native.WCHAR_SIZE; else offset += (strings[i].toString().getBytes().length); setString(offset, "\0", wide); if (wide) offset += Native.WCHAR_SIZE; else offset += 1; } } setByte(offset, (byte) 0); if (wide) setByte(offset + 1, (byte) 0); } private static long calculateLength(Object[] strings, boolean wide) { int result = 0; if (wide) { for (Object string : strings) result += (string.toString().length() + 1) * Native.WCHAR_SIZE; result += Native.WCHAR_SIZE; } else { for (Object string : strings) result += (string.toString().getBytes().length + 1); result += 1; } return result; } }