home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / String Extractor⁄Localization / Scanner / h+utils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-18  |  5.0 KB  |  248 lines  |  [TEXT/KAHL]

  1. /*    © 1993 Jon Wätte, Stockholm
  2.  *
  3.  *    This is unpublished proprietary source code, and may not be used,
  4.  *    released, copied, stored in a retrieval system, modified or shown
  5.  *    to anyone else without the copyright holders’ prior written
  6.  *    permission.
  7.  *
  8.  *    Denna källkod skyddas av upphovsrätt, och klassas som opublicerat
  9.  *    hemligt material. Ingen användning, kopiering, avskrivning,
  10.  *    vidarebefodring, ändring eller publicering av denna källkod eller
  11.  *    del härav får ske utan att skriftligt tillstånd först erhållits från
  12.  *    upphovsrättsinnehavaren.
  13.  */
  14.  
  15. /*
  16.  * h+utils.c
  17.  *
  18.  * Utilities you usually want
  19.  */
  20.  
  21. #include "h+utils.h"
  22. #include "Exceptions.h"
  23.  
  24.  
  25. char *
  26. cstrcpy ( char * dst , char * src ) {
  27. register char * s = src ;
  28. register char * d = dst ;
  29.  
  30.     while ( * ( d ++ ) = * ( s ++ ) ) ;
  31.     return dst ;
  32. }
  33.  
  34.  
  35. void
  36. DisplayPictureTimeout ( PicHandle pict , short windowID , long timeout , Point textWhere ,
  37.     short justification , unsigned char * text , short font , short size ,
  38.     short transferMode ) {
  39. Rect r ;
  40. long ticks ;
  41. WindowPtr wp ;
  42. EventRecord er ;
  43. GrafPtr gp ;
  44.  
  45.     GetPort ( & gp ) ;
  46.     FlushEvents ( -1 , 0 ) ;
  47.     ticks = TickCount ( ) + timeout ;
  48.  
  49.     wp = GetNewWindow ( windowID , NULL , ( WindowPtr ) -1L ) ;
  50.     if ( ! wp ) {
  51.         SysBeep ( 20 ) ;
  52.         return ;
  53.     }
  54.     SetPort ( wp ) ;
  55.     r = ( * pict ) -> picFrame ;
  56.     SetOrigin ( - r . left , - r . top ) ;
  57.     SizeWindow ( wp , r . right - r . left , r . bottom - r . top , 1 ) ;
  58.     ShowWindow ( wp ) ;
  59.     SetPort ( wp ) ;
  60.     HLock ( ( Handle ) pict ) ;
  61.     DrawPicture ( pict , & ( ( * pict ) -> picFrame ) ) ;
  62.     if ( text ) {
  63.         TextFont ( font ) ;
  64.         TextSize ( size ) ;
  65.         TextMode ( transferMode ) ;
  66.         switch ( justification ) {
  67.         case teJustLeft :
  68.         case teJustCenter :
  69.             textWhere . h = ( ( * pict ) -> picFrame . right + ( * pict ) -> picFrame . left -
  70.                 StringWidth ( text ) ) / 2 ;
  71.             break ;
  72.         case teJustRight :
  73.             textWhere . h = ( * pict ) -> picFrame . right - textWhere . h - StringWidth ( text ) ;
  74.             break ;
  75.         case teForceLeft  :
  76.             textWhere . h += ( * pict ) -> picFrame . left ;
  77.             break ;
  78.         }
  79.         MoveTo ( textWhere . h , textWhere . v ) ;
  80.         DrawString ( text ) ;
  81.     }
  82.  
  83.     while ( TickCount ( ) < ticks ) {
  84.         EventAvail ( keyDownMask + mDownMask , & er ) ;
  85.         if ( er . what == keyDown || er . what == mouseDown ) {
  86.             break ;
  87.         }
  88.     }
  89.     FlushEvents ( keyDownMask + mDownMask , 0 ) ;
  90.     SetWindowPic ( wp , NULL ) ;
  91.     DisposeWindow ( wp ) ;
  92.     SetPort ( gp ) ;
  93. }
  94.  
  95.  
  96. void
  97. _BlockClear ( void * ptr , long size ) {
  98. register long * pp = ( long * ) ptr ;
  99. register long cnt = size ;
  100.  
  101. again :
  102.     if ( cnt < 1 ) {
  103.         ASSERT ( cnt >= 0 ) ;
  104.         return ;
  105.     }
  106.     if ( cnt < 8 ) {
  107.         asm {
  108.             bra.s @test
  109. loop:        clr.b (pp)+
  110. test:        dbra cnt,@loop
  111.         }
  112.         return ;
  113.     }
  114.     if ( ( ( long ) pp ) & 1 ) {
  115.         asm {
  116.             clr.b (pp)+
  117.             subq.l #1,cnt
  118.         }
  119.     }
  120.     if ( ( ( long ) pp ) & 2 ) {
  121.         asm {
  122.             clr.w (pp)+
  123.             subq.l #2,cnt
  124.         }
  125.     }
  126.     while ( cnt & ~3L ) {
  127.         * ( pp ++ ) = 0 ;
  128.         cnt -= 4 ;
  129.     }
  130.     if ( cnt ) {
  131.         goto again ;
  132.     }
  133. }
  134.  
  135.  
  136. short
  137. GetTempFSS ( const FSSpec * oldFile , FSSpec * tempFile ) {
  138. short vRef ;
  139. long parID ;
  140. Str63 name ;
  141. short err ;
  142. short retries = 0 ;
  143. long delayEnd ;
  144.  
  145.     if ( err = FindFolder ( oldFile -> vRefNum , kTemporaryFolderType , kCreateFolder ,
  146.         & vRef , & parID ) ) {
  147.         vRef = oldFile -> vRefNum ;
  148.         parID = oldFile -> parID ;
  149.     }
  150. tryAgain :
  151.     NumToString ( TickCount ( ) , name ) ;
  152.     if ( fnfErr != ( err = FSMakeFSSpec ( vRef , parID , name , tempFile ) ) ) {
  153.         if ( ! err ) {
  154.             if ( retries > 5 ) {
  155.                 return dupFNErr ;
  156.             }
  157.             retries ++ ;
  158.             Delay ( ( Random ( ) & 0x7 ) + 1 , & delayEnd ) ; /* Try to solve collisions in time */
  159.             goto tryAgain ;
  160.         }
  161.         return err ;
  162.     }
  163.     return noErr ;
  164. }
  165.  
  166.  
  167. void
  168. SlateRgn ( RgnHandle rgn , RGBColor medianColor ) {
  169. RgnHandle drw = NewRgn ( ) ;
  170. RGBColor colr = medianColor ;
  171.  
  172.     colr . red = colr . red >> 1 ;
  173.     colr . green = colr . green >> 1 ;
  174.     colr . blue = colr . blue >> 1 ;
  175.     RGBForeColor ( & colr ) ;
  176.     CopyRgn ( rgn , drw ) ;
  177.     OffsetRgn ( drw , -1 , -1 ) ;
  178.     DiffRgn ( rgn , drw , drw ) ;
  179.     PaintRgn ( drw ) ;
  180.  
  181.     colr . red += 0x7fff ;
  182.     colr . green += 0x7fff ;
  183.     colr . blue += 0x7fff ;
  184.     RGBForeColor ( & colr ) ;
  185.     CopyRgn ( rgn , drw ) ;
  186.     OffsetRgn ( drw , 1 , 1 ) ;
  187.     DiffRgn ( rgn , drw , drw ) ;
  188.     PaintRgn ( drw ) ;
  189.  
  190.     DisposeRgn ( drw ) ;
  191. }
  192.  
  193.  
  194. short
  195. PixelDepth ( GDHandle gd ) {
  196. PixMapHandle pmh ;
  197.     if ( ! gd ) {
  198.         return 0 ;
  199.     }
  200.     pmh = ( * gd ) -> gdPMap ;
  201.     if ( ! pmh ) {
  202.         return 0 ;
  203.     }
  204.     return ( * pmh ) -> pixelSize ;
  205. }
  206.  
  207.  
  208. pascal void
  209. FrameItem ( DialogPtr dp , short item ) {
  210. short kind ;
  211. Handle ih ;
  212. Rect where ;
  213.  
  214.     GetDItem ( dp , item , & kind , & ih , & where ) ;
  215.     PenSize ( 3 , 3 ) ;
  216.     FrameRoundRect ( & where , 16 , 16 ) ;
  217.     PenSize ( 1 , 1 ) ;
  218. }
  219.  
  220.  
  221. void
  222. ConcatPStrings ( unsigned char * dest , const unsigned char * from ) {
  223.  
  224. unsigned char * to ;
  225. unsigned char * end ;
  226. unsigned char * fromEnd = end + * end + 1 ;
  227.  
  228.     from ++ ;
  229.     end = dest + 256 ;
  230.     to = dest + * dest + 1 ;
  231.     while ( to < end && from < fromEnd ) {
  232.         * ( to ++ ) = * ( from ++ ) ;
  233.         ( * dest ) ++ ;
  234.     }
  235. }
  236.  
  237.  
  238. void
  239. CopyPString ( const unsigned char * from , unsigned char * to ) {
  240.  
  241. int len = * from ;
  242.  
  243.     while ( len >= 0 ) {
  244.         * ( to ++ ) = * ( from ++ ) ;
  245.         len -- ;
  246.     }
  247. }
  248.