env_mac.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:6k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Mac environment routines
  3.  *
  4.  * Author: Mark Crispin
  5.  * 6158 Lariat Loop NE
  6.  * Bainbridge Island, WA  98110-2098
  7.  * Internet: MRC@Panda.COM
  8.  *
  9.  * Date: 26 January 1992
  10.  * Last Edited: 28 September 1998
  11.  *
  12.  * Copyright 1998 by Mark Crispin
  13.  *
  14.  *  Permission to use, copy, modify, and distribute this software and its
  15.  * documentation for any purpose and without fee is hereby granted, provided
  16.  * that the above copyright notice appears in all copies and that both the
  17.  * above copyright notices and this permission notice appear in supporting
  18.  * documentation, and that the name of Mark Crispin not be used in advertising
  19.  * or publicity pertaining to distribution of the software without specific,
  20.  * written prior permission.  This software is made available "as is", and
  21.  * MARK CRISPIN DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
  22.  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF
  23.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL
  24.  * MARK CRISPIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
  25.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  26.  * WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT
  27.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  28.  * THIS SOFTWARE.
  29.  *
  30.  */
  31. static char *myHomeDir = NIL; /* home directory name */
  32. static char *myLocalHost = NIL; /* local host name */
  33. static char *myNewsrc = NIL; /* newsrc file name */
  34. /* Environment manipulate parameters
  35.  * Accepts: function code
  36.  *     function-dependent value
  37.  * Returns: function-dependent return value
  38.  */
  39. void *env_parameters (long function,void *value)
  40. {
  41.   char tmp[MAILTMPLEN];
  42.   switch ((int) function) {
  43.   case SET_HOMEDIR:
  44.     if (myHomeDir) fs_give ((void **) &myHomeDir);
  45.     myHomeDir = cpystr ((char *) value);
  46.     break;
  47.   case GET_HOMEDIR:
  48.     if (!myHomeDir) { /* set home directory if not defined */
  49.       myHomeDir = cpystr ("");
  50.     }
  51.     value = (void *) myHomeDir;
  52.     break;
  53.   case SET_LOCALHOST:
  54.     myLocalHost = cpystr ((char *) value);
  55.     break;
  56.   case GET_LOCALHOST:
  57.     value = (void *) myLocalHost ? myLocalHost : "random-mac";
  58.     break;
  59.   case SET_NEWSRC:
  60.     if (myNewsrc) fs_give ((void **) &myNewsrc);
  61.     myNewsrc = cpystr ((char *) value);
  62.     break;
  63.   case GET_NEWSRC:
  64.     if (!myNewsrc) { /* set news file name if not defined */
  65.       sprintf (tmp,"%s:News State",myhomedir ());
  66.       myNewsrc = cpystr (tmp);
  67.     }
  68.     value = (void *) myNewsrc;
  69.     break;
  70.   default:
  71.     value = NIL; /* error case */
  72.     break;
  73.   }
  74.   return value;
  75. }
  76. /* Write current time
  77.  * Accepts: destination string
  78.  *     format of date and time
  79.  *
  80.  * This depends upon the ReadLocation() call in System 7 and the
  81.  * user properly setting his location/timezone in the Map control
  82.  * panel.
  83.  * Nothing is done about the gmtFlags.dlsDelta byte yet, since I
  84.  * don't know how it's supposed to work.
  85.  */
  86. static void do_date (char *date,char *fmt)
  87. {
  88.   long tz,tzm;
  89.   time_t ti = time (0);
  90.   struct tm *t = localtime (&ti);
  91.   MachineLocation loc;
  92.   ReadLocation (&loc); /* get location/timezone poop */
  93. /* get sign-extended time zone */
  94.   tz = (loc.gmtFlags.gmtDelta & 0x00ffffff) |
  95.     ((loc.gmtFlags.gmtDelta & 0x00800000) ? 0xff000000 : 0);
  96.   tz /= 60; /* get timezone in minutes */
  97.   tzm = tz % 60; /* get minutes from the hour */
  98. /* output time */
  99.   strftime (date,MAILTMPLEN,fmt,t);
  100. /* now output time zone */
  101.   sprintf (date += strlen (date),"%+03ld%02ld",tz/60,tzm >= 0 ? tzm : -tzm);
  102. }
  103. /* Write current time in RFC 822 format
  104.  * Accepts: destination string
  105.  */
  106. void rfc822_date (char *date)
  107. {
  108.   do_date (date,"%a, %d %b %Y %H:%M:%S ");
  109. }
  110. /* Write current time in internal format
  111.  * Accepts: destination string
  112.  */
  113. void internal_date (char *date)
  114. {
  115.   do_date (date,"%2d-%b-%Y %H:%M:%S ");
  116. }
  117. /* Return my local host name
  118.  * Returns: my local host name
  119.  */
  120. char *mylocalhost (void)
  121. {
  122.   return (char *) mail_parameters (NIL,GET_LOCALHOST,NIL);
  123. }
  124. /* Return my home directory name
  125.  * Returns: my home directory name
  126.  */
  127. char *myhomedir ()
  128. {
  129.   return (char *) mail_parameters (NIL,GET_HOMEDIR,NIL);
  130. }
  131. /* Determine default prototype stream to user
  132.  * Accepts: type (NIL for create, T for append)
  133.  * Returns: default prototype stream
  134.  */
  135. MAILSTREAM *default_proto (long type)
  136. {
  137.   extern MAILSTREAM dummyproto;
  138.   return &dummyproto; /* return default driver's prototype */
  139. }
  140. /* Block until event satisfied
  141.  * Called as: while (wait_condition && wait ());
  142.  * Returns T if OK, NIL if user wants to abort
  143.  *
  144.  * Allows user to run a desk accessory, select a different window, or go
  145.  * to another application while waiting for the event to finish.  COMMAND/.
  146.  * will abort the wait.
  147.  * Assumes the Apple menu has the apple character as its first character,
  148.  * and that the main program has disabled all other menus.
  149.  */
  150. long wait ()
  151. {
  152.   EventRecord event;
  153.   WindowPtr window;
  154.   MenuInfo **m;
  155.   long r;
  156.   Str255 tmp;
  157. /* wait for an event */
  158.   WaitNextEvent (everyEvent,&event,(long) 6,NIL);
  159.   switch (event.what) { /* got one -- what is it? */
  160.   case mouseDown: /* mouse clicked */
  161.     switch (FindWindow (event.where,&window)) {
  162.     case inMenuBar: /* menu bar item? */
  163. /* yes, interesting event? */
  164.       if (r = MenuSelect (event.where)) {
  165. /* round-about test for Apple menu */
  166.   if ((*(m = GetMHandle (HiWord (r))))->menuData[1] == appleMark) {
  167. /* get desk accessory name */ 
  168.   GetItem (m,LoWord (r),tmp);
  169.   OpenDeskAcc (tmp); /* fire it up */
  170.   SetPort (window); /* put us back at our window */
  171. }
  172. else SysBeep (60); /* the fool forgot to disable it! */
  173.       }
  174.       HiliteMenu (0); /* unhighlight it */
  175.       break;
  176.     case inContent: /* some window was selected */
  177.       if (window != FrontWindow ()) SelectWindow (window);
  178.       break;
  179.     default: /* ignore all others */
  180.       break;
  181.     }
  182.     break;
  183.   case keyDown: /* key hit - if COMMAND/. then punt */
  184.     if ((event.modifiers & cmdKey) && (event.message & charCodeMask) == '.')
  185.       return NIL;
  186.     break;
  187.   default: /* ignore all others */
  188.     break;
  189.   }
  190.   return T; /* try wait test again */
  191. }
  192. /* Return random number
  193.  */
  194. long random ()
  195. {
  196.   return (long) rand () << 16 + rand ();
  197. }
  198. /* Emulator for BSD syslog() routine
  199.  * Accepts: priority
  200.  *     message
  201.  *     parameters
  202.  */
  203. void syslog (int priority,const char *message,...)
  204. {
  205. }
  206. /* Emulator for BSD openlog() routine
  207.  * Accepts: identity
  208.  *     options
  209.  *     facility
  210.  */
  211. void openlog (const char *ident,int logopt,int facility)
  212. {
  213. }