zsh.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:15k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * zsh.cpp: create zsh completion rule for vlc
  3.  *****************************************************************************
  4.  * Copyright © 2005-2008 the VideoLAN team
  5.  * $Id: 4f432fac5a14b7ec66f4c4e15ac1d39aa3001d2d $
  6.  *
  7.  * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include <stdio.h>
  24. #include <map>
  25. #include <string>
  26. #include <utility>
  27. #include <iostream>
  28. #include <algorithm>
  29. typedef std::multimap<std::string, std::string> mumap;
  30. typedef std::multimap<int, std::string> mcmap;
  31. typedef std::pair<std::string, std::string> mpair;
  32. typedef std::pair<int, std::string> mcpair;
  33. #ifdef HAVE_CONFIG_H
  34. # include "config.h"
  35. #endif
  36. #include <vlc_common.h>
  37. #include <vlc/vlc.h>
  38. /* evil hack */
  39. #undef __PLUGIN__
  40. #undef __BUILTIN__
  41. #include <../src/modules/modules.h>
  42. void ParseModules( mumap &mods, mcmap &mods2 );
  43. void PrintModuleList( mumap &mods, mcmap &mods2 );
  44. void ParseOption( module_config_t *p_item, mumap &mods, mcmap &mods2 );
  45. void PrintOption( char *psz_option, char i_short, char *psz_exlusive,
  46.                    char *psz_text, char *psz_longtext, char *psz_args );
  47. int main( int i_argc, const char **ppsz_argv )
  48. {
  49.     mumap mods;
  50.     mcmap mods2;
  51.     /* Create a libvlc structure */
  52.     libvlc_exception_t ex;
  53.     libvlc_exception_init(&ex);
  54.     const char * const argv[] = { "vlc" };
  55.     libvlc_instance_t *p_libvlc_instance = libvlc_new(1, argv, &ex);
  56.     if( !p_libvlc_instance || libvlc_exception_raised(&ex) )
  57.     {
  58.         libvlc_exception_clear(&ex);
  59.         return 1;
  60.     }
  61.     printf("#compdef vlcnn"
  62.            "#This file is autogenerated by zsh.cppn"
  63.            "typeset -A opt_argsn"
  64.            "local context state line ret=1n"
  65.            "local modulesnn" );
  66.     PrintModuleList( mods, mods2 );
  67.     printf( "_arguments -S -s \n" );
  68.     ParseModules( mods, mods2 );
  69.     printf( "  "(--module)-p[print help on module]:print help on module:($modules)"\n" );
  70.     printf( "  "(-p)--module[print help on module]:print help on module:($modules)"\n" );
  71.     printf( "  "(--help)-h[print help]"\n" );
  72.     printf( "  "(-h)--help[print help]"\n" );
  73.     printf( "  "(--longhelp)-H[print detailed help]"\n" );
  74.     printf( "  "(-H)--longhelp[print detailed help]"\n" );
  75.     printf( "  "(--list)-l[print a list of available modules]"\n" );
  76.     printf( "  "(-l)--list[print a list of available modules]"\n" );
  77.     printf( "  "--save-config[save the current command line options in the config file]"\n" );
  78.     printf( "  "--reset-config[reset the current config to the default values]"\n" );
  79.     printf( "  "--config[use alternate config file]"\n" );
  80.     printf( "  "--reset-plugins-cache[resets the current plugins cache]"\n" );
  81.     printf( "  "--version[print version information]"\n" );
  82.     printf( "  "*:Playlist item:->mrl" && ret=0nn" );
  83.     printf( "case $state inn" );
  84.     printf( "  mrl)n" );
  85.     printf( "    _alternative 'files:file:_files' 'urls:URL:_urls' && ret=0n" );
  86.     printf( "  ;;n" );
  87.     printf( "esacnn" );
  88.     printf( "return retn" );
  89.     libvlc_release( p_libvlc_instance );
  90.     return 0;
  91. }
  92. void ParseModules( mumap &mods, mcmap &mods2 )
  93. {
  94.     module_t       **p_list;
  95.     module_t        *p_module;
  96.     module_config_t *p_item;
  97.     int              i_index;
  98.     int              i_items;
  99.     size_t           i_modules;
  100.     /* List the plugins */
  101.     p_list = module_list_get(&i_modules);
  102.     if( !p_list ) return;
  103.     for( i_index = 0; i_index < i_modules; i_index++ )
  104.     {
  105.         p_module = p_list[i_index];
  106.         /* Exclude empty plugins (submodules don't have config options, they
  107.          * are stored in the parent module) */
  108.         if( p_module->b_submodule )
  109.               continue;
  110. //            p_item = ((module_t *)p_module->p_parent)->p_config;
  111.         else
  112.             p_item = p_module->p_config;
  113. //        printf( "  #%sn", p_module->psz_longname );
  114.         if( !p_item ) continue;
  115.         i_items = 0;
  116.         do
  117.         {
  118.             if( p_item->i_type == CONFIG_CATEGORY )
  119.             {
  120. //                printf( "  #Category %dn", p_item->i_value );
  121.             }
  122.             else if( p_item->i_type == CONFIG_SUBCATEGORY )
  123.             {
  124. //                printf( "  #Subcategory %dn", p_item->i_value );
  125.             }
  126.             if( p_item->i_type & CONFIG_ITEM )
  127.                 ParseOption( p_item, mods, mods2 );
  128.         }
  129.         while( i_items++ < p_module->i_config_items && p_item++ );
  130.     }
  131. }
  132. void PrintModuleList( mumap &mods, mcmap &mods2 )
  133. {
  134.     module_t       **p_list = NULL;
  135.     module_t        *p_module;
  136.     int              i_index;
  137.     int              i_items;
  138.     size_t           i_modules;
  139.     /* List the plugins */
  140.     p_list = module_list_get(&i_modules);
  141.     if( !p_list ) return;
  142.     printf( "modules="" );
  143.     for( i_index = 0; i_index < i_modules; i_index++ )
  144.     {
  145.         p_module = p_list[i_index];
  146.         /* Exclude empty plugins (submodules don't have config options, they
  147.          * are stored in the parent module) */
  148.         if( strcmp( p_module->psz_object_name, "main" ) )
  149.         {
  150.             mods.insert( mpair( p_module->psz_capability,
  151.                                 p_module->psz_object_name ) );
  152.             module_config_t *p_config = p_module->p_config;
  153.             i_items = 0;
  154.             if( p_config ) do
  155.             {
  156.                 /* Hack: required subcategory is stored in i_min */
  157.                 if( p_config->i_type == CONFIG_SUBCATEGORY )
  158.                 {
  159.                     mods2.insert( mcpair( p_config->value.i,
  160.                                           p_module->psz_object_name ) );
  161.                 }
  162.             } while( i_items++ < p_module->i_config_items && p_config++ );
  163.             if( p_module->b_submodule )
  164.                 continue;
  165.             printf( "%s ", p_module->psz_object_name );
  166.         }
  167.     }
  168.     printf( ""nn" );
  169.     return;
  170. }
  171. void ParseOption( module_config_t *p_item, mumap &mods, mcmap &mods2 )
  172. {
  173.     char *psz_arguments = NULL;
  174.     char *psz_exclusive;
  175.     char *psz_option;
  176.     char *psz_name;
  177.     char *psz_text;
  178.     char *psz_longtext;
  179. #define DUP( x ) strdup( x ? x : "" )
  180.     //Skip deprecated options
  181.     if( p_item->b_removed )
  182.         return;
  183.     switch( p_item->i_type )
  184.     {
  185.     case CONFIG_ITEM_MODULE:
  186.     {
  187.         std::pair<mumap::iterator, mumap::iterator> range = mods.equal_range( p_item->psz_type );
  188.         std::string list = (*range.first).second;
  189.         ++range.first;
  190.         while( range.first != range.second )
  191.         {
  192.             list = list.append( " " );
  193.             list = list.append( range.first->second );
  194.             ++range.first;
  195.         }
  196.         asprintf( &psz_arguments, "(%s)", list.c_str() );
  197.     }
  198.     break;
  199.     case CONFIG_ITEM_MODULE_CAT:
  200.     {
  201.         std::pair<mcmap::iterator, mcmap::iterator> range =
  202.             mods2.equal_range( p_item->min.i );
  203.         std::string list = (*range.first).second;
  204.         ++range.first;
  205.         while( range.first != range.second )
  206.         {
  207.             list = list.append( " " );
  208.             list = list.append( range.first->second );
  209.             ++range.first;
  210.         }
  211.         asprintf( &psz_arguments, "(%s)", list.c_str() );
  212.     }
  213.     break;
  214.     case CONFIG_ITEM_MODULE_LIST_CAT:
  215.     {
  216.         std::pair<mcmap::iterator, mcmap::iterator> range =
  217.             mods2.equal_range( p_item->min.i );
  218.         std::string list = "_values -s , ";
  219.         list = list.append( p_item->psz_name );
  220.         while( range.first != range.second )
  221.         {
  222.             list = list.append( " '*" );
  223.             list = list.append( range.first->second );
  224.             list = list.append( "'" );
  225.             ++range.first;
  226.         }
  227.         asprintf( &psz_arguments, "%s", list.c_str() );
  228.     }
  229.     break;
  230.     case CONFIG_ITEM_STRING:
  231.         if( p_item->i_list )
  232.         {
  233.             int i = p_item->i_list -1;
  234.             char *psz_list;
  235.             if( p_item->ppsz_list_text )
  236.                 asprintf( &psz_list, "%s\:%s", p_item->ppsz_list[i],
  237.                           p_item->ppsz_list_text[i] );
  238.             else
  239.                 psz_list = strdup(p_item->ppsz_list[i]);
  240.             char *psz_list2;
  241.             while( i>1 )
  242.             {
  243.                 if( p_item->ppsz_list_text )
  244.                     asprintf( &psz_list2, "%s\:%s %s", p_item->ppsz_list[i-1],
  245.                               p_item->ppsz_list_text[i-1], psz_list );
  246.                 else
  247.                     asprintf( &psz_list2, "%s %s", p_item->ppsz_list[i-1],
  248.                               psz_list );
  249.                 free( psz_list );
  250.                 psz_list = psz_list2;
  251.                 i--;
  252.             }
  253.             if( p_item->ppsz_list_text )
  254.                 asprintf( &psz_arguments, "((%s))", psz_list );
  255.             else
  256.                 asprintf( &psz_arguments, "(%s)", psz_list );
  257.             free( psz_list );
  258.         }
  259.         break;
  260.     case CONFIG_ITEM_FILE:
  261.         psz_arguments = strdup( "_files" );
  262.         break;
  263.     case CONFIG_ITEM_DIRECTORY:
  264.         psz_arguments = strdup( "_files -/" );
  265.         break;
  266.     case CONFIG_ITEM_INTEGER:
  267.         if( p_item->i_list )
  268.         {
  269.             int i = p_item->i_list -1;
  270.             char *psz_list;
  271.             if( p_item->ppsz_list_text )
  272.                 asprintf( &psz_list, "%d\:%s", p_item->pi_list[i],
  273.                           p_item->ppsz_list_text[i] );
  274.             else
  275.                 psz_list = strdup(p_item->ppsz_list[i]);
  276.             char *psz_list2;
  277.             while( i>1 )
  278.             {
  279.                 if( p_item->ppsz_list_text )
  280.                     asprintf( &psz_list2, "%d\:%s %s", p_item->pi_list[i-1],
  281.                               p_item->ppsz_list_text[i-1], psz_list );
  282.                 else
  283.                     asprintf( &psz_list2, "%s %s", p_item->ppsz_list[i-1],
  284.                               psz_list );
  285.                 free( psz_list );
  286.                 psz_list = psz_list2;
  287.                 i--;
  288.             }
  289.             if( p_item->ppsz_list_text )
  290.                 asprintf( &psz_arguments, "((%s))", psz_list );
  291.             else
  292.                 asprintf( &psz_arguments, "(%s)", psz_list );
  293.             free( psz_list );
  294.         }
  295.         else if( p_item->min.i != 0 || p_item->max.i != 0 )
  296.         {
  297. //            p_control = new RangedIntConfigControl( p_this, p_item, parent );
  298.         }
  299.         else
  300.         {
  301. //            p_control = new IntegerConfigControl( p_this, p_item, parent );
  302.         }
  303.         break;
  304.     case CONFIG_ITEM_KEY:
  305. //        p_control = new KeyConfigControl( p_this, p_item, parent );
  306.         break;
  307.     case CONFIG_ITEM_FLOAT:
  308. //        p_control = new FloatConfigControl( p_this, p_item, parent );
  309.         break;
  310.     case CONFIG_ITEM_BOOL:
  311. //        p_control = new BoolConfigControl( p_this, p_item, parent );
  312.         asprintf( &psz_exclusive, "--no%s --no-%s", p_item->psz_name,
  313.                  p_item->psz_name );
  314.         psz_name = DUP( p_item->psz_name );
  315.         psz_text = DUP( p_item->psz_text );
  316.         psz_longtext = DUP( p_item->psz_longtext );
  317.         PrintOption( psz_name, p_item->i_short, psz_exclusive,
  318.                      psz_text, psz_longtext, psz_arguments );
  319.         free( psz_name );
  320.         free( psz_text );
  321.         free( psz_longtext );
  322.         free( psz_exclusive );
  323.         asprintf( &psz_exclusive, "--no%s --%s", p_item->psz_name,
  324.                  p_item->psz_name );
  325.         asprintf( &psz_option, "no-%s", p_item->psz_name );
  326.         psz_text = DUP( p_item->psz_text );
  327.         psz_longtext = DUP( p_item->psz_longtext );
  328.         PrintOption( psz_option, p_item->i_short, psz_exclusive,
  329.                      psz_text, psz_longtext, psz_arguments );
  330.         free( psz_text );
  331.         free( psz_longtext );
  332.         free( psz_exclusive );
  333.         free( psz_option );
  334.         asprintf( &psz_exclusive, "--no-%s --%s", p_item->psz_name,
  335.                  p_item->psz_name );
  336.         asprintf( &psz_option, "no%s", p_item->psz_name );
  337.         psz_text = DUP( p_item->psz_text );
  338.         psz_longtext = DUP( p_item->psz_longtext );
  339.         PrintOption( psz_option, p_item->i_short, psz_exclusive,
  340.                      psz_text, psz_longtext, psz_arguments );
  341.         free( psz_text );
  342.         free( psz_longtext );
  343.         free( psz_exclusive );
  344.         free( psz_option );
  345.         return;
  346.     case CONFIG_SECTION:
  347. //        p_control = new SectionConfigControl( p_this, p_item, parent );
  348.         break;
  349.     default:
  350.         break;
  351.     }
  352.     psz_name = DUP( p_item->psz_name );
  353.     psz_text = DUP( p_item->psz_text );
  354.     psz_longtext = DUP( p_item->psz_longtext );
  355.     PrintOption( psz_name, p_item->i_short, NULL,
  356.                  psz_text, psz_longtext, psz_arguments );
  357.     free( psz_name );
  358.     free( psz_text );
  359.     free( psz_longtext );
  360.     free( psz_arguments );
  361. }
  362. void PrintOption( char *psz_option, char i_short, char *psz_exclusive,
  363.                    char *psz_text, char *psz_longtext, char *psz_args )
  364. {
  365.     char *foo;
  366.     if( psz_text )
  367.     {
  368.         while( (foo = strchr( psz_text, ':' ))) *foo=';';
  369.         while( (foo = strchr( psz_text, '"' ))) *foo=''';
  370.     }
  371.     if( psz_longtext )
  372.     {
  373.         while( (foo = strchr( psz_longtext, ':' ))) *foo=';';
  374.         while( (foo = strchr( psz_longtext, '"' ))) *foo=''';
  375.     }
  376.     if( !psz_longtext ||
  377.         strchr( psz_longtext, 'n' ) ||
  378.         strchr( psz_longtext, '(' ) ) psz_longtext = psz_text;
  379.     if( i_short )
  380.     {
  381.         if( !psz_exclusive ) psz_exclusive = strdup( "" );
  382.         else asprintf( &psz_exclusive, " %s", psz_exclusive );
  383.         printf( "  "(-%c%s)--%s%s[%s]", i_short, psz_exclusive,
  384.                 psz_option, psz_args?"=":"", psz_text );
  385.         if( psz_args )
  386.             printf( ":%s:%s"\n", psz_longtext, psz_args );
  387.         else
  388.             printf( ""\n" );
  389.         printf( "  "(--%s%s)-%c[%s]", psz_option, psz_exclusive,
  390.                 i_short, psz_text );
  391.         if( psz_args )
  392.             printf( ":%s:%s"\n", psz_longtext, psz_args );
  393.         else
  394.             printf( ""\n" );
  395.     }
  396.     else
  397.     {
  398.         if( psz_exclusive )
  399.             printf( "  "(%s)--%s%s[%s]", psz_exclusive, psz_option,
  400.                     psz_args?"=":"", psz_text );
  401.         else
  402.             printf( "  "--%s[%s]", psz_option, psz_text );
  403.         if( psz_args )
  404.             printf( ":%s:%s"\n", psz_longtext, psz_args );
  405.         else
  406.             printf( ""\n" );
  407.     }
  408. }