hxopwavestdio.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/stdio.h"
  36. #include "hlxclib/string.h"
  37. #include "hlxclib/limits.h"
  38. // due to unsolved mysterey of assertion in OpDVPRINTF
  39. // we currently disable it.
  40. //#define OPENWAVE_PRINTF
  41. extern "C" {
  42. OpFsFd g_opfd;
  43. int __helix_vprintf(const char  *format, va_list ap)
  44. {
  45.     int ret = 1;                // XXXSAB: what to return?
  46. /// Turn OPENWAVE_PRINTF on needs DEBUG defined for 
  47. /// Shibumi's OpDVPRINTF defined but that includes more
  48. /// more duplicate definitions of other functions
  49. #ifdef OPENWAVE_PRINTF
  50.     OpNOTE(OpDVPRINTF(format, &ap));
  51. #endif
  52.     return ret;
  53. }
  54. //int __helix_fprintf(FILE* f, const char  *format, ...);
  55. int __helix_printf(const char  *format, ...)
  56. {
  57.     int ret = 0;
  58. #ifdef OPENWAVE_PRINTF 
  59.     va_list args;
  60.     va_start(args, format);
  61.     OpDPRINTF(format, args);
  62.     va_end(args);
  63. #endif
  64.     return ret;
  65. }
  66. int __helix_fprintf(FILE* f, const char  *format, ...)
  67. {
  68.     va_list args;
  69.     va_start(args, format);
  70.     int ret = vprintf(format, args);
  71.     va_end(args);
  72.     return ret;
  73. }
  74. /*
  75.  *format supports only from string to ulong conversion in the form of
  76.  * "%lu%lu%lu..."
  77.  */
  78. int __helix_sscanf(const char *buffer, const char *format, ...)
  79. {
  80. int ret = 0;
  81. va_list args;
  82. va_start(args,format);
  83. if (strstr(format, "%lu") == NULL)
  84. {
  85. return ret;
  86. }
  87. while (*format != '')
  88. {
  89. char *pEnd = NULL;
  90. int val = strtoul(buffer,&pEnd, 16);
  91. if (val == ULONG_MAX || val == 0)
  92. {
  93. return ret;
  94. }
  95. unsigned long *pval = (unsigned long*)va_arg(args, unsigned long);
  96. if (pval)
  97. {
  98. *pval = val;
  99. }
  100. format += 3;
  101. buffer = pEnd + 1;
  102. ret++;
  103. }
  104. va_end(args);
  105. return ret;
  106. }
  107. FILE* __helix_fopen(const char *filename, const char *mode)
  108. {
  109. FILE *pf = NULL;
  110. OpFsFd fd = -1;
  111. OpFsFlags oflags= kOpFsFlagExcl;
  112. if (strcmp(mode, "r") == 0)
  113. {
  114. oflags = kOpFsFlagRdOnly;
  115. }
  116. else if (strcmp(mode,"w") == 0)
  117. {
  118. oflags = kOpFsFlagCreate | kOpFsFlagTrunc;
  119. }
  120. else if (strcmp(mode,"r+") == 0)
  121. {
  122. oflags = kOpFsFlagRdwr;
  123. }
  124. else if (strcmp(mode, "w+") == 0)
  125. {
  126. oflags = kOpFsFlagCreate | kOpFsFlagRdwr;
  127. }
  128. else if (strcmp(mode,"a") == 0)
  129. {
  130. oflags = kOpFsFlagCreate | kOpFsFlagWrOnly;
  131. }
  132. else if (strcmp(mode,"a+") == 0)
  133. {
  134. oflags = kOpFsFlagCreate | kOpFsFlagRdwr;
  135. }
  136. if ((fd = OpFsOpen( filename, oflags, 0644 )) != kOpFsErrAny)
  137.         //if ((fd = OpFsOpen( filename, oflags, 0 )) != kOpFsErrAny)
  138. {
  139. g_opfd = fd;
  140. pf = (FILE*)&g_opfd;
  141. }
  142. return pf;
  143. }
  144. size_t __helix_fread(void *buffer, size_t size, size_t count, FILE *stream)
  145. {
  146. size_t numread = 0;
  147. if (stream)
  148. {
  149. if ((numread = OpFsRead((OpFsFd)*stream, buffer, size*count)) == kOpFsErrAny)
  150. numread = 0;
  151. }
  152. return numread;
  153. }
  154. size_t __helix_fwrite(const void *buffer, size_t size, size_t count, FILE *stream)
  155. {
  156. size_t numwrite = 0;
  157. if (stream)
  158. {
  159. if (( numwrite = OpFsWrite( (OpFsFd)*stream, buffer, size*count)) == kOpFsErrAny)
  160. {
  161. numwrite = 0;
  162. }
  163. }
  164. return numwrite;
  165. }
  166. int __helix_fseek(FILE *stream, long offset, int origin)
  167. {
  168. int ret = 0;
  169. if (stream)
  170. {
  171. if (OpFsSeek((OpFsFd)*stream, (OpFsSize)offset, (U8CPU)origin) == kOpFsErrAny)
  172. {
  173. ret = -1;
  174. }
  175. }
  176. return ret;
  177. }
  178. int __helix_fclose(FILE *stream)
  179. {
  180. int ret = 0;
  181. if (stream)
  182. {
  183. if (OpFsClose((OpFsFd)*stream) == kOpFsErrAny)
  184. {
  185. ret = EOF;
  186. }
  187. }
  188. return ret;
  189. }
  190. int __helix_feof(FILE *stream)
  191. {
  192.         int ret = 0;
  193. if (stream)
  194. {
  195. int numread = 0;
  196. char buffer[10];
  197. if ((numread = OpFsRead((OpFsFd)*stream, buffer, 1)) != 0)
  198. {
  199. // seek it back so we are not changing anything here
  200. if (numread == 1 && OpFsSeek((OpFsFd)*stream, -1, kOpFsSeekCur) != kOpFsErrAny)
  201. {
  202. ret = 1;
  203. }
  204. else
  205. {
  206. // some errors occur
  207. ret = EOF;
  208. }
  209. }
  210. }
  211. return ret;
  212. }
  213. long __helix_ftell(FILE *stream)
  214. {
  215. long foffset = -1;
  216. if (stream)
  217. {
  218. foffset = OpFsSeek((OpFsFd)*stream, 0, kOpFsSeekCur);
  219. }
  220. return foffset;
  221. }
  222. char* __helix_fgets(char *sbuf, int n, FILE *stream)
  223. {
  224. char* rets = sbuf;
  225. if (stream)
  226. {
  227. /// use OpFsRead to implement. it is not the same as it is defined in c run-time 
  228. /// so it is not a correct implementation.
  229. if (OpFsRead((OpFsFd)*stream, sbuf, n) == kOpFsErrAny)
  230. {
  231. rets = NULL;
  232. }
  233. }
  234. return rets;
  235. }
  236. int __helix_fputc( int c, FILE *stream )
  237. {
  238. int retc = EOF;
  239. if (stream)
  240. {
  241. if (OpFsWrite((OpFsFd)*stream, &c, 1) == 1)
  242. {
  243. retc = c;
  244. }
  245. }
  246. return retc;
  247. }
  248. int __helix_ferror(FILE *stream)
  249. {
  250. // not implemented so we suppose nothing can be said
  251. // about the error status but ok
  252. return 0;
  253. }
  254. int __helix_fflush(FILE *stream)
  255. {
  256. int ret = 0;
  257. if (stream)
  258. {
  259. if (OpFsFlush((OpFsFd)*stream) == kOpFsErrAny)
  260. {
  261. ret = EOF;
  262. }
  263. }
  264. return ret;
  265. }
  266. int __helix_rename(const char *oldname, const char *newname)
  267. {
  268. int ret = 0;
  269. if (OpFsRename(oldname, newname) == kOpFsErrAny)
  270. {
  271. ret = (int) kOpFsErrAny;
  272. }
  273. return ret;
  274. }
  275. FILE* __helix_fdopen(int fd, const char *mode)
  276. {
  277. // do nothing special but return the global OPENWAVE FILE 
  278. // cached by the global file descriptor
  279. return (FILE*)&g_opfd;
  280. }
  281. int     __helix_fileno(FILE* stream)
  282. {
  283.     int fd = 0;
  284.     if (stream)
  285.     {
  286.         fd = (OpFsFd)*stream;
  287.     }
  288.     return fd;
  289. }
  290. }  // extern "C"