hxopwavestdio.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:8k
源码类别:

Symbian

开发平台:

Visual C++

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