Changeset 3575
- Timestamp:
- Sep 2, 2007, 10:05:39 PM (18 years ago)
- Location:
- trunk/kStuff/kHlp
- Files:
-
- 2 added
- 1 deleted
- 4 edited
- 2 copied
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/kStuff/kHlp/Bare/kHlpBareEnv.c ¶
r3573 r3575 43 43 44 44 45 /** 46 * Get an environment variable. 47 * 48 * @returns 0 on success. 49 * @returns KERR_BUFFER_OVERFLOW on if the buffer is too small. 50 * @returns KERR_ENVVAR_NOT_FOUND if not found. 51 * @returns OS specfic status code on other error. 52 * @param pszVar The variable name. 53 * @param pszVal Where to store the value. 54 * @param cchVal The size of the buffer pointed to by pszVal. 55 */ 56 int kHlpGetEnv(const char *pszVar, char *pszVal, KSIZE cchVal) 45 KHLP_DECL(int) kHlpGetEnv(const char *pszVar, char *pszVal, KSIZE cchVal) 57 46 { 58 47 #if K_OS == K_OS_OS2 … … 71 60 } 72 61 else 73 rc = KERR_ENV _VAR_NOT_FOUND;62 rc = KERR_ENVVAR_NOT_FOUND; 74 63 return rc; 75 64 76 #elif 65 #elif K_OS == K_OS_WINDOWS 77 66 DWORD cch; 78 67 … … 94 83 } 95 84 96 97 /**98 * Gets an environment variable and converts it to a KSIZE.99 *100 * @returns 0 and *pcb on success.101 * @returns On failure see kHlpGetEnv.102 * @param pszVar The name of the variable.103 * @param pcb Where to put the value.104 */105 int kHlpGetEnvUZ(const char *pszVar, KSIZE *pcb)106 {107 KSIZE cb;108 unsigned uBase;109 char szVal[64];110 KSIZE cchVal = sizeof(szVal);111 const char *psz;112 int rc;113 114 *pcb = 0;115 rc = kHlpGetEnv(pszVar, szVal, cchVal);116 if (rc)117 return rc;118 119 /* figure out the base. */120 uBase = 10;121 psz = szVal;122 if ( *psz == '0'123 && (psz[1] == 'x' || psz[1] == 'X'))124 {125 uBase = 16;126 psz += 2;127 }128 129 /* convert it up to the first unknown char. */130 cb = 0;131 for(;;)132 {133 const char ch = *psz;134 unsigned uDigit;135 if (!ch)136 break;137 else if (ch >= '0' && ch <= '9')138 uDigit = ch - '0';139 else if (ch >= 'a' && ch <= 'z')140 uDigit = ch - 'a' + 10;141 else if (ch >= 'A' && ch <= 'Z')142 uDigit = ch - 'A' + 10;143 else144 break;145 if (uDigit >= uBase)146 break;147 148 /* add the digit */149 cb *= uBase;150 cb += uDigit;151 152 psz++;153 }154 155 /* check for unit */156 if (*psz == 'm' || *psz == 'M')157 cb *= 1024*1024;158 else if (*psz == 'k' ||*psz == 'K')159 cb *= 1024;160 else if (*psz == 'g' || *psz == 'G')161 cb *= 1024*1024*1024;162 163 *pcb = cb;164 return 0;165 }166 -
TabularUnified trunk/kStuff/kHlp/CRT/kHlpCRTAlloc.cpp ¶
r3552 r3575 31 31 #include <stdlib.h> 32 32 #include <string.h> 33 33 34 34 35 KHLP_DECL(void *) kHlpAlloc(KSIZE cb) … … 72 73 } 73 74 74 75 KHLP_DECL(int) kHlpPageAlloc(void **ppv, KSIZE cb, KPROT enmProt, KBOOL fFixed)76 {77 return -1;78 }79 80 81 KHLP_DECL(int) kHlpPageProtect(void *pv, KSIZE cb, KPROT enmProt)82 {83 return -1;84 }85 86 87 KHLP_DECL(int) kHlpPageFree(void *pv, KSIZE cb)88 {89 return -1;90 }91 -
TabularUnified trunk/kStuff/kHlp/CRT/kHlpCRTString.cpp ¶
r3574 r3575 56 56 57 57 58 #ifndef kHlpMemPCopy 59 void *kHlpMemPCopy(void *pv1, const void *pv2, KSIZE cb) 60 { 61 return (KU8 *)memcpy(pv1, pv2, cb) + cb; 62 } 63 #endif 64 65 58 66 #ifndef kHlpMemMove 59 67 void *kHlpMemMove(void *pv1, const void *pv2, KSIZE cb) … … 64 72 65 73 74 #ifndef kHlpMemPMove 75 void *kHlpMemPMove(void *pv1, const void *pv2, KSIZE cb) 76 { 77 return (KU8 *)memmove(pv1, pv2, cb) + cb; 78 } 79 #endif 80 81 66 82 #ifndef kHlpMemSet 67 83 void *kHlpMemSet(void *pv1, int ch, KSIZE cb) 68 84 { 69 85 return memset(pv1, ch, cb); 86 } 87 #endif 88 89 90 #ifndef kHlpMemPSet 91 void *kHlpMemPSet(void *pv1, int ch, KSIZE cb) 92 { 93 return (KU8 *)memset(pv1, ch, cb) + cb; 70 94 } 71 95 #endif … … 135 159 #endif 136 160 137 138 KSIZE kHlpStrNLen(const char *psz, KSIZE cchMax)139 {140 const char * const pszStart = psz;141 while (*psz && cchMax--)142 psz++;143 return psz - pszStart;144 }145 146 147 int kHlpMemICompAscii(const void *pv1, const void *pv2, KSIZE cb)148 {149 const KU8 *pb1 = (const KU8 *)pv1;150 const KU8 *pb2 = (const KU8 *)pv2;151 while (cb-- > 0)152 {153 if (*pb1 != *pb2)154 {155 const KU8 u1 = *pb1 >= 'a' && *pb1 <= 'z' ? *pb1 - 'a' : *pb1;156 const KU8 u2 = *pb2 >= 'a' && *pb2 <= 'z' ? *pb2 - 'a' : *pb2;157 if (u1 != u2)158 return (int)*pb1 - (int)*pb2;159 }160 pb1++;161 pb2++;162 }163 return 0;164 }165 166 167 int kLdrHlpStrIComp(const char *pv1, const char *pv2)168 {169 const KU8 *pb1 = (const KU8 *)pv1;170 const KU8 *pb2 = (const KU8 *)pv2;171 for (;;)172 {173 if (*pb1 != *pb2)174 {175 const KU8 u1 = *pb1 >= 'a' && *pb1 <= 'z' ? *pb1 - 'a' : *pb1;176 const KU8 u2 = *pb2 >= 'a' && *pb2 <= 'z' ? *pb2 - 'a' : *pb2;177 if (u1 != u2)178 return (int)*pb1 - (int)*pb2;179 }180 if (!*pb1)181 break;182 pb1++;183 pb2++;184 }185 return 0;186 }187 188 189 -
TabularUnified trunk/kStuff/kHlp/Generic/kHlpGetExt.c ¶
r3573 r3575 1 1 /* $Id$ */ 2 2 /** @file 3 * kHlpPath - kHlpGetExt and kHlpGetSuff. 4 */ 5 6 /* 7 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net> 3 8 * 4 * kLdr - The Dynamic Loader, Path Helper Functions.9 * This file is part of kStuff. 5 10 * 6 * Copyright (c) 2006-2007 knut st. osmundsen <bird-kbuild-src@anduin.net> 11 * kStuff is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2.1 of the License, or (at your option) any later version. 7 15 * 16 * kStuff is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 8 20 * 9 * This file is part of kLdr. 10 * 11 * kLdr is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * kLdr is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with kLdr; if not, write to the Free Software 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with kStuff; if not, write to the Free Software 23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 24 24 * 25 25 */ 26 27 26 28 27 /******************************************************************************* … … 34 33 35 34 /** 36 * Get the pointer to the filename part of the name.37 *38 * @returns Pointer to where the filename starts within the string pointed to by pszFilename.39 * @returns Pointer to the terminator char if no filename.40 * @param pszFilename The filename to parse.41 */42 char *kHlpGetFilename(const char *pszFilename)43 {44 const char *pszLast = NULL;45 for (;;)46 {47 char ch = *pszFilename;48 #if defined(__OS2__) || defined(__WIN__)49 if (ch == '/' || ch == '\\' || ch == ':')50 {51 while ((ch = *++pszFilename) == '/' || ch == '\\' || ch == ':')52 /* nothing */;53 pszLast = pszFilename;54 }55 #else56 if (ch == '/')57 {58 while ((ch = *++pszFilename) == '/')59 /* betsuni */;60 pszLast = pszFilename;61 }62 #endif63 if (!ch)64 return (char *)(pszLast ? pszLast : pszFilename);65 pszFilename++;66 }67 }68 69 70 /**71 35 * Gets the filename suffix. 72 36 * … … 75 39 * @param pszFilename The filename to parse. 76 40 */ 77 char *kHlpGetSuff(const char *pszFilename)41 KHLP_DECL(char *) kHlpGetSuff(const char *pszFilename) 78 42 { 79 43 const char *pszDot = NULL; … … 103 67 * @param pszFilename The filename to parse. 104 68 */ 105 char *kHlpGetExt(const char *pszFilename)69 KHLP_DECL(char *) kHlpGetExt(const char *pszFilename) 106 70 { 107 71 char *psz = kHlpGetSuff(pszFilename); … … 109 73 } 110 74 111 112 /**113 * Checks if this is only a filename or if it contains any kind114 * of drive, directory, or server specs.115 *116 * @returns 1 if this is a filename only.117 * @returns 0 of it's isn't only a filename.118 * @param pszFilename The filename to parse.119 */120 int kHlpIsFilenameOnly(const char *pszFilename)121 {122 for (;;)123 {124 const char ch = *pszFilename++;125 #if defined(__OS2__) || defined(__WIN__)126 if (ch == '/' || ch == '\\' || ch == ':')127 #else128 if (ch == '/')129 #endif130 return 0;131 if (!ch)132 return 1;133 }134 }135 136 -
TabularUnified trunk/kStuff/kHlp/Generic/kHlpGetFilename.c ¶
r3573 r3575 1 1 /* $Id$ */ 2 2 /** @file 3 * kHlpPath - kHlpGetFilename. 4 */ 5 6 /* 7 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net> 3 8 * 4 * kLdr - The Dynamic Loader, Path Helper Functions.9 * This file is part of kStuff. 5 10 * 6 * Copyright (c) 2006-2007 knut st. osmundsen <bird-kbuild-src@anduin.net> 11 * kStuff is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2.1 of the License, or (at your option) any later version. 7 15 * 16 * kStuff is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 8 20 * 9 * This file is part of kLdr. 10 * 11 * kLdr is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * kLdr is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with kLdr; if not, write to the Free Software 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with kStuff; if not, write to the Free Software 23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 24 24 * 25 25 */ 26 27 26 28 27 /******************************************************************************* … … 40 39 * @param pszFilename The filename to parse. 41 40 */ 42 char *kHlpGetFilename(const char *pszFilename)41 KHLP_DECL(char *) kHlpGetFilename(const char *pszFilename) 43 42 { 44 43 const char *pszLast = NULL; … … 46 45 { 47 46 char ch = *pszFilename; 48 #if defined(__OS2__) || defined(__WIN__)47 #if K_OS == K_OS_OS2 || K_OS == K_OS_WINDOWS 49 48 if (ch == '/' || ch == '\\' || ch == ':') 50 49 { … … 67 66 } 68 67 69 70 /**71 * Gets the filename suffix.72 *73 * @returns Pointer to where the suffix starts within the string pointed to by pszFilename.74 * @returns Pointer to the terminator char if no suffix.75 * @param pszFilename The filename to parse.76 */77 char *kHlpGetSuff(const char *pszFilename)78 {79 const char *pszDot = NULL;80 pszFilename = kHlpGetFilename(pszFilename);81 for (;;)82 {83 char ch = *pszFilename;84 if (ch == '.')85 {86 while ((ch = *++pszFilename) == '.')87 /* nothing */;88 if (ch)89 pszDot = pszFilename - 1;90 }91 if (!ch)92 return (char *)(pszDot ? pszDot : pszFilename);93 pszFilename++;94 }95 }96 97 98 /**99 * Gets the filename extention.100 *101 * @returns Pointer to where the extension starts within the string pointed to by pszFilename.102 * @returns Pointer to the terminator char if no extension.103 * @param pszFilename The filename to parse.104 */105 char *kHlpGetExt(const char *pszFilename)106 {107 char *psz = kHlpGetSuff(pszFilename);108 return *psz ? psz + 1 : psz;109 }110 111 112 /**113 * Checks if this is only a filename or if it contains any kind114 * of drive, directory, or server specs.115 *116 * @returns 1 if this is a filename only.117 * @returns 0 of it's isn't only a filename.118 * @param pszFilename The filename to parse.119 */120 int kHlpIsFilenameOnly(const char *pszFilename)121 {122 for (;;)123 {124 const char ch = *pszFilename++;125 #if defined(__OS2__) || defined(__WIN__)126 if (ch == '/' || ch == '\\' || ch == ':')127 #else128 if (ch == '/')129 #endif130 return 0;131 if (!ch)132 return 1;133 }134 }135 136 -
TabularUnified trunk/kStuff/kHlp/Generic/kHlpIsFilenameOnly.c ¶
r3573 r3575 1 1 /* $Id$ */ 2 2 /** @file 3 * kHlpPath - kHlpIsFilenameOnly. 4 */ 5 6 /* 7 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net> 3 8 * 4 * kLdr - The Dynamic Loader, Path Helper Functions.9 * This file is part of kStuff. 5 10 * 6 * Copyright (c) 2006-2007 knut st. osmundsen <bird-kbuild-src@anduin.net> 11 * kStuff is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2.1 of the License, or (at your option) any later version. 7 15 * 16 * kStuff is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 8 20 * 9 * This file is part of kLdr. 10 * 11 * kLdr is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * kLdr is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with kLdr; if not, write to the Free Software 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with kStuff; if not, write to the Free Software 23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 24 24 * 25 25 */ 26 27 26 28 27 /******************************************************************************* … … 31 30 #include <k/kHlpPath.h> 32 31 #include <k/kHlpString.h> 33 34 35 /**36 * Get the pointer to the filename part of the name.37 *38 * @returns Pointer to where the filename starts within the string pointed to by pszFilename.39 * @returns Pointer to the terminator char if no filename.40 * @param pszFilename The filename to parse.41 */42 char *kHlpGetFilename(const char *pszFilename)43 {44 const char *pszLast = NULL;45 for (;;)46 {47 char ch = *pszFilename;48 #if defined(__OS2__) || defined(__WIN__)49 if (ch == '/' || ch == '\\' || ch == ':')50 {51 while ((ch = *++pszFilename) == '/' || ch == '\\' || ch == ':')52 /* nothing */;53 pszLast = pszFilename;54 }55 #else56 if (ch == '/')57 {58 while ((ch = *++pszFilename) == '/')59 /* betsuni */;60 pszLast = pszFilename;61 }62 #endif63 if (!ch)64 return (char *)(pszLast ? pszLast : pszFilename);65 pszFilename++;66 }67 }68 69 70 /**71 * Gets the filename suffix.72 *73 * @returns Pointer to where the suffix starts within the string pointed to by pszFilename.74 * @returns Pointer to the terminator char if no suffix.75 * @param pszFilename The filename to parse.76 */77 char *kHlpGetSuff(const char *pszFilename)78 {79 const char *pszDot = NULL;80 pszFilename = kHlpGetFilename(pszFilename);81 for (;;)82 {83 char ch = *pszFilename;84 if (ch == '.')85 {86 while ((ch = *++pszFilename) == '.')87 /* nothing */;88 if (ch)89 pszDot = pszFilename - 1;90 }91 if (!ch)92 return (char *)(pszDot ? pszDot : pszFilename);93 pszFilename++;94 }95 }96 97 98 /**99 * Gets the filename extention.100 *101 * @returns Pointer to where the extension starts within the string pointed to by pszFilename.102 * @returns Pointer to the terminator char if no extension.103 * @param pszFilename The filename to parse.104 */105 char *kHlpGetExt(const char *pszFilename)106 {107 char *psz = kHlpGetSuff(pszFilename);108 return *psz ? psz + 1 : psz;109 }110 32 111 33 … … 118 40 * @param pszFilename The filename to parse. 119 41 */ 120 intkHlpIsFilenameOnly(const char *pszFilename)42 KHLP_DECL(int) kHlpIsFilenameOnly(const char *pszFilename) 121 43 { 122 44 for (;;) 123 45 { 124 46 const char ch = *pszFilename++; 125 #if defined(__OS2__) || defined(__WIN__)47 #if K_OS == K_OS_OS2 || K_OS == K_OS_WINDOWS 126 48 if (ch == '/' || ch == '\\' || ch == ':') 127 49 #else … … 134 56 } 135 57 136 -
TabularUnified trunk/kStuff/kHlp/Generic/kHlpPage.c ¶
r3573 r3575 29 29 *******************************************************************************/ 30 30 #include <k/kHlpAlloc.h> 31 #include <k/kHlpAssert.h> 31 32 32 33 #if K_OS == K_OS_OS2 … … 45 46 *******************************************************************************/ 46 47 #if K_OS == K_OS_OS2 47 /** The base of the stub object.48 /** The base of the loader stub object. <kLdr Hack> 48 49 * The OS/2 exe stub consists of a single data object. When allocating memory 49 * for an executable, we'll have to reuse this. 50 * for an executable, we'll have to reuse this. */ 50 51 static void *g_pvStub = NULL; 51 /** The size of the stub object - 0 if no stub. */52 /** The size of the stub object - 0 if no stub. <kLdr Hack> */ 52 53 static KSIZE g_cbStub = 0; 53 54 … … 213 214 * @param cb The byte count requested from kHlpPageAlloc(). 214 215 */ 215 KHLP_DECL(int) skHlpPageFree(void *pv, KSIZE cb)216 KHLP_DECL(int) kHlpPageFree(void *pv, KSIZE cb) 216 217 { 217 218 #if K_OS == K_OS_OS2 -
TabularUnified trunk/kStuff/kHlp/Makefile.kmk ¶
r3574 r3575 34 34 kHlpBaseStatic_TEMPLATE = kStuffLIB 35 35 kHlpBaseStatic_SOURCES = \ 36 Generic/kHlpInt2Ascii.c \37 \38 36 Generic/kHlpMemChr.c \ 39 37 Generic/kHlpMemComp.c \ … … 46 44 Generic/kHlpMemSet.c \ 47 45 Generic/kHlpMemPSet.c \ 48 \49 46 Generic/kHlpStrCat.c \ 50 47 Generic/kHlpStrPCat.c \ … … 65 62 Generic/kHlpStrLen.c \ 66 63 Generic/kHlpStrNLen.c \ 64 Generic/kHlpInt2Ascii.c \ 65 \ 66 Generic/kHlpGetEnvUZ.c \ 67 \ 68 Generic/kHlpGetExt.c \ 69 Generic/kHlpGetFilename.c \ 70 Generic/kHlpIsFilenameOnly.c \ 71 \ 72 Generic/kHlpPage.c \ 67 73 \ 68 74 Bare/kHlpBareAssert.c \ 69 75 Bare/kHlpBareHeap.c \ 70 76 Bare/kHlpBareEnv.c \ 71 Bare/kHlpBareMem.c \72 Bare/kHlpBarePath.c \73 77 Bare/kHlpBareProcess.c \ 74 78 Bare/kHlpBareSem.c \ 75 Bare/kHlpBareStr.c \76 79 Bare/kHlpBareThread.c \ 77 80 … … 82 85 kHlpCRTStatic_TEMPLATE = kStuffLIB 83 86 kHlpCRTStatic_SOURCES = \ 87 Generic/kHlpMemPComp.c \ 88 Generic/kHlpMemICompAscii.c \ 89 Generic/kHlpStrPCat.c \ 90 Generic/kHlpStrNPCat.c \ 91 Generic/kHlpStrPComp.c \ 92 Generic/kHlpStrNPComp.c \ 93 Generic/kHlpStrICompAscii.c \ 94 Generic/kHlpStrIPCompAscii.c \ 95 Generic/kHlpStrNICompAscii.c \ 96 Generic/kHlpStrNIPCompAscii.c \ 97 Generic/kHlpStrPCopy.c \ 98 Generic/kHlpStrNLen.c \ 99 Generic/kHlpInt2Ascii.c \ 100 \ 101 Generic/kHlpGetEnvUZ.c \ 102 \ 103 Generic/kHlpGetExt.c \ 104 Generic/kHlpGetFilename.c \ 105 Generic/kHlpIsFilenameOnly.c \ 106 \ 107 Generic/kHlpPage.c \ 84 108 \ 85 109 CRT/kHlpCRTAlloc.cpp \ 110 CRT/kHlpCRTEnv.cpp \ 86 111 CRT/kHlpCRTString.cpp \ 87 112
Note:
See TracChangeset
for help on using the changeset viewer.