fcntl.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*****************************************************************************/
  2. /* ここから */
  3. /*****************************************************************************/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include "wonx_configure.h"
  7. #include "wonx/fcntl.h"
  8. #include "WonX.h"
  9. /*****************************************************************************/
  10. /* 互換関数の定義 */
  11. /*****************************************************************************/
  12. /*
  13. * void * でデータを渡す関数は,型を間違えるバグが入る可能性があるので,
  14. * void * を適切な型に置き換えてある.
  15. */
  16. /*
  17. * Xサーバとの同期の整合性がとれなくなるなどの問題が考えられるので,
  18. * 互換関数の内部は UNIXTimer_Pause(), UNIXTimer_Unpause() でくくり,
  19. * タイマ割り込みを一時停止して処理を行う.また,unpause するまえに,
  20. * かならず sync するようにする.
  21. */
  22. /*
  23. * タイマの一時停止の2重解除の問題が出てくるので,
  24. * 互換関数から互換関数を呼んではいけない.
  25. * (一時停止はネストされるが,いちおう)
  26. * 似たような処理をする関数の場合は,必ず static な別関数に処理をまとめ,
  27. * そっちを呼び出すようにすること.
  28. * 引数の表示の問題もあるしね.
  29. */
  30. /*
  31. * mmap() が UNIX 標準のものと WonderWitch のものでコンフリクトしてしまうことの
  32. * 対策.具体的な内容や理由は README を参照してください.
  33. */
  34. #if 0
  35. void * wonx_mmap(char * filename);
  36. void * mmap = wonx_mmap;
  37. #endif
  38. #if 0
  39. #ifdef wonx_mmap
  40. #undef wonx_mmap
  41. #endif
  42. #endif
  43. void * wonx_mmap(char * filename)
  44. {
  45. int size = 10;
  46. FILE * fp;
  47. int i, c;
  48. char * p;
  49. void * ret;
  50. if (!WonX_IsCreated()) WonX_Create();
  51. /* タイマを一時停止する */
  52. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  53. printf("call : mmap() : filename = %s\n", filename);
  54. fflush(stdout);
  55. p = (char *)malloc(size);
  56. if (p == NULL) WonX_Error("mmap", "cannot allocate memory.");
  57. fp = fopen(filename, "rb");
  58. if (fp == NULL) WonX_Error("mmap", "cannot open file.");
  59. i = 0;
  60. while ((c = fgetc(fp)) != EOF) {
  61. if (i > size - 1) {
  62. p = (char *)realloc(p, size);
  63. if (p == NULL) WonX_Error("mmap", "cannot reallocate memory.");
  64. }
  65. p[i] = c;
  66. i++;
  67. }
  68. fclose(fp);
  69. ret = p;
  70. WonXDisplay_Sync(WonX_GetWonXDisplay());
  71. printf("call : mmap() : return value = 0x%p\n", ret);
  72. fflush(stdout);
  73. /* タイマをもとに戻す */
  74. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  75. return (ret);
  76. }
  77. /*****************************************************************************/
  78. /* ここまで */
  79. /*****************************************************************************/
  80. /*****************************************************************************/
  81. /* End of File. */
  82. /*****************************************************************************/