Changeset 52


Ignore:
Timestamp:
12/14/02 06:50:34 (22 years ago)
Author:
Nicholas Riley
Message:

launch 1.0b1.

  • accept "slack" (default http) URLs and email addresses with -l
  • accept input from stdin with '-'
  • open URLs with arbitrary applications when specified without -l
  • builds without compiler warnings
  • added a CFRelease
  • updated README with 10.2 info and new features
Location:
trunk/launch/launch
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/launch/launch

    • Property svn:ignore set to
      build
      .*
  • trunk/launch/launch/README

    r3 r52  
    1 launch 1.0a9 [2 April 2002]
     1launch 1.0b1 [14 December 2002]
    22============
    33
     
    1313with Mac OS X.  It offers few options - launching applications by name
    1414or by path, launching TextEdit, or opening a number of applications,
    15 documents, folders, etc.  With the exception of special support for
     15documents, folders, or URLs.  With the exception of special support for
    1616TextEdit, 'launch' does all this and:
    1717
     
    2323- asks applications to print documents, something the OS X Finder
    2424  no longer permits
     25- allows you to pipe output to GUI applictions
    2526- launches applications in the background
    2627- launches Carbon applications in Classic
     
    6061A Project Builder project, 'launch.pbproj', is included.  A
    6162precompiled binary is also provided.  'launch' was developed and
    62 tested under Mac OS 10.1 and 10.1.1 with the 10.1 Developer Tools, and
    63 does not require any additional software to build.
     63tested under Mac OS 10.2.3 with the December 2002 Developer Tools,
     64and does not require any additional software to build.
    6465
    6566USAGE
     
    6970
    7071Some examples:
    71 
    72 % launch -ni com.apple.iTunes
    73 /Applications/iTunes.app
    74 [hint, hint]
    7572
    7673% launch -c 'R*ch'
     
    8077[BBEdit starts printing test.txt in the background]
    8178
    82 % launch -l http://www.apple.com/
    83 [Your preferred Web browser opens Apple's Web site]
    84 
     79% ls -l | launch -c CWIE
     80[CodeWarrior IDE opens with an untitled document containing the file list]
     81
     82% launch -i org.mozilla.navigator http://www.apple.com/
     83[Chimera Navigator opens Apple's Web site]
     84
     85% launch -l launchsw@sabi.net
     86[Your preferred email client opens a new message to comment on launch]
     87
     88% launch -f /Applications/Preview.app
    8589/Applications/Preview.app: Mac OS X application package
    8690        type: 'APPL'    creator: 'prvw'
     
    109113
    110114
     115Q. Why does application X open a file with a name beginning with
     116'launch-stationery-'? 
     117
     118A. Your application does not support stationery.  Applications which
     119support stationery respond to it by creating a new untitled document
     120with the contents of the stationery.  Most (all?) Cocoa applications,
     121such as TextEdit, do not support stationery.  If you're looking for
     122a text editor which supports stationery, try BBEdit, Tex-Edit Plus,
     123the CodeWarrior IDE, or almost any other Carbon editor.
     124
     125For the curious: launch processes input by simultaneously reading it
     126and writing to a temporary stationery file.  Once reading is complete,
     127launch opens the stationery file with your selected application, and
     128deletes the stationery after one minute (as a safeguard, it is not
     129possible to accurately gauge how long it will take for the application
     130to open the stationery).
     131
     132
    111133Q. Why can't I use -f with -c to get info on an application with a
    112 given creator?
     134given creator (or -f with -i for a bundle ID)?
    113135
    114136A. This feature may be added to a later version (or add it yourself!),
     
    126148
    127149
    128 Q. Why do bundle IDs not work for non-packaged applications?
    129 
    130 A. I think this is a LaunchServices/CFBundle bug.  For example, BBEdit
    131 6.1 for OS X was a packaged application; BBEdit 6.5 is not, however its
    132 'plst' resource contains a bundle ID.  LaunchServices is unable to
    133 locate BBEdit 6.5 by its bundle ID.
    134 
    135 Non-packaged applications usually come from older Mac OS applications,
    136 so they will have creators, which is a workaround (use -c instead of
    137 -i).
     150Q. Why won't launch locate non-packaged applications by their bundle
     151identifier?
     152
     153A. This was a LaunchServices/CFBundle bug, fixed in Mac OS X 10.2.
     154For example, BBEdit 6.1 for OS X was a packaged application; BBEdit
     1556.5 is not, however its 'plst' resource contains a bundle ID.
     156LaunchServices prior to OS X 10.2 was unable to locate BBEdit 6.5 by
     157its bundle ID.
     158
     159Non-packaged applications usually originated as Mac OS applications,
     160so they will have creators.  If you're using Mac OS X 10.1.x, try
     161using the creator instead of the bundle ID as a workaround (-c instead
     162of -i).
     163
     164
     165Q. Why does launch display '[can't access CFBundle for application]'
     166in place of the bundle identifiers of non-packaged applications?
     167
     168A. This is a CFBundle bug which remains as of Mac OS X 10.2.3.  If
     169this matters to you, please ask Apple to fix it, or implement a
     170workaround in launch by parsing the 'plst' id 0 resource directly.
    138171
    139172
     
    191224---------------
    192225
    193 1.0a9 - 2 April 2002 - license, comments changes
    194 1.0a8 - 29 March 2002 - errors with -l (from ICeCoffEE), added rlaunch script
    195 1.0a7 - 3 March 2002 - print dates, sizes, folder valence, locked status for -f,
    196                        don't abort on failure to obtain bundle information
    197 1.0a6 - 30 November 2001 - fixed incorrect messages, broken -u and crash on -nu
    198 1.0a5 - 28 November 2001 - print kind string for -f, still no new installer
    199 1.0a4 - 20 November 2001 - [try to] use Installer VISE instead of InstallAnywhere
    200 1.0a3 - 15 November 2001 - fixed package identification in -f, updated examples
    201 1.0a2 - 15 November 2001 - -f, removed broken -m
    202 1.0a1 - 14 November 2001 - renamed from "FindApp", launch by default, -u
    203 1.0d5 - 7 November 2001 - option -s for launching as root [nonfunctional]
    204 1.0d4 - 6 November 2001 - URL launching and Internet Config support
    205 1.0d3 - 4 November 2001 - more robust, support for docs without app
    206 1.0d2 - 4 November 2001 - options -opsbmhCX, -cin, documents
    207 1.0d1 - 26 August 2001 - returns path of application identified by creator
     2261.0b1 - 14 December 2002
     227 - accept "slack" (default http) URLs and email addresses with -l
     228 - accept input from stdin with '-'
     229 - open URLs with arbitrary applications when specified without -l
     230 - builds without compiler warnings
     2311.0a9 - 2 April 2002
     232 - license, comments changes
     2331.0a8 - 29 March 2002
     234 - errors with -l (from ICeCoffEE), added rlaunch script
     2351.0a7 - 3 March 2002
     236 - print dates, sizes, folder valence, locked status for -f
     237 - don't abort on failure to obtain bundle information
     2381.0a6 - 30 November 2001
     239 - fixed incorrect messages, broken -u and crash on -nu
     2401.0a5 - 28 November 2001
     241 - print kind string for -f, still no new installer
     2421.0a4 - 20 November 2001
     243 - [try to] use Installer VISE instead of InstallAnywhere
     2441.0a3 - 15 November 2001
     245 - fixed package identification in -f, updated examples
     2461.0a2 - 15 November 2001
     247 - -f, removed broken -m
     2481.0a1 - 14 November 2001
     249 - renamed from "FindApp", launch by default, -u
     2501.0d5 - 7 November 2001
     251 - option -s for launching as root [nonfunctional]
     2521.0d4 - 6 November 2001
     253 - URL launching and Internet Config support
     2541.0d3 - 4 November 2001
     255 - more robust, support for docs without app
     2561.0d2 - 4 November 2001
     257 - options -opsbmhCX, -cin, documents
     2581.0d1 - 26 August 2001
     259 - returns path of application identified by creator
  • trunk/launch/launch/VERSION

    r3 r52  
    1 1.0a9
     11.0b1
  • trunk/launch/launch/launch.pbproj/nicholas.pbxuser

    r3 r52  
    22{
    33        08FB7793FE84155DC02AAC07 = {
    4                 activeBuildStyle = 014CEA4A0018CE3211CA2923;
     4                activeBuildStyle = 014CEA490018CE3211CA2923;
    55                activeExecutable = F561F49E0139D79101AEEDB1;
    66                activeTarget = 08FB779FFE84155DC02AAC07;
     
    1010                breakpoints = (
    1111                        F5F4D74101B55E0801AEEDB1,
     12                        E190CFFD03AAA8A300AEFBE0,
    1213                );
    1314                executables = (
     
    1516                );
    1617                perUserDictionary = {
    17                         PBXPerProjectTemplateStateSaveDate = 52114527;
     18                        PBXPerProjectTemplateStateSaveDate = 61528480;
     19                        "PBXTemplateGeometry-F5314676015831810DCA290F" = {
     20                                ContentSize = "{685, 434}";
     21                                LeftSlideOut = {
     22                                        Collapsed = NO;
     23                                        Frame = "{{0, 23}, {685, 411}}";
     24                                        Split0 = {
     25                                                ActiveTab = 2;
     26                                                ActiveTabName = PBXBuildResultsModule;
     27                                                Collapsed = NO;
     28                                                Frame = "{{0, 0}, {685, 411}}";
     29                                                Split0 = {
     30                                                        Frame = "{{0, 191}, {685, 220}}";
     31                                                };
     32                                                SplitCount = 1;
     33                                                Tab0 = {
     34                                                        Frame = "{{0, 0}, {952, 321}}";
     35                                                };
     36                                                Tab1 = {
     37                                                        Debugger = {
     38                                                                Collapsed = NO;
     39                                                                Frame = "{{0, 0}, {781, 452}}";
     40                                                                Split0 = {
     41                                                                        Frame = "{{0, 24}, {781, 428}}";
     42                                                                        Split0 = {
     43                                                                                Frame = "{{0, 0}, {383, 428}}";
     44                                                                        };
     45                                                                        Split1 = {
     46                                                                                DebugVariablesTableConfiguration = (
     47                                                                                        Name,
     48                                                                                        123,
     49                                                                                        Value,
     50                                                                                        85,
     51                                                                                        Summary,
     52                                                                                        155.123,
     53                                                                                );
     54                                                                                Frame = "{{392, 0}, {389, 428}}";
     55                                                                        };
     56                                                                        SplitCount = 2;
     57                                                                };
     58                                                                SplitCount = 1;
     59                                                                Tab0 = {
     60                                                                        Frame = "{{0, 0}, {100, 50}}";
     61                                                                };
     62                                                                Tab1 = {
     63                                                                        Frame = "{{0, 0}, {100, 50}}";
     64                                                                };
     65                                                                TabCount = 2;
     66                                                                TabsVisible = YES;
     67                                                        };
     68                                                        Frame = "{{0, 0}, {781, 452}}";
     69                                                        LauncherConfigVersion = 7;
     70                                                };
     71                                                Tab2 = {
     72                                                        Frame = "{{0, 0}, {685, 215}}";
     73                                                        LauncherConfigVersion = 3;
     74                                                        Runner = {
     75                                                                Frame = "{{0, 0}, {685, 215}}";
     76                                                        };
     77                                                };
     78                                                Tab3 = {
     79                                                        BuildMessageFrame = "{{0, 0}, {687, 152}}";
     80                                                        BuildTranscriptFrame = "{{0, 161}, {687, 2}}";
     81                                                        BuildTranscriptFrameExpanded = YES;
     82                                                        Frame = "{{0, 0}, {685, 185}}";
     83                                                };
     84                                                Tab4 = {
     85                                                        Frame = "{{0, 0}, {612, 295}}";
     86                                                };
     87                                                TabCount = 5;
     88                                                TabsVisible = NO;
     89                                        };
     90                                        SplitCount = 1;
     91                                        Tab0 = {
     92                                                Frame = "{{0, 0}, {300, 533}}";
     93                                                GroupTreeTableConfiguration = (
     94                                                        TargetStatusColumn,
     95                                                        18,
     96                                                        MainColumn,
     97                                                        267,
     98                                                );
     99                                        };
     100                                        Tab1 = {
     101                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     102                                                ClassesTreeTableConfiguration = (
     103                                                        PBXBookColumnIdentifier,
     104                                                        20,
     105                                                        PBXClassColumnIdentifier,
     106                                                        237,
     107                                                );
     108                                                Frame = "{{0, 0}, {278, 659}}";
     109                                                MembersFrame = "{{0, 407}, {280, 252}}";
     110                                                MembersTreeTableConfiguration = (
     111                                                        PBXBookColumnIdentifier,
     112                                                        20,
     113                                                        PBXMethodColumnIdentifier,
     114                                                        236,
     115                                                );
     116                                        };
     117                                        Tab2 = {
     118                                                Frame = "{{0, 0}, {200, 100}}";
     119                                        };
     120                                        Tab3 = {
     121                                                Frame = "{{0, 0}, {200, 100}}";
     122                                                TargetTableConfiguration = (
     123                                                        ActiveObject,
     124                                                        16,
     125                                                        ObjectNames,
     126                                                        202.296,
     127                                                );
     128                                        };
     129                                        Tab4 = {
     130                                                BreakpointsTreeTableConfiguration = (
     131                                                        breakpointColumn,
     132                                                        197,
     133                                                        enabledColumn,
     134                                                        31,
     135                                                );
     136                                                Frame = "{{0, 0}, {250, 100}}";
     137                                        };
     138                                        TabCount = 5;
     139                                        TabsVisible = NO;
     140                                };
     141                                NavBarShownByDefault = YES;
     142                                StatusViewVisible = YES;
     143                                Template = F5314676015831810DCA290F;
     144                                ToolbarVisible = YES;
     145                                WindowLocation = "{29, 98}";
     146                        };
     147                        "PBXTemplateGeometry-F5534CB2020F3F8A0DCA290F" = {
     148                                ContentSize = "{594, 303}";
     149                                LeftSlideOut = {
     150                                        Collapsed = NO;
     151                                        Frame = "{{0, 23}, {594, 280}}";
     152                                        Split0 = {
     153                                                ActiveTab = 1;
     154                                                ActiveTabName = PBXRunSessionModule;
     155                                                Collapsed = YES;
     156                                                Frame = "{{0, 0}, {594, 280}}";
     157                                                Split0 = {
     158                                                        Frame = "{{1e+06, 1e+06}, {594, 0}}";
     159                                                };
     160                                                SplitCount = 1;
     161                                                Tab0 = {
     162                                                        Frame = "{{0, 0}, {804, 321}}";
     163                                                };
     164                                                Tab1 = {
     165                                                        Debugger = {
     166                                                                Collapsed = NO;
     167                                                                Frame = "{{0, 0}, {594, 274}}";
     168                                                                Split0 = {
     169                                                                        Frame = "{{0, 24}, {594, 250}}";
     170                                                                        Split0 = {
     171                                                                                Frame = "{{0, 0}, {290, 250}}";
     172                                                                        };
     173                                                                        Split1 = {
     174                                                                                DebugVariablesTableConfiguration = (
     175                                                                                        Name,
     176                                                                                        123,
     177                                                                                        Value,
     178                                                                                        85,
     179                                                                                        Summary,
     180                                                                                        62.123,
     181                                                                                );
     182                                                                                Frame = "{{299, 0}, {295, 250}}";
     183                                                                        };
     184                                                                        SplitCount = 2;
     185                                                                };
     186                                                                SplitCount = 1;
     187                                                                Tab0 = {
     188                                                                        Frame = "{{0, 0}, {100, 50}}";
     189                                                                };
     190                                                                Tab1 = {
     191                                                                        Frame = "{{0, 0}, {100, 50}}";
     192                                                                };
     193                                                                TabCount = 2;
     194                                                                TabsVisible = YES;
     195                                                        };
     196                                                        Frame = "{{0, 0}, {594, 274}}";
     197                                                        LauncherConfigVersion = 7;
     198                                                };
     199                                                Tab2 = {
     200                                                        Frame = "{{0, 0}, {594, 274}}";
     201                                                        LauncherConfigVersion = 3;
     202                                                        Runner = {
     203                                                                Frame = "{{0, 0}, {594, 274}}";
     204                                                        };
     205                                                };
     206                                                Tab3 = {
     207                                                        BuildMessageFrame = "{{0, 0}, {614, 262}}";
     208                                                        BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
     209                                                        BuildTranscriptFrameExpanded = YES;
     210                                                        Frame = "{{0, 0}, {612, 295}}";
     211                                                };
     212                                                Tab4 = {
     213                                                        Frame = "{{0, 0}, {612, 295}}";
     214                                                };
     215                                                TabCount = 5;
     216                                                TabsVisible = NO;
     217                                        };
     218                                        SplitCount = 1;
     219                                        Tab0 = {
     220                                                Frame = "{{0, 0}, {300, 533}}";
     221                                                GroupTreeTableConfiguration = (
     222                                                        TargetStatusColumn,
     223                                                        18,
     224                                                        MainColumn,
     225                                                        267,
     226                                                );
     227                                        };
     228                                        Tab1 = {
     229                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     230                                                ClassesTreeTableConfiguration = (
     231                                                        PBXBookColumnIdentifier,
     232                                                        20,
     233                                                        PBXClassColumnIdentifier,
     234                                                        237,
     235                                                );
     236                                                Frame = "{{0, 0}, {278, 659}}";
     237                                                MembersFrame = "{{0, 407}, {280, 252}}";
     238                                                MembersTreeTableConfiguration = (
     239                                                        PBXBookColumnIdentifier,
     240                                                        20,
     241                                                        PBXMethodColumnIdentifier,
     242                                                        236,
     243                                                );
     244                                        };
     245                                        Tab2 = {
     246                                                Frame = "{{0, 0}, {200, 100}}";
     247                                        };
     248                                        Tab3 = {
     249                                                Frame = "{{0, 0}, {200, 386}}";
     250                                                TargetTableConfiguration = (
     251                                                        ActiveObject,
     252                                                        16,
     253                                                        ObjectNames,
     254                                                        202.296,
     255                                                );
     256                                        };
     257                                        Tab4 = {
     258                                                BreakpointsTreeTableConfiguration = (
     259                                                        breakpointColumn,
     260                                                        197,
     261                                                        enabledColumn,
     262                                                        31,
     263                                                );
     264                                                Frame = "{{0, 0}, {250, 386}}";
     265                                        };
     266                                        TabCount = 5;
     267                                        TabsVisible = NO;
     268                                };
     269                                NavBarShownByDefault = YES;
     270                                StatusViewVisible = YES;
     271                                Template = F5534CB2020F3F8A0DCA290F;
     272                                ToolbarVisible = YES;
     273                                WindowLocation = "{34, -15}";
     274                        };
     275                        "PBXTemplateGeometry-F5CA7EC9015C08ED0DCA290F" = {
     276                                ContentSize = "{665, 594}";
     277                                LeftSlideOut = {
     278                                        Collapsed = NO;
     279                                        Frame = "{{0, 0}, {665, 594}}";
     280                                        Split0 = {
     281                                                ActiveTab = 3;
     282                                                ActiveTabName = PBXProjectFindModule;
     283                                                Collapsed = NO;
     284                                                Frame = "{{0, 0}, {665, 594}}";
     285                                                Split0 = {
     286                                                        Frame = "{{0, 301}, {665, 293}}";
     287                                                };
     288                                                SplitCount = 1;
     289                                                Tab0 = {
     290                                                        Frame = "{{0, 0}, {484, 208}}";
     291                                                };
     292                                                Tab1 = {
     293                                                        Debugger = {
     294                                                                Collapsed = NO;
     295                                                                Frame = "{{0, 0}, {664, 208}}";
     296                                                                Split0 = {
     297                                                                        Frame = "{{0, 24}, {664, 184}}";
     298                                                                        Split0 = {
     299                                                                                Frame = "{{0, 0}, {325, 184}}";
     300                                                                        };
     301                                                                        Split1 = {
     302                                                                                DebugVariablesTableConfiguration = (
     303                                                                                        Name,
     304                                                                                        123,
     305                                                                                        Value,
     306                                                                                        85,
     307                                                                                        Summary,
     308                                                                                        96.123,
     309                                                                                );
     310                                                                                Frame = "{{334, 0}, {330, 184}}";
     311                                                                        };
     312                                                                        SplitCount = 2;
     313                                                                };
     314                                                                SplitCount = 1;
     315                                                                Tab0 = {
     316                                                                        Frame = "{{0, 0}, {100, 50}}";
     317                                                                };
     318                                                                Tab1 = {
     319                                                                        Frame = "{{0, 0}, {100, 50}}";
     320                                                                };
     321                                                                TabCount = 2;
     322                                                                TabsVisible = YES;
     323                                                        };
     324                                                        Frame = "{{0, 0}, {664, 208}}";
     325                                                        LauncherConfigVersion = 7;
     326                                                };
     327                                                Tab2 = {
     328                                                        Frame = "{{0, 0}, {664, 50}}";
     329                                                        LauncherConfigVersion = 3;
     330                                                        Runner = {
     331                                                                Frame = "{{0, 0}, {664, 50}}";
     332                                                        };
     333                                                };
     334                                                Tab3 = {
     335                                                        BuildMessageFrame = "{{0, 0}, {667, 265}}";
     336                                                        BuildTranscriptFrame = "{{0, 274}, {667, 2}}";
     337                                                        BuildTranscriptFrameExpanded = YES;
     338                                                        Frame = "{{0, 0}, {665, 298}}";
     339                                                };
     340                                                Tab4 = {
     341                                                        Frame = "{{0, 0}, {665, 295}}";
     342                                                };
     343                                                TabCount = 5;
     344                                                TabsVisible = NO;
     345                                        };
     346                                        SplitCount = 1;
     347                                        Tab0 = {
     348                                                Frame = "{{0, 0}, {313, 531}}";
     349                                                GroupTreeTableConfiguration = (
     350                                                        TargetStatusColumn,
     351                                                        18,
     352                                                        MainColumn,
     353                                                        280,
     354                                                );
     355                                        };
     356                                        Tab1 = {
     357                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     358                                                ClassesTreeTableConfiguration = (
     359                                                        PBXBookColumnIdentifier,
     360                                                        20,
     361                                                        PBXClassColumnIdentifier,
     362                                                        237,
     363                                                );
     364                                                Frame = "{{0, 0}, {278, 659}}";
     365                                                MembersFrame = "{{0, 407}, {280, 252}}";
     366                                                MembersTreeTableConfiguration = (
     367                                                        PBXBookColumnIdentifier,
     368                                                        20,
     369                                                        PBXMethodColumnIdentifier,
     370                                                        236,
     371                                                );
     372                                        };
     373                                        Tab2 = {
     374                                                Frame = "{{0, 0}, {200, 100}}";
     375                                        };
     376                                        Tab3 = {
     377                                                Frame = "{{0, 0}, {200, 557}}";
     378                                                TargetTableConfiguration = (
     379                                                        ActiveObject,
     380                                                        16,
     381                                                        ObjectNames,
     382                                                        202.296,
     383                                                );
     384                                        };
     385                                        Tab4 = {
     386                                                BreakpointsTreeTableConfiguration = (
     387                                                        breakpointColumn,
     388                                                        197,
     389                                                        enabledColumn,
     390                                                        31,
     391                                                );
     392                                                Frame = "{{0, 0}, {250, 100}}";
     393                                        };
     394                                        TabCount = 5;
     395                                        TabsVisible = NO;
     396                                };
     397                                NavBarShownByDefault = YES;
     398                                StatusViewVisible = NO;
     399                                Template = F5CA7EC9015C08ED0DCA290F;
     400                                ToolbarVisible = NO;
     401                                WindowLocation = "{293, 27}";
     402                        };
     403                        "PBXTemplateGeometry-F5CA7ECB015C094F0DCA290F" = {
     404                                ContentSize = "{668, 621}";
     405                                LeftSlideOut = {
     406                                        Collapsed = NO;
     407                                        Frame = "{{0, 0}, {668, 621}}";
     408                                        Split0 = {
     409                                                Collapsed = NO;
     410                                                Frame = "{{0, 0}, {668, 621}}";
     411                                                Split0 = {
     412                                                        Frame = "{{0, 0}, {668, 621}}";
     413                                                };
     414                                                SplitCount = 1;
     415                                                Tab0 = {
     416                                                        Frame = "{{0, 0}, {484, 208}}";
     417                                                };
     418                                                Tab1 = {
     419                                                        Debugger = {
     420                                                                Collapsed = NO;
     421                                                                Frame = "{{0, 0}, {664, 208}}";
     422                                                                Split0 = {
     423                                                                        Frame = "{{0, 24}, {664, 184}}";
     424                                                                        Split0 = {
     425                                                                                Frame = "{{0, 0}, {325, 184}}";
     426                                                                        };
     427                                                                        Split1 = {
     428                                                                                DebugVariablesTableConfiguration = (
     429                                                                                        Name,
     430                                                                                        123,
     431                                                                                        Value,
     432                                                                                        85,
     433                                                                                        Summary,
     434                                                                                        96.123,
     435                                                                                );
     436                                                                                Frame = "{{334, 0}, {330, 184}}";
     437                                                                        };
     438                                                                        SplitCount = 2;
     439                                                                };
     440                                                                SplitCount = 1;
     441                                                                Tab0 = {
     442                                                                        Frame = "{{0, 0}, {100, 50}}";
     443                                                                };
     444                                                                Tab1 = {
     445                                                                        Frame = "{{0, 0}, {100, 50}}";
     446                                                                };
     447                                                                TabCount = 2;
     448                                                                TabsVisible = YES;
     449                                                        };
     450                                                        Frame = "{{0, 0}, {664, 208}}";
     451                                                        LauncherConfigVersion = 7;
     452                                                };
     453                                                Tab2 = {
     454                                                        Frame = "{{0, 0}, {664, 50}}";
     455                                                        LauncherConfigVersion = 3;
     456                                                        Runner = {
     457                                                                Frame = "{{0, 0}, {664, 50}}";
     458                                                        };
     459                                                };
     460                                                Tab3 = {
     461                                                        BuildMessageFrame = "{{0, 0}, {614, 262}}";
     462                                                        BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
     463                                                        BuildTranscriptFrameExpanded = YES;
     464                                                        Frame = "{{0, 0}, {612, 295}}";
     465                                                };
     466                                                Tab4 = {
     467                                                        Frame = "{{0, 0}, {612, 295}}";
     468                                                };
     469                                                TabCount = 5;
     470                                                TabsVisible = NO;
     471                                        };
     472                                        SplitCount = 1;
     473                                        Tab0 = {
     474                                                Frame = "{{0, 0}, {313, 531}}";
     475                                                GroupTreeTableConfiguration = (
     476                                                        TargetStatusColumn,
     477                                                        18,
     478                                                        MainColumn,
     479                                                        280,
     480                                                );
     481                                        };
     482                                        Tab1 = {
     483                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     484                                                ClassesTreeTableConfiguration = (
     485                                                        PBXBookColumnIdentifier,
     486                                                        20,
     487                                                        PBXClassColumnIdentifier,
     488                                                        237,
     489                                                );
     490                                                Frame = "{{0, 0}, {278, 659}}";
     491                                                MembersFrame = "{{0, 407}, {280, 252}}";
     492                                                MembersTreeTableConfiguration = (
     493                                                        PBXBookColumnIdentifier,
     494                                                        20,
     495                                                        PBXMethodColumnIdentifier,
     496                                                        236,
     497                                                );
     498                                        };
     499                                        Tab2 = {
     500                                                Frame = "{{0, 0}, {200, 100}}";
     501                                        };
     502                                        Tab3 = {
     503                                                Frame = "{{0, 0}, {200, 557}}";
     504                                                TargetTableConfiguration = (
     505                                                        ActiveObject,
     506                                                        16,
     507                                                        ObjectNames,
     508                                                        202.296,
     509                                                );
     510                                        };
     511                                        Tab4 = {
     512                                                BreakpointsTreeTableConfiguration = (
     513                                                        breakpointColumn,
     514                                                        197,
     515                                                        enabledColumn,
     516                                                        31,
     517                                                );
     518                                                Frame = "{{0, 0}, {250, 100}}";
     519                                        };
     520                                        TabCount = 5;
     521                                        TabsVisible = NO;
     522                                };
     523                                NavBarShownByDefault = YES;
     524                                StatusViewVisible = NO;
     525                                Template = F5CA7ECB015C094F0DCA290F;
     526                                ToolbarVisible = NO;
     527                                WindowLocation = "{615, 189}";
     528                        };
    18529                        PBXWorkspaceContents = (
    19530                                {
     
    22533                                                        Split0 = {
    23534                                                                NavContent0 = {
    24                                                                         bookmark = F5F80FB1031B348401850618;
     535                                                                        bookmark = E190D00A03AAD96100AEFBE0;
    25536                                                                        history = (
    26                                                                                 F5F80FB0031B348401850618,
     537                                                                                E190CFFE03AAD96100AEFBE0,
     538                                                                                E190CFFF03AAD96100AEFBE0,
     539                                                                                E190D00003AAD96100AEFBE0,
     540                                                                                E190D00103AAD96100AEFBE0,
     541                                                                                E190D00203AAD96100AEFBE0,
     542                                                                                E190D00303AAD96100AEFBE0,
     543                                                                        );
     544                                                                        prevStack = (
     545                                                                                E190D00403AAD96100AEFBE0,
     546                                                                                E190D00503AAD96100AEFBE0,
     547                                                                                E190D00603AAD96100AEFBE0,
     548                                                                                E190D00703AAD96100AEFBE0,
     549                                                                                E190D00803AAD96100AEFBE0,
     550                                                                                E190D00903AAD96100AEFBE0,
    27551                                                                        );
    28552                                                                };
    29553                                                                NavCount = 1;
    30554                                                                NavGeometry0 = {
    31                                                                         Frame = "{{0, 0}, {571, 548}}";
     555                                                                        Frame = "{{0, 0}, {738, 554}}";
    32556                                                                        NavBarVisible = YES;
    33557                                                                };
     558                                                                NavSplitVertical = NO;
    34559                                                        };
    35560                                                        SplitCount = 1;
    36                                                         Tab0 = {
     561                                                        Tab1 = {
    37562                                                                Debugger = {
    38563                                                                        Split0 = {
     
    44569                                                                LauncherConfigVersion = 7;
    45570                                                        };
    46                                                         Tab1 = {
     571                                                        Tab2 = {
    47572                                                                LauncherConfigVersion = 3;
    48573                                                                Runner = {
    49574                                                                };
    50575                                                        };
    51                                                         TabCount = 4;
     576                                                        TabCount = 5;
    52577                                                };
    53578                                                SplitCount = 1;
     
    55580                                                        OptionsSetName = "Hierarchy, all classes";
    56581                                                };
    57                                                 Tab3 = {
    58                                                         SplitCount = 2;
    59                                                 };
    60                                                 TabCount = 6;
     582                                                TabCount = 5;
     583                                        };
     584                                },
     585                                {
     586                                        LeftSlideOut = {
     587                                                Split0 = {
     588                                                        Split0 = {
     589                                                                NavCount = 1;
     590                                                                NavGeometry0 = {
     591                                                                        Frame = "{{0, 0}, {685, 220}}";
     592                                                                        NavBarVisible = YES;
     593                                                                };
     594                                                                NavSplitVertical = NO;
     595                                                        };
     596                                                        SplitCount = 1;
     597                                                        Tab1 = {
     598                                                                Debugger = {
     599                                                                        Split0 = {
     600                                                                                SplitCount = 2;
     601                                                                        };
     602                                                                        SplitCount = 1;
     603                                                                        TabCount = 2;
     604                                                                };
     605                                                                LauncherConfigVersion = 7;
     606                                                        };
     607                                                        Tab2 = {
     608                                                                LauncherConfigVersion = 3;
     609                                                                Runner = {
     610                                                                };
     611                                                        };
     612                                                        TabCount = 5;
     613                                                };
     614                                                SplitCount = 1;
     615                                                Tab1 = {
     616                                                        OptionsSetName = "Hierarchy, all classes";
     617                                                };
     618                                                TabCount = 5;
     619                                        };
     620                                },
     621                                {
     622                                        LeftSlideOut = {
     623                                                Split0 = {
     624                                                        Split0 = {
     625                                                                NavCount = 1;
     626                                                                NavGeometry0 = {
     627                                                                        Frame = "{{0, 0}, {594, 150}}";
     628                                                                        NavBarVisible = YES;
     629                                                                };
     630                                                                NavSplitVertical = NO;
     631                                                        };
     632                                                        SplitCount = 1;
     633                                                        Tab1 = {
     634                                                                Debugger = {
     635                                                                        Split0 = {
     636                                                                                SplitCount = 2;
     637                                                                        };
     638                                                                        SplitCount = 1;
     639                                                                        TabCount = 2;
     640                                                                };
     641                                                                LauncherConfigVersion = 7;
     642                                                        };
     643                                                        Tab2 = {
     644                                                                LauncherConfigVersion = 3;
     645                                                                Runner = {
     646                                                                };
     647                                                        };
     648                                                        TabCount = 5;
     649                                                };
     650                                                SplitCount = 1;
     651                                                Tab1 = {
     652                                                        OptionsSetName = "Hierarchy, all classes";
     653                                                };
     654                                                TabCount = 5;
     655                                        };
     656                                },
     657                                {
     658                                        LeftSlideOut = {
     659                                                Split0 = {
     660                                                        Split0 = {
     661                                                                NavContent0 = {
     662                                                                        bookmark = E190D00C03AAD96100AEFBE0;
     663                                                                        history = (
     664                                                                                E190D00B03AAD96100AEFBE0,
     665                                                                        );
     666                                                                };
     667                                                                NavCount = 1;
     668                                                                NavGeometry0 = {
     669                                                                        Frame = "{{0, 0}, {668, 621}}";
     670                                                                        NavBarVisible = YES;
     671                                                                };
     672                                                                NavSplitVertical = NO;
     673                                                        };
     674                                                        SplitCount = 1;
     675                                                        Tab1 = {
     676                                                                Debugger = {
     677                                                                        Split0 = {
     678                                                                                SplitCount = 2;
     679                                                                        };
     680                                                                        SplitCount = 1;
     681                                                                        TabCount = 2;
     682                                                                };
     683                                                                LauncherConfigVersion = 7;
     684                                                        };
     685                                                        Tab2 = {
     686                                                                LauncherConfigVersion = 3;
     687                                                                Runner = {
     688                                                                };
     689                                                        };
     690                                                        TabCount = 5;
     691                                                };
     692                                                SplitCount = 1;
     693                                                Tab1 = {
     694                                                        OptionsSetName = "Hierarchy, all classes";
     695                                                };
     696                                                TabCount = 5;
    61697                                        };
    62698                                },
     
    64700                        PBXWorkspaceGeometries = (
    65701                                {
    66                                         ContentSize = "{855, 571}";
     702                                        ContentSize = "{1001, 577}";
    67703                                        LeftSlideOut = {
    68                                                 ActiveTab = 0;
     704                                                ActiveTab = 3;
     705                                                ActiveTabName = PBXTargetTreeModule;
    69706                                                Collapsed = NO;
    70                                                 Frame = "{{0, 23}, {855, 548}}";
     707                                                Frame = "{{0, 23}, {1001, 554}}";
    71708                                                Split0 = {
    72709                                                        Collapsed = NO;
    73                                                         Frame = "{{284, 0}, {571, 548}}";
     710                                                        Frame = "{{263, 0}, {738, 554}}";
    74711                                                        Split0 = {
    75                                                                 Frame = "{{0, 0}, {571, 548}}";
     712                                                                Frame = "{{0, 0}, {738, 554}}";
    76713                                                        };
    77714                                                        SplitCount = 1;
    78715                                                        Tab0 = {
     716                                                                Frame = "{{0, 0}, {681, 289}}";
     717                                                        };
     718                                                        Tab1 = {
    79719                                                                Debugger = {
    80720                                                                        Collapsed = NO;
    81                                                                         Frame = "{{0, 0}, {681, 289}}";
     721                                                                        Frame = "{{0, 0}, {681, 150}}";
    82722                                                                        Split0 = {
    83                                                                                 Frame = "{{0, 24}, {681, 265}}";
     723                                                                                Frame = "{{0, 24}, {681, 126}}";
    84724                                                                                Split0 = {
    85                                                                                         Frame = "{{0, 0}, {333, 265}}";
     725                                                                                        Frame = "{{0, 0}, {333, 126}}";
    86726                                                                                };
    87727                                                                                Split1 = {
    88728                                                                                        DebugVariablesTableConfiguration = (
    89729                                                                                                Name,
    90                                                                                                 82.80298,
     730                                                                                                123,
    91731                                                                                                Value,
    92                                                                                                 104.074,
     732                                                                                                85,
    93733                                                                                                Summary,
    94                                                                                                 126.123,
     734                                                                                                105.123,
    95735                                                                                        );
    96                                                                                         Frame = "{{342, 0}, {339, 265}}";
     736                                                                                        Frame = "{{342, 0}, {339, 126}}";
    97737                                                                                };
    98738                                                                                SplitCount = 2;
     
    108748                                                                        TabsVisible = YES;
    109749                                                                };
    110                                                                 Frame = "{{0, 0}, {681, 289}}";
     750                                                                Frame = "{{0, 0}, {681, 120}}";
    111751                                                                LauncherConfigVersion = 7;
    112752                                                        };
    113                                                         Tab1 = {
    114                                                                 Frame = "{{0, 0}, {681, 120}}";
     753                                                        Tab2 = {
     754                                                                Frame = "{{0, 0}, {681, 234}}";
    115755                                                                LauncherConfigVersion = 3;
    116756                                                                Runner = {
    117                                                                         Frame = "{{0, 0}, {681, 120}}";
    118                                                                 };
    119                                                         };
    120                                                         Tab2 = {
    121                                                                 BuildMessageFrame = "{{0, 0}, {683, 127}}";
    122                                                                 BuildTranscriptFrame = "{{0, 136}, {683, 100}}";
    123                                                                 Frame = "{{0, 0}, {681, 234}}";
     757                                                                        Frame = "{{0, 0}, {681, 234}}";
     758                                                                };
    124759                                                        };
    125760                                                        Tab3 = {
     761                                                                BuildMessageFrame = "{{0, 0}, {683, 205}}";
     762                                                                BuildTranscriptFrame = "{{0, 214}, {683, 2}}";
     763                                                                BuildTranscriptFrameExpanded = YES;
    126764                                                                Frame = "{{0, 0}, {681, 238}}";
    127765                                                        };
    128                                                         TabCount = 4;
     766                                                        Tab4 = {
     767                                                                Frame = "{{0, 0}, {612, 295}}";
     768                                                        };
     769                                                        TabCount = 5;
    129770                                                        TabsVisible = NO;
    130771                                                };
    131772                                                SplitCount = 1;
    132773                                                Tab0 = {
    133                                                         Frame = "{{0, 0}, {260, 548}}";
     774                                                        Frame = "{{0, 0}, {260, 554}}";
    134775                                                        GroupTreeTableConfiguration = (
    135776                                                                TargetStatusColumn,
     
    157798                                                };
    158799                                                Tab2 = {
    159                                                         Frame = "{{0, 0}, {217, 554}}";
     800                                                        Frame = "{{0, 0}, {216, 554}}";
    160801                                                };
    161802                                                Tab3 = {
    162803                                                        Frame = "{{0, 0}, {239, 554}}";
    163                                                         Split0 = {
    164                                                                 Frame = "{{0, 0}, {239, 268}}";
    165                                                                 TargetTreeTableConfiguration = (
    166                                                                         ActiveTarget,
    167                                                                         16,
    168                                                                         TargetName,
    169                                                                         207,
    170                                                                 );
    171                                                         };
    172                                                         Split1 = {
    173                                                                 BuildStyleTreeTableConfiguration = (
    174                                                                         IsActive,
    175                                                                         16,
    176                                                                         Name,
    177                                                                         208,
    178                                                                 );
    179                                                                 Frame = "{{0, 277}, {239, 277}}";
    180                                                         };
    181                                                         SplitCount = 2;
     804                                                        TargetTableConfiguration = (
     805                                                                ActiveObject,
     806                                                                16,
     807                                                                ObjectNames,
     808                                                                206.296,
     809                                                        );
    182810                                                };
    183811                                                Tab4 = {
    184                                                         ExecutableTreeTableConfiguration = (
    185                                                                 ActiveExecutable,
    186                                                                 16,
    187                                                                 ExecutableName,
    188                                                                 217,
    189                                                         );
    190                                                         Frame = "{{0, 0}, {250, 554}}";
    191                                                 };
    192                                                 Tab5 = {
    193812                                                        BreakpointsTreeTableConfiguration = (
    194813                                                                breakpointColumn,
     
    199818                                                        Frame = "{{0, 0}, {250, 554}}";
    200819                                                };
    201                                                 TabCount = 6;
     820                                                TabCount = 5;
    202821                                                TabsVisible = YES;
    203822                                        };
     823                                        NavBarShownByDefault = YES;
    204824                                        StatusViewVisible = YES;
    205825                                        Template = 64ABBB4501FA494900185B06;
    206826                                        ToolbarVisible = YES;
    207                                         WindowLocation = "{5, 199}";
     827                                        WindowLocation = "{5, 193}";
     828                                },
     829                                {
     830                                        ContentSize = "{685, 434}";
     831                                        LeftSlideOut = {
     832                                                Collapsed = NO;
     833                                                Frame = "{{0, 23}, {685, 411}}";
     834                                                Split0 = {
     835                                                        ActiveTab = 2;
     836                                                        ActiveTabName = PBXBuildResultsModule;
     837                                                        Collapsed = NO;
     838                                                        Frame = "{{0, 0}, {685, 411}}";
     839                                                        Split0 = {
     840                                                                Frame = "{{0, 191}, {685, 220}}";
     841                                                        };
     842                                                        SplitCount = 1;
     843                                                        Tab0 = {
     844                                                                Frame = "{{0, 0}, {952, 321}}";
     845                                                        };
     846                                                        Tab1 = {
     847                                                                Debugger = {
     848                                                                        Collapsed = NO;
     849                                                                        Frame = "{{0, 0}, {781, 452}}";
     850                                                                        Split0 = {
     851                                                                                Frame = "{{0, 24}, {781, 428}}";
     852                                                                                Split0 = {
     853                                                                                        Frame = "{{0, 0}, {383, 428}}";
     854                                                                                };
     855                                                                                Split1 = {
     856                                                                                        DebugVariablesTableConfiguration = (
     857                                                                                                Name,
     858                                                                                                123,
     859                                                                                                Value,
     860                                                                                                85,
     861                                                                                                Summary,
     862                                                                                                155.123,
     863                                                                                        );
     864                                                                                        Frame = "{{392, 0}, {389, 428}}";
     865                                                                                };
     866                                                                                SplitCount = 2;
     867                                                                        };
     868                                                                        SplitCount = 1;
     869                                                                        Tab0 = {
     870                                                                                Frame = "{{0, 0}, {100, 50}}";
     871                                                                        };
     872                                                                        Tab1 = {
     873                                                                                Frame = "{{0, 0}, {100, 50}}";
     874                                                                        };
     875                                                                        TabCount = 2;
     876                                                                        TabsVisible = YES;
     877                                                                };
     878                                                                Frame = "{{0, 0}, {781, 452}}";
     879                                                                LauncherConfigVersion = 7;
     880                                                        };
     881                                                        Tab2 = {
     882                                                                Frame = "{{0, 0}, {685, 215}}";
     883                                                                LauncherConfigVersion = 3;
     884                                                                Runner = {
     885                                                                        Frame = "{{0, 0}, {685, 215}}";
     886                                                                };
     887                                                        };
     888                                                        Tab3 = {
     889                                                                BuildMessageFrame = "{{0, 0}, {687, 152}}";
     890                                                                BuildTranscriptFrame = "{{0, 161}, {687, 2}}";
     891                                                                BuildTranscriptFrameExpanded = YES;
     892                                                                Frame = "{{0, 0}, {685, 185}}";
     893                                                        };
     894                                                        Tab4 = {
     895                                                                Frame = "{{0, 0}, {612, 295}}";
     896                                                        };
     897                                                        TabCount = 5;
     898                                                        TabsVisible = NO;
     899                                                };
     900                                                SplitCount = 1;
     901                                                Tab0 = {
     902                                                        Frame = "{{0, 0}, {300, 533}}";
     903                                                        GroupTreeTableConfiguration = (
     904                                                                TargetStatusColumn,
     905                                                                18,
     906                                                                MainColumn,
     907                                                                267,
     908                                                        );
     909                                                };
     910                                                Tab1 = {
     911                                                        ClassesFrame = "{{0, 0}, {280, 398}}";
     912                                                        ClassesTreeTableConfiguration = (
     913                                                                PBXBookColumnIdentifier,
     914                                                                20,
     915                                                                PBXClassColumnIdentifier,
     916                                                                237,
     917                                                        );
     918                                                        Frame = "{{0, 0}, {278, 659}}";
     919                                                        MembersFrame = "{{0, 407}, {280, 252}}";
     920                                                        MembersTreeTableConfiguration = (
     921                                                                PBXBookColumnIdentifier,
     922                                                                20,
     923                                                                PBXMethodColumnIdentifier,
     924                                                                236,
     925                                                        );
     926                                                };
     927                                                Tab2 = {
     928                                                        Frame = "{{0, 0}, {200, 100}}";
     929                                                };
     930                                                Tab3 = {
     931                                                        Frame = "{{0, 0}, {200, 100}}";
     932                                                        TargetTableConfiguration = (
     933                                                                ActiveObject,
     934                                                                16,
     935                                                                ObjectNames,
     936                                                                202.296,
     937                                                        );
     938                                                };
     939                                                Tab4 = {
     940                                                        BreakpointsTreeTableConfiguration = (
     941                                                                breakpointColumn,
     942                                                                197,
     943                                                                enabledColumn,
     944                                                                31,
     945                                                        );
     946                                                        Frame = "{{0, 0}, {250, 100}}";
     947                                                };
     948                                                TabCount = 5;
     949                                                TabsVisible = NO;
     950                                        };
     951                                        NavBarShownByDefault = YES;
     952                                        StatusViewVisible = YES;
     953                                        Template = F5314676015831810DCA290F;
     954                                        ToolbarVisible = YES;
     955                                        WindowLocation = "{29, 98}";
     956                                },
     957                                {
     958                                        ContentSize = "{594, 303}";
     959                                        LeftSlideOut = {
     960                                                Collapsed = NO;
     961                                                Frame = "{{0, 23}, {594, 280}}";
     962                                                Split0 = {
     963                                                        ActiveTab = 1;
     964                                                        ActiveTabName = PBXRunSessionModule;
     965                                                        Collapsed = YES;
     966                                                        Frame = "{{0, 0}, {594, 280}}";
     967                                                        Split0 = {
     968                                                                Frame = "{{1e+06, 1e+06}, {594, 27}}";
     969                                                        };
     970                                                        SplitCount = 1;
     971                                                        Tab0 = {
     972                                                                Frame = "{{0, 0}, {804, 321}}";
     973                                                        };
     974                                                        Tab1 = {
     975                                                                Debugger = {
     976                                                                        Collapsed = NO;
     977                                                                        Frame = "{{0, 0}, {594, 274}}";
     978                                                                        Split0 = {
     979                                                                                Frame = "{{0, 24}, {594, 250}}";
     980                                                                                Split0 = {
     981                                                                                        Frame = "{{0, 0}, {290, 250}}";
     982                                                                                };
     983                                                                                Split1 = {
     984                                                                                        DebugVariablesTableConfiguration = (
     985                                                                                                Name,
     986                                                                                                123,
     987                                                                                                Value,
     988                                                                                                85,
     989                                                                                                Summary,
     990                                                                                                62.123,
     991                                                                                        );
     992                                                                                        Frame = "{{299, 0}, {295, 250}}";
     993                                                                                };
     994                                                                                SplitCount = 2;
     995                                                                        };
     996                                                                        SplitCount = 1;
     997                                                                        Tab0 = {
     998                                                                                Frame = "{{0, 0}, {100, 50}}";
     999                                                                        };
     1000                                                                        Tab1 = {
     1001                                                                                Frame = "{{0, 0}, {100, 50}}";
     1002                                                                        };
     1003                                                                        TabCount = 2;
     1004                                                                        TabsVisible = YES;
     1005                                                                };
     1006                                                                Frame = "{{0, 0}, {594, 274}}";
     1007                                                                LauncherConfigVersion = 7;
     1008                                                        };
     1009                                                        Tab2 = {
     1010                                                                Frame = "{{0, 0}, {594, 274}}";
     1011                                                                LauncherConfigVersion = 3;
     1012                                                                Runner = {
     1013                                                                        Frame = "{{0, 0}, {594, 274}}";
     1014                                                                };
     1015                                                        };
     1016                                                        Tab3 = {
     1017                                                                BuildMessageFrame = "{{0, 0}, {614, 262}}";
     1018                                                                BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
     1019                                                                BuildTranscriptFrameExpanded = YES;
     1020                                                                Frame = "{{0, 0}, {612, 295}}";
     1021                                                        };
     1022                                                        Tab4 = {
     1023                                                                Frame = "{{0, 0}, {612, 295}}";
     1024                                                        };
     1025                                                        TabCount = 5;
     1026                                                        TabsVisible = NO;
     1027                                                };
     1028                                                SplitCount = 1;
     1029                                                Tab0 = {
     1030                                                        Frame = "{{0, 0}, {300, 533}}";
     1031                                                        GroupTreeTableConfiguration = (
     1032                                                                TargetStatusColumn,
     1033                                                                18,
     1034                                                                MainColumn,
     1035                                                                267,
     1036                                                        );
     1037                                                };
     1038                                                Tab1 = {
     1039                                                        ClassesFrame = "{{0, 0}, {280, 398}}";
     1040                                                        ClassesTreeTableConfiguration = (
     1041                                                                PBXBookColumnIdentifier,
     1042                                                                20,
     1043                                                                PBXClassColumnIdentifier,
     1044                                                                237,
     1045                                                        );
     1046                                                        Frame = "{{0, 0}, {278, 659}}";
     1047                                                        MembersFrame = "{{0, 407}, {280, 252}}";
     1048                                                        MembersTreeTableConfiguration = (
     1049                                                                PBXBookColumnIdentifier,
     1050                                                                20,
     1051                                                                PBXMethodColumnIdentifier,
     1052                                                                236,
     1053                                                        );
     1054                                                };
     1055                                                Tab2 = {
     1056                                                        Frame = "{{0, 0}, {200, 100}}";
     1057                                                };
     1058                                                Tab3 = {
     1059                                                        Frame = "{{0, 0}, {200, 386}}";
     1060                                                        TargetTableConfiguration = (
     1061                                                                ActiveObject,
     1062                                                                16,
     1063                                                                ObjectNames,
     1064                                                                202.296,
     1065                                                        );
     1066                                                };
     1067                                                Tab4 = {
     1068                                                        BreakpointsTreeTableConfiguration = (
     1069                                                                breakpointColumn,
     1070                                                                197,
     1071                                                                enabledColumn,
     1072                                                                31,
     1073                                                        );
     1074                                                        Frame = "{{0, 0}, {250, 386}}";
     1075                                                };
     1076                                                TabCount = 5;
     1077                                                TabsVisible = NO;
     1078                                        };
     1079                                        NavBarShownByDefault = YES;
     1080                                        StatusViewVisible = YES;
     1081                                        Template = F5534CB2020F3F8A0DCA290F;
     1082                                        ToolbarVisible = YES;
     1083                                        WindowLocation = "{34, -15}";
     1084                                },
     1085                                {
     1086                                        ContentSize = "{668, 621}";
     1087                                        LeftSlideOut = {
     1088                                                Collapsed = NO;
     1089                                                Frame = "{{0, 0}, {668, 621}}";
     1090                                                Split0 = {
     1091                                                        Collapsed = NO;
     1092                                                        Frame = "{{0, 0}, {668, 621}}";
     1093                                                        Split0 = {
     1094                                                                Frame = "{{0, 0}, {668, 621}}";
     1095                                                        };
     1096                                                        SplitCount = 1;
     1097                                                        Tab0 = {
     1098                                                                Frame = "{{0, 0}, {484, 208}}";
     1099                                                        };
     1100                                                        Tab1 = {
     1101                                                                Debugger = {
     1102                                                                        Collapsed = NO;
     1103                                                                        Frame = "{{0, 0}, {664, 208}}";
     1104                                                                        Split0 = {
     1105                                                                                Frame = "{{0, 24}, {664, 184}}";
     1106                                                                                Split0 = {
     1107                                                                                        Frame = "{{0, 0}, {325, 184}}";
     1108                                                                                };
     1109                                                                                Split1 = {
     1110                                                                                        DebugVariablesTableConfiguration = (
     1111                                                                                                Name,
     1112                                                                                                123,
     1113                                                                                                Value,
     1114                                                                                                85,
     1115                                                                                                Summary,
     1116                                                                                                96.123,
     1117                                                                                        );
     1118                                                                                        Frame = "{{334, 0}, {330, 184}}";
     1119                                                                                };
     1120                                                                                SplitCount = 2;
     1121                                                                        };
     1122                                                                        SplitCount = 1;
     1123                                                                        Tab0 = {
     1124                                                                                Frame = "{{0, 0}, {100, 50}}";
     1125                                                                        };
     1126                                                                        Tab1 = {
     1127                                                                                Frame = "{{0, 0}, {100, 50}}";
     1128                                                                        };
     1129                                                                        TabCount = 2;
     1130                                                                        TabsVisible = YES;
     1131                                                                };
     1132                                                                Frame = "{{0, 0}, {664, 208}}";
     1133                                                                LauncherConfigVersion = 7;
     1134                                                        };
     1135                                                        Tab2 = {
     1136                                                                Frame = "{{0, 0}, {664, 50}}";
     1137                                                                LauncherConfigVersion = 3;
     1138                                                                Runner = {
     1139                                                                        Frame = "{{0, 0}, {664, 50}}";
     1140                                                                };
     1141                                                        };
     1142                                                        Tab3 = {
     1143                                                                BuildMessageFrame = "{{0, 0}, {614, 262}}";
     1144                                                                BuildTranscriptFrame = "{{0, 271}, {614, 2}}";
     1145                                                                BuildTranscriptFrameExpanded = YES;
     1146                                                                Frame = "{{0, 0}, {612, 295}}";
     1147                                                        };
     1148                                                        Tab4 = {
     1149                                                                Frame = "{{0, 0}, {612, 295}}";
     1150                                                        };
     1151                                                        TabCount = 5;
     1152                                                        TabsVisible = NO;
     1153                                                };
     1154                                                SplitCount = 1;
     1155                                                Tab0 = {
     1156                                                        Frame = "{{0, 0}, {313, 531}}";
     1157                                                        GroupTreeTableConfiguration = (
     1158                                                                TargetStatusColumn,
     1159                                                                18,
     1160                                                                MainColumn,
     1161                                                                280,
     1162                                                        );
     1163                                                };
     1164                                                Tab1 = {
     1165                                                        ClassesFrame = "{{0, 0}, {280, 398}}";
     1166                                                        ClassesTreeTableConfiguration = (
     1167                                                                PBXBookColumnIdentifier,
     1168                                                                20,
     1169                                                                PBXClassColumnIdentifier,
     1170                                                                237,
     1171                                                        );
     1172                                                        Frame = "{{0, 0}, {278, 659}}";
     1173                                                        MembersFrame = "{{0, 407}, {280, 252}}";
     1174                                                        MembersTreeTableConfiguration = (
     1175                                                                PBXBookColumnIdentifier,
     1176                                                                20,
     1177                                                                PBXMethodColumnIdentifier,
     1178                                                                236,
     1179                                                        );
     1180                                                };
     1181                                                Tab2 = {
     1182                                                        Frame = "{{0, 0}, {200, 100}}";
     1183                                                };
     1184                                                Tab3 = {
     1185                                                        Frame = "{{0, 0}, {200, 557}}";
     1186                                                        TargetTableConfiguration = (
     1187                                                                ActiveObject,
     1188                                                                16,
     1189                                                                ObjectNames,
     1190                                                                202.296,
     1191                                                        );
     1192                                                };
     1193                                                Tab4 = {
     1194                                                        BreakpointsTreeTableConfiguration = (
     1195                                                                breakpointColumn,
     1196                                                                197,
     1197                                                                enabledColumn,
     1198                                                                31,
     1199                                                        );
     1200                                                        Frame = "{{0, 0}, {250, 100}}";
     1201                                                };
     1202                                                TabCount = 5;
     1203                                                TabsVisible = NO;
     1204                                        };
     1205                                        NavBarShownByDefault = YES;
     1206                                        StatusViewVisible = NO;
     1207                                        Template = F5CA7ECB015C094F0DCA290F;
     1208                                        ToolbarVisible = NO;
     1209                                        WindowLocation = "{48, 189}";
    2081210                                },
    2091211                        );
    210                         PBXWorkspaceStateSaveDate = 52114527;
     1212                        PBXWorkspaceStateSaveDate = 61528480;
    2111213                };
    2121214                perUserProjectItems = {
    213                         F5F80FB0031B348401850618 = F5F80FB0031B348401850618;
    214                         F5F80FB1031B348401850618 = F5F80FB1031B348401850618;
     1215                        E190CFFE03AAD96100AEFBE0 = E190CFFE03AAD96100AEFBE0;
     1216                        E190CFFF03AAD96100AEFBE0 = E190CFFF03AAD96100AEFBE0;
     1217                        E190D00003AAD96100AEFBE0 = E190D00003AAD96100AEFBE0;
     1218                        E190D00103AAD96100AEFBE0 = E190D00103AAD96100AEFBE0;
     1219                        E190D00203AAD96100AEFBE0 = E190D00203AAD96100AEFBE0;
     1220                        E190D00303AAD96100AEFBE0 = E190D00303AAD96100AEFBE0;
     1221                        E190D00403AAD96100AEFBE0 = E190D00403AAD96100AEFBE0;
     1222                        E190D00503AAD96100AEFBE0 = E190D00503AAD96100AEFBE0;
     1223                        E190D00603AAD96100AEFBE0 = E190D00603AAD96100AEFBE0;
     1224                        E190D00703AAD96100AEFBE0 = E190D00703AAD96100AEFBE0;
     1225                        E190D00803AAD96100AEFBE0 = E190D00803AAD96100AEFBE0;
     1226                        E190D00903AAD96100AEFBE0 = E190D00903AAD96100AEFBE0;
     1227                        E190D00A03AAD96100AEFBE0 = E190D00A03AAD96100AEFBE0;
     1228                        E190D00B03AAD96100AEFBE0 = E190D00B03AAD96100AEFBE0;
     1229                        E190D00C03AAD96100AEFBE0 = E190D00C03AAD96100AEFBE0;
    2151230                };
    2161231                projectwideBuildSettings = {
    2171232                };
     1233                userBookmarkGroup = E190CFF903AAA80600AEFBE0;
    2181234                wantsIndex = 1;
    2191235                wantsSCM = 0;
     
    2301246                );
    2311247        };
     1248        E190CFF903AAA80600AEFBE0 = {
     1249                children = (
     1250                        E190CFFB03AAA84B00AEFBE0,
     1251                );
     1252                isa = PBXBookmarkGroup;
     1253                name = Root;
     1254        };
     1255        E190CFFB03AAA84B00AEFBE0 = {
     1256                fRef = 08FB7796FE84155DC02AAC07;
     1257                isa = PBXTextBookmark;
     1258                name = "handle URL/file arguments";
     1259                rLen = 0;
     1260                rLoc = 17800;
     1261                rType = 0;
     1262                vrLen = 1773;
     1263                vrLoc = 14523;
     1264        };
     1265        E190CFFD03AAA8A300AEFBE0 = {
     1266                fileReference = 08FB7796FE84155DC02AAC07;
     1267                isa = PBXFileBreakpoint;
     1268                lineNumber = 479;
     1269                state = 1;
     1270        };
     1271        E190CFFE03AAD96100AEFBE0 = {
     1272                isa = PBXTargetBookmark;
     1273                trg = 08FB779FFE84155DC02AAC07;
     1274        };
     1275        E190CFFF03AAD96100AEFBE0 = {
     1276                exec = F561F49E0139D79101AEEDB1;
     1277                isa = PBXExecutableBookmark;
     1278        };
     1279        E190D00003AAD96100AEFBE0 = {
     1280                fRef = E190D00D03AAD96100AEFBE0;
     1281                isa = PBXTextBookmark;
     1282                name = "CFString.h: 146";
     1283                rLen = 25;
     1284                rLoc = 6754;
     1285                rType = 0;
     1286                vrLen = 1812;
     1287                vrLoc = 6085;
     1288        };
     1289        E190D00103AAD96100AEFBE0 = {
     1290                fRef = F5C0CA9501B5740C01AEEDB1;
     1291                isa = PBXTextBookmark;
     1292                name = "README: 76";
     1293                rLen = 0;
     1294                rLoc = 2559;
     1295                rType = 0;
     1296                vrLen = 988;
     1297                vrLoc = 2260;
     1298        };
     1299        E190D00203AAD96100AEFBE0 = {
     1300                fRef = E190D00E03AAD96100AEFBE0;
     1301                glyphRangeLength = 886;
     1302                glyphRangeLocation = 314;
     1303                isa = PBXDocBookmark;
     1304                name = "Miscellaneous234567891011.html: Adds the val...";
     1305        };
     1306        E190D00303AAD96100AEFBE0 = {
     1307                fRef = E190D00F03AAD96100AEFBE0;
     1308                glyphRangeLength = 682;
     1309                glyphRangeLocation = 46353;
     1310                isa = PBXDocBookmark;
     1311                name = "Miscellaneous.html: Creates an i...";
     1312        };
     1313        E190D00403AAD96100AEFBE0 = {
     1314                isa = PBXTargetBookmark;
     1315                trg = 08FB779FFE84155DC02AAC07;
     1316        };
     1317        E190D00503AAD96100AEFBE0 = {
     1318                exec = F561F49E0139D79101AEEDB1;
     1319                isa = PBXExecutableBookmark;
     1320        };
     1321        E190D00603AAD96100AEFBE0 = {
     1322                isa = PBXTargetBookmark;
     1323                trg = 08FB779FFE84155DC02AAC07;
     1324        };
     1325        E190D00703AAD96100AEFBE0 = {
     1326                isa = PBXTargetBookmark;
     1327                trg = 08FB779FFE84155DC02AAC07;
     1328        };
     1329        E190D00803AAD96100AEFBE0 = {
     1330                exec = F561F49E0139D79101AEEDB1;
     1331                isa = PBXExecutableBookmark;
     1332        };
     1333        E190D00903AAD96100AEFBE0 = {
     1334                fRef = E190D01003AAD96100AEFBE0;
     1335                isa = PBXTextBookmark;
     1336                name = "CFString.h: 146";
     1337                rLen = 25;
     1338                rLoc = 6754;
     1339                rType = 0;
     1340                vrLen = 1812;
     1341                vrLoc = 6085;
     1342        };
     1343        E190D00A03AAD96100AEFBE0 = {
     1344                fRef = E190D01103AAD96100AEFBE0;
     1345                glyphRangeLength = 682;
     1346                glyphRangeLocation = 46353;
     1347                isa = PBXDocBookmark;
     1348                name = "Miscellaneous.html: Creates an i...";
     1349        };
     1350        E190D00B03AAD96100AEFBE0 = {
     1351                fRef = F5C0CA9501B5740C01AEEDB1;
     1352                isa = PBXBookmark;
     1353        };
     1354        E190D00C03AAD96100AEFBE0 = {
     1355                fRef = F5C0CA9501B5740C01AEEDB1;
     1356                isa = PBXTextBookmark;
     1357                name = "README: 194";
     1358                rLen = 0;
     1359                rLoc = 6232;
     1360                rType = 0;
     1361                vrLen = 1727;
     1362                vrLoc = 5501;
     1363        };
     1364        E190D00D03AAD96100AEFBE0 = {
     1365                isa = PBXFileReference;
     1366                name = CFString.h;
     1367                path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
     1368                refType = 0;
     1369        };
     1370        E190D00E03AAD96100AEFBE0 = {
     1371                isa = PBXFileReference;
     1372                name = Miscellaneous234567891011.html;
     1373                path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/CollectionServices/Collection_Services/Functions/Miscellaneous234567891011.html;
     1374                refType = 0;
     1375        };
     1376        E190D00F03AAD96100AEFBE0 = {
     1377                isa = PBXFileReference;
     1378                name = Miscellaneous.html;
     1379                path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/StringServices/String_Services/Functions/Miscellaneous.html;
     1380                refType = 0;
     1381        };
     1382        E190D01003AAD96100AEFBE0 = {
     1383                isa = PBXFileReference;
     1384                name = CFString.h;
     1385                path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers/CFString.h;
     1386                refType = 0;
     1387        };
     1388        E190D01103AAD96100AEFBE0 = {
     1389                isa = PBXFileReference;
     1390                name = Miscellaneous.html;
     1391                path = /System/Library/Frameworks/CoreFoundation.framework/Versions/A/Resources/English.lproj/Documentation/StringServices/String_Services/Functions/Miscellaneous.html;
     1392                refType = 0;
     1393        };
    2321394        F561F49E0139D79101AEEDB1 = {
    233                 activeArgIndex = 0;
     1395                activeArgIndex = 1;
     1396                activeArgIndices = (
     1397                        NO,
     1398                        YES,
     1399                );
    2341400                argumentStrings = (
    2351401                        "-nu file:///Applications/Prerelease/Mozilla.app",
     1402                        "-c MSIE http://web.sabi.net/",
    2361403                );
     1404                configStateDict = {
     1405                };
    2371406                debuggerPlugin = GDBDebugging;
    2381407                dylibVariantSuffix = "";
     
    2501419                fileReference = 08FB7796FE84155DC02AAC07;
    2511420                isa = PBXFileBreakpoint;
    252                 lineNumber = 520;
     1421                lineNumber = 609;
    2531422                state = 1;
    2541423        };
    255         F5F80FB0031B348401850618 = {
    256                 fRef = 08FB7796FE84155DC02AAC07;
    257                 isa = PBXBookmark;
    258         };
    259         F5F80FB1031B348401850618 = {
    260                 fRef = 08FB7796FE84155DC02AAC07;
    261                 isa = PBXTextBookmark;
    262                 name = "main.c: 674";
    263                 rLen = 0;
    264                 rLoc = 26707;
    265                 rType = 0;
    266                 vrLen = 1159;
    267                 vrLoc = 25548;
    268         };
    2691424}
  • trunk/launch/launch/launch.pbproj/project.pbxproj

    r3 r52  
    5555                                014CEA4A0018CE3211CA2923,
    5656                        );
     57                        hasScannedForEncodings = 1;
    5758                        isa = PBXProject;
    5859                        mainGroup = 08FB7794FE84155DC02AAC07;
     
    8384                };
    8485                08FB7796FE84155DC02AAC07 = {
     86                        fileEncoding = 30;
    8587                        isa = PBXFileReference;
    8688                        path = main.c;
     
    125127                        productName = launch;
    126128                        productReference = 034768E2FF38A6DC11DB9C8B;
    127                         shouldUseHeadermap = 1;
    128129                };
    129130                08FB77A0FE84155DC02AAC07 = {
     
    132133                        );
    133134                        isa = PBXHeadersBuildPhase;
     135                        runOnlyForDeploymentPostprocessing = 0;
    134136                };
    135137                08FB77A1FE84155DC02AAC07 = {
     
    139141                        );
    140142                        isa = PBXSourcesBuildPhase;
     143                        runOnlyForDeploymentPostprocessing = 0;
    141144                };
    142145                08FB77A2FE84155DC02AAC07 = {
     
    157160                        );
    158161                        isa = PBXFrameworksBuildPhase;
     162                        runOnlyForDeploymentPostprocessing = 0;
    159163                };
    160164                08FB77A5FE84155DC02AAC07 = {
     
    163167                        );
    164168                        isa = PBXRezBuildPhase;
     169                        runOnlyForDeploymentPostprocessing = 0;
    165170                };
    166171//080
     
    227232                };
    228233                F574340B01B8A47B01AEEDB1 = {
     234                        fileEncoding = 30;
    229235                        isa = PBXFileReference;
    230236                        path = VERSION;
     
    244250                };
    245251                F5C0CA9501B5740C01AEEDB1 = {
     252                        fileEncoding = 30;
    246253                        isa = PBXFileReference;
    247254                        path = README;
  • trunk/launch/launch/main.c

    r3 r52  
    2323- Does -X work at all?  What does it return if it fails?
    2424
    25 - Create blank document ˆ la my existing BBEdit alias?  Use
    26 template/stationery?
    27 
    28 - Allow piping (like BBEdit, again?)
    29 
    3025- Launching as root: use authentication framework - doesn't work.
     26
     27- launch URL with specified URL handler (done, except for IC)
    3128
    3229- launch apps by IC protocol handler (esp. editor)
     
    4643
    4744#include <unistd.h>
     45#include <sys/stat.h>
    4846#include <Carbon/Carbon.h>
    4947#include <CoreServices/CoreServices.h>
     
    5856const char *APP_NAME;
    5957
    60 #define VERSION "1.0a9"
     58#define VERSION "1.0b1"
    6159
    6260#define STRBUF_LEN 1024
     
    7876
    7977LSLaunchURLSpec LSPEC = {NULL, NULL, NULL, DEFAULT_LAUNCH_FLAGS, NULL};
     78
     79char *TEMPFILE = NULL;
    8080
    8181typedef struct {
     
    107107
    108108void usage() {
    109     fprintf(stderr, "usage: %s [-npswbmhCX] [-c creator] [-i bundleID] [-u URL] [-a name] [document ...]\n"
     109    fprintf(stderr, "usage: %s [-npswbmhCX] [-c creator] [-i bundleID] [-u URL] [-a name] [item ...] [-]\n"
    110110                    "   or: %s [-npflswbmhCX] item ...\n", APP_NAME, APP_NAME);
    111111    fprintf(stderr,
     
    140140    errRec *rec;
    141141    const char *errDesc = "unknown error";
    142     const char *failedStr = "(unable to retrieve error message)";
     142    char * const failedStr = "(unable to retrieve error message)";
    143143    static char *str = NULL;
    144144    size_t len;
     
    152152    str = (char *)malloc(len);
    153153    if (str != NULL)
    154         snprintf(str, len, "%s (%d)", errDesc, (long)err);
     154        snprintf(str, len, "%s (%ld)", errDesc, err);
    155155    else
    156156        str = failedStr;
     
    242242#endif
    243243
    244 void getargs(int argc, const char *argv[]) {
     244CFURLRef normalizedURLFromString(CFStringRef str) {
     245    CFURLRef url = CFURLCreateWithString(NULL, str, NULL);
     246    if (url != NULL) {
     247        CFURLRef absURL = CFURLCopyAbsoluteURL(url);
     248        CFRelease(url);
     249        url = NULL;
     250        if (absURL != NULL) {
     251            CFStringRef scheme = CFURLCopyScheme(absURL);
     252            url = absURL;
     253            if (scheme == NULL) {
     254                CFRelease(url);
     255                url = NULL;
     256            }
     257        }
     258    }
     259    return url;
     260}
     261
     262CFURLRef normalizedURLFromPrefixSlack(CFStringRef prefix, CFStringRef slackStr) {
     263    CFStringRef str = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@%@"),
     264                                               prefix, slackStr);
     265    CFURLRef normalizedURL = normalizedURLFromString(str);
     266    CFRelease(str);
     267    return normalizedURL;
     268}
     269
     270char *tempFile(int *fd) {
     271    char *tmpDir = getenv("TMPDIR");
     272    const char * const tempTemplate = "/launch-stationery-XXXXXXXX";
     273    char *tempPath;
     274    OSStatus err;
     275    FSRef fsr;
     276    FSCatalogInfo catalogInfo;
     277    FileInfo *fInfo;
     278
     279    // create temporary file
     280    if (tmpDir == NULL) tmpDir = "/tmp";
     281    tempPath = (char *)malloc(strlen(tmpDir) + strlen(tempTemplate) + 1);
     282    if (tempPath == NULL) errexit("can't allocate memory");
     283    strcpy(tempPath, tmpDir);
     284    strcat(tempPath, tempTemplate);
     285    if ( (*fd = mkstemp(tempPath)) == -1)
     286        errexit("can't create temporary file '%s'", tempPath);
     287    // mark file as stationery
     288    err = FSPathMakeRef(tempPath, &fsr, NULL);
     289    if (err != noErr) osstatusexit(err, "can't find '%s'", tempPath);
     290    err = FSGetCatalogInfo(&fsr, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL);
     291    if (err != noErr) osstatusexit(err, "can't get information for '%s'", tempPath);
     292    fInfo = (FileInfo *)&(catalogInfo.finderInfo);
     293    fInfo->finderFlags |= kIsStationery;
     294    err = FSSetCatalogInfo(&fsr, kFSCatInfoFinderInfo, &catalogInfo);
     295    if (err != noErr) osstatusexit(err, "can't set information for '%s'", tempPath);
     296   
     297    return tempPath;
     298}
     299
     300char *stdinAsTempFile() {
     301    unsigned char *buf;
     302    int bufsize;
     303    // Actual number of characters read, and therefore written.
     304    ssize_t charCount;
     305    int fd;
     306    struct stat stat_buf;
     307    char *tempFilePath;
     308
     309    tempFilePath = tempFile(&fd);
     310
     311    if (fstat(fd, &stat_buf) == -1)
     312        errexit("can't fstat temporary file '%s'", tempFilePath);
     313
     314    bufsize = stat_buf.st_blksize;
     315    if ( (buf = (unsigned char *)malloc(bufsize * sizeof(unsigned char))) == NULL)
     316        errexit("can't allocate %ld bytes of buffer memory",
     317                bufsize * sizeof(unsigned char));
     318
     319    // Loop until the end of the file.
     320    while (1) {
     321        // Read a block of input.
     322        charCount = read(STDIN_FILENO, buf, bufsize);
     323        if (charCount < 0) {
     324            errexit("can't read from standard input");
     325        }
     326        // End of this file?
     327        if (charCount == 0)
     328            break;
     329        // Write this block out.
     330        if (write(fd, buf, charCount) != charCount)
     331            errexit("error writing to file '%s'", tempFilePath);
     332    }
     333    free(buf);
     334    return tempFilePath;
     335}
     336
     337void getargs(int argc, char * const argv[]) {
    245338    extern char *optarg;
    246339    extern int optind;
     
    311404            break;
    312405        case 'u':
    313             LSPEC.appURL = CFURLCreateWithString(NULL,
    314                 CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding()), NULL);
     406            { CFStringRef str = CFStringCreateWithCString(NULL, optarg, CFStringGetSystemEncoding());
     407              LSPEC.appURL = CFURLCreateWithString(NULL, str, NULL);
     408              if (str != NULL) CFRelease(str);
     409            }
    315410            if (LSPEC.appURL == NULL) {
    316411                errexit("invalid URL (argument of -u)");
     
    354449
    355450    if (OPTS.action == ACTION_LAUNCH_URLS && appSpecified)
    356         errexit("sorry, launching URLs with a given application is not yet supported"); // XXX
     451        errexit("launching URLs with a given application is not supported; try without -l");
    357452
    358453    if (OPTS.action == ACTION_INFO_ITEMS && appSpecified)
     
    365460        int i;
    366461        OSStatus err;
    367         CFStringRef pathstr;
     462        CFStringRef argStr;
    368463        CFURLRef itemURL;
    369464        LSItemInfoRecord docInfo;
     
    375470        LSPEC.itemURLs = CFArrayCreateMutable(NULL, argc, NULL);
    376471        for (i = 0 ; i < argc ; i++) {
    377             pathstr = CFStringCreateWithCString(NULL, argv[i], CFStringGetSystemEncoding());
    378             itemURL = NULL;
    379             if (OPTS.action == ACTION_FIND_ITEMS || OPTS.action == ACTION_OPEN_ITEMS ||
    380                 OPTS.action == ACTION_LAUNCH_URLS || OPTS.action == ACTION_INFO_ITEMS) { // check for URLs
    381                 itemURL = CFURLCreateWithString(NULL, pathstr, NULL);
    382                 if (itemURL != NULL) {
    383                     CFURLRef absURL = CFURLCopyAbsoluteURL(itemURL);
    384                     CFRelease(itemURL);
    385                     itemURL = NULL;
    386                     if (absURL != NULL) {
    387                         CFStringRef scheme = CFURLCopyScheme(absURL);
    388                         itemURL = absURL;
    389                         if (scheme == NULL) {
    390                             CFRelease(itemURL);
    391                             itemURL = NULL;
    392                         }
    393                     }
     472            argStr = NULL;
     473            if (strcmp(argv[i], "-") == 0) {
     474                TEMPFILE = stdinAsTempFile();
     475                itemURL = CFURLCreateFromFileSystemRepresentation(NULL, TEMPFILE, strlen(TEMPFILE), false);
     476                LSPEC.launchFlags ^= kLSLaunchAsync;
     477            } else {
     478                argStr = CFStringCreateWithCString(NULL, argv[i], CFStringGetSystemEncoding());
     479                // check for URLs
     480                itemURL = normalizedURLFromString(argStr);
     481                if (itemURL == NULL && OPTS.action == ACTION_LAUNCH_URLS) {
     482                    // check for email addresses
     483                    if (strchr(argv[i], '@') != NULL && strchr(argv[i], '/') == NULL)
     484                        itemURL = normalizedURLFromPrefixSlack(CFSTR("mailto:"), argStr);
     485                    // check for "slack" URLs
     486                    if (itemURL == NULL && strchr(argv[i], '.') != NULL && strchr(argv[i], '/') != argv[i])
     487                        itemURL = normalizedURLFromPrefixSlack(CFSTR("http://"), argStr);
     488                }
     489                if (itemURL == NULL) {
     490                    // check for file paths
     491                    itemURL = CFURLCreateWithFileSystemPath(NULL, argStr, kCFURLPOSIXPathStyle, false);
     492                    err = LSCopyItemInfoForURL(itemURL, kLSRequestExtensionFlagsOnly, &docInfo);
     493                    if (err != noErr) osstatusexit(err, "unable to locate '%s'", argv[i]);
    394494                }
    395495            }
    396             if (itemURL == NULL) {
    397                 itemURL = CFURLCreateWithFileSystemPath(NULL, pathstr, kCFURLPOSIXPathStyle, false);
    398                 err = LSCopyItemInfoForURL(itemURL, kLSRequestExtensionFlagsOnly, &docInfo);
    399                 if (err != noErr) osstatusexit(err, "unable to locate '%s'", argv[i]);
    400             }
    401496            CFArrayAppendValue((CFMutableArrayRef)LSPEC.itemURLs, itemURL);
    402             CFRelease(pathstr);
     497            // don't CFRelease the itemURL because CFArray doesn't retain it by default
     498            if (argStr != NULL) CFRelease(argStr);
    403499        }
    404500    }
     
    616712}
    617713
    618 int main (int argc, const char *argv[]) {
     714int main (int argc, char * const argv[]) {
    619715    OSStatus err;
    620716   
     
    670766    }
    671767
     768    if (TEMPFILE != NULL) {
     769        // the application may take a while to finish opening the temporary file
     770        daemon(0, 0);
     771        sleep(60);
     772        unlink(TEMPFILE);
     773    }
     774
    672775    return 0;
    673776}
Note: See TracChangeset for help on using the changeset viewer.