home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / cdrom / Misc / mkisofs / convert.c < prev    next >
C/C++ Source or Header  |  1994-05-29  |  6KB  |  341 lines

  1. /* convert.c: */
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #include "mkisofs.h"
  7.  
  8. static char g_conversion_table[256] = {
  9.   'X',  /*  0  */
  10.   'X',  /*  1  */
  11.   'X',  /*  2  */
  12.   'X',  /*  3  */
  13.   'X',  /*  4  */
  14.   'X',  /*  5  */
  15.   'X',  /*  6  */
  16.   'X',  /*  7  */
  17.   'X',  /*  8  */
  18.   'X',  /*  9  */
  19.   'X',  /*  10  */
  20.   'X',  /*  11  */
  21.   'X',  /*  12  */
  22.   'X',  /*  13  */
  23.   'X',  /*  14  */
  24.   'X',  /*  15  */
  25.   'X',  /*  16  */
  26.   'X',  /*  17  */
  27.   'X',  /*  18  */
  28.   'X',  /*  19  */
  29.   'X',  /*  20  */
  30.   'X',  /*  21  */
  31.   'X',  /*  22  */
  32.   'X',  /*  23  */
  33.   'X',  /*  24  */
  34.   'X',  /*  25  */
  35.   'X',  /*  26  */
  36.   'X',  /*  27  */
  37.   'X',  /*  28  */
  38.   'X',  /*  29  */
  39.   'X',  /*  30  */
  40.   'X',  /*  31  */
  41.   'S',  /*  space */
  42.   'E',  /*  !  */
  43.   'Q',  /*  "  */
  44.   'H',  /*  #  */
  45.   'D',  /*  $  */
  46.   'P',  /*  %  */
  47.   'A',  /*  &  */
  48.   'A',  /*  '  */
  49.   'P',  /*  (  */
  50.   'P',  /*  )  */
  51.   'A',  /*  *  */
  52.   'P',  /*  +  */
  53.   'C',  /*  ,  */
  54.   'M',  /*  -  */
  55.   'D',  /*  .  */
  56.   'S',  /*  /  */
  57.   '0',  /*  0  */
  58.   '1',  /*  1  */
  59.   '2',  /*  2  */
  60.   '3',  /*  3  */
  61.   '4',  /*  4  */
  62.   '5',  /*  5  */
  63.   '6',  /*  6  */
  64.   '7',  /*  7  */
  65.   '8',  /*  8  */
  66.   '9',  /*  9  */
  67.   'C',  /*  :  */
  68.   'S',  /*  ;  */
  69.   'L',  /*  <  */
  70.   'E',  /*  =  */
  71.   'G',  /*  >  */
  72.   'Q',  /*  ?  */
  73.   'A',  /*  @  */
  74.   'A',  /*  A  */
  75.   'B',  /*  B  */
  76.   'C',  /*  C  */
  77.   'D',  /*  D  */
  78.   'E',  /*  E  */
  79.   'F',  /*  F  */
  80.   'G',  /*  G  */
  81.   'H',  /*  H  */
  82.   'I',  /*  I  */
  83.   'J',  /*  J  */
  84.   'K',  /*  K  */
  85.   'L',  /*  L  */
  86.   'M',  /*  M  */
  87.   'N',  /*  N  */
  88.   'O',  /*  O  */
  89.   'P',  /*  P  */
  90.   'Q',  /*  Q  */
  91.   'R',  /*  R  */
  92.   'S',  /*  S  */
  93.   'T',  /*  T  */
  94.   'U',  /*  U  */
  95.   'V',  /*  V  */
  96.   'W',  /*  W  */
  97.   'X',  /*  X  */
  98.   'Y',  /*  Y  */
  99.   'Z',  /*  Z  */
  100.   'B',  /*  [  */
  101.   'B',  /*  \  */
  102.   'B',  /*  ]  */
  103.   'C',  /*  ^  */
  104.   '_',  /*  _  */
  105.   'A',  /*  `  */
  106.   'A',  /*  a  */
  107.   'B',  /*  b  */
  108.   'C',  /*  c  */
  109.   'D',  /*  d  */
  110.   'E',  /*  e  */
  111.   'F',  /*  f  */
  112.   'G',  /*  g  */
  113.   'H',  /*  h  */
  114.   'I',  /*  i  */
  115.   'J',  /*  j  */
  116.   'K',  /*  k  */
  117.   'L',  /*  l  */
  118.   'M',  /*  m  */
  119.   'N',  /*  n  */
  120.   'O',  /*  o  */
  121.   'P',  /*  p  */
  122.   'Q',  /*  q  */
  123.   'R',  /*  r  */
  124.   'S',  /*  s  */
  125.   'T',  /*  t  */
  126.   'U',  /*  u  */
  127.   'V',  /*  v  */
  128.   'W',  /*  w  */
  129.   'X',  /*  x  */
  130.   'Y',  /*  y  */
  131.   'Z',  /*  z  */
  132.   'B',  /*  {  */
  133.   'B',  /*  |  */
  134.   'B',  /*  }  */
  135.   'T',  /*  ~  */
  136.   'D',  /*  delete */
  137.   'X',  /*  128  */
  138.   'X',  /*  129  */
  139.   'X',  /*  130  */
  140.   'X',  /*  131  */
  141.   'X',  /*  132  */
  142.   'X',  /*  133  */
  143.   'X',  /*  134  */
  144.   'X',  /*  135  */
  145.   'X',  /*  136  */
  146.   'X',  /*  137  */
  147.   'X',  /*  138  */
  148.   'X',  /*  139  */
  149.   'X',  /*  140  */
  150.   'X',  /*  141  */
  151.   'X',  /*  142  */
  152.   'X',  /*  143  */
  153.   'X',  /*  144  */
  154.   'X',  /*  145  */
  155.   'X',  /*  146  */
  156.   'X',  /*  147  */
  157.   'X',  /*  148  */
  158.   'X',  /*  149  */
  159.   'X',  /*  150  */
  160.   'X',  /*  151  */
  161.   'X',  /*  152  */
  162.   'X',  /*  153  */
  163.   'X',  /*  154  */
  164.   'X',  /*  155  */
  165.   'X',  /*  156  */
  166.   'X',  /*  157  */
  167.   'X',  /*  158  */
  168.   'X',  /*  159  */
  169.   'X',  /*  160  */
  170.   'E',  /*  ¡  */
  171.   'C',  /*  ¢  */
  172.   'L',  /*  £  */
  173.   'C',  /*  ¤  */
  174.   'Y',  /*  ¥  */
  175.   'S',  /*  ¦  */
  176.   'P',  /*  §  */
  177.   'D',  /*  ¨  */
  178.   'C',  /*  ©  */
  179.   'A',  /*  ª  */
  180.   'G',  /*  «  */
  181.   'N',  /*  ¬  */
  182.   'M',  /*  ­  */
  183.   'R',  /*  ®  */
  184.   'B',  /*  ¯  */
  185.   'C',  /*  °  */
  186.   'P',  /*  ±  */
  187.   '2',  /*  ²  */
  188.   '3',  /*  ³  */
  189.   'A',  /*  ´  */
  190.   'M',  /*  µ  */
  191.   'P',  /*  ¶  */
  192.   'D',  /*  ·  */
  193.   'C',  /*  ¸  */
  194.   '1',  /*  ¹  */
  195.   'O',  /*  º  */
  196.   'G',  /*  »  */
  197.   '4',  /*  ¼  */
  198.   '2',  /*  ½  */
  199.   '3',  /*  ¾  */
  200.   'Q',  /*  ¿  */
  201.   'A',  /*  À  */
  202.   'A',  /*  Á  */
  203.   'A',  /*  Â  */
  204.   'A',  /*  Ã  */
  205.   'A',  /*  Ä  */
  206.   'A',  /*  Å  */
  207.   'A',  /*  Æ  */
  208.   'C',  /*  Ç  */
  209.   'E',  /*  È  */
  210.   'E',  /*  É  */
  211.   'E',  /*  Ê  */
  212.   'E',  /*  Ë  */
  213.   'I',  /*  Ì  */
  214.   'I',  /*  Í  */
  215.   'I',  /*  Î  */
  216.   'I',  /*  Ï  */
  217.   'D',  /*  Ð  */
  218.   'N',  /*  Ñ  */
  219.   'O',  /*  Ò  */
  220.   'O',  /*  Ó  */
  221.   'O',  /*  Ô  */
  222.   'O',  /*  Õ  */
  223.   'O',  /*  Ö  */
  224.   'X',  /*  ×  */
  225.   'O',  /*  Ø  */
  226.   'U',  /*  Ù  */
  227.   'U',  /*  Ú  */
  228.   'U',  /*  Û  */
  229.   'U',  /*  Ü  */
  230.   'Y',  /*  Ý  */
  231.   'D',  /*  Þ  */
  232.   'S',  /*  ß  */
  233.   'A',  /*  à  */
  234.   'A',  /*  á  */
  235.   'A',  /*  â  */
  236.   'A',  /*  ã  */
  237.   'A',  /*  ä  */
  238.   'A',  /*  å  */
  239.   'A',  /*  æ  */
  240.   'C',  /*  ç  */
  241.   'E',  /*  è  */
  242.   'E',  /*  é  */
  243.   'E',  /*  ê  */
  244.   'E',  /*  ë  */
  245.   'I',  /*  ì  */
  246.   'I',  /*  í  */
  247.   'I',  /*  î  */
  248.   'I',  /*  ï  */
  249.   'D',  /*  ð  */
  250.   'N',  /*  ñ  */
  251.   'O',  /*  ò  */
  252.   'O',  /*  ó  */
  253.   'O',  /*  ô  */
  254.   'O',  /*  õ  */
  255.   'O',  /*  ö  */
  256.   'D',  /*  ÷  */
  257.   'O',  /*  ø  */
  258.   'U',  /*  ù  */
  259.   'U',  /*  ú  */
  260.   'U',  /*  û  */
  261.   'U',  /*  ü  */
  262.   'Y',  /*  ý  */
  263.   'D',  /*  þ  */
  264.   'Y'   /*  ÿ  */
  265. };
  266.  
  267. static void map_special_characters (char *str)
  268. {
  269.   for (; *str; str++)
  270.     *str = g_conversion_table[*(unsigned char*)str];
  271. }
  272.  
  273. static void shorten_name (char *name, int max_length)
  274. {
  275.   int len = strlen (name);
  276.  
  277.   if (len <= max_length)
  278.     return;
  279.  
  280.   while (len > max_length) {
  281.     int i;
  282.     for (i=len-1; i>=0; i--)
  283.       if (strchr ("AEIOUaeiou", name[i]))
  284.         break;
  285.     if (i<0)
  286.       break;
  287.     memmove (name + i, name + i + 1, len-i);
  288.     len--;
  289.   }
  290.   name[max_length] = 0;
  291. }
  292.  
  293. char *convert_filename (const char *filename)
  294. {
  295.   char *name, *extension;
  296.   char *dotptr;
  297.   static char result[40];
  298.  
  299.   if (dotptr = strrchr (filename, '.')) {
  300.     int len = dotptr - filename;
  301.     name = malloc (len + 1);
  302.     memcpy (name, filename, len);
  303.     name[len] = 0;
  304.     extension = strdup (dotptr + 1);
  305.   } else {
  306.     name = strdup ((char*) filename);
  307.     extension = strdup ("");
  308.   }
  309.  
  310.   if (map_filenames) {
  311.     map_special_characters (name);
  312.     map_special_characters (extension);
  313.   }
  314.  
  315.   shorten_name (name, short_filenames ? 8 : 30);
  316.   shorten_name (extension, short_filenames ? 3 : (30 - strlen (name)));
  317.  
  318.   strcpy (result, name);
  319.   strcat (result, ".");
  320.   strcat (result, extension);
  321.   strcat (result, ";1");
  322.  
  323.   free (name);
  324.   free (extension);
  325.  
  326.   return result;
  327. }
  328.  
  329. char *convert_dirname (const char *dirname)
  330. {
  331.   static char result[40];
  332.   
  333.   strcpy (result, dirname);
  334.   if (map_filenames)
  335.     map_special_characters (result);
  336.  
  337.   shorten_name (result, short_filenames ? 8 : 31);
  338.  
  339.   return result;
  340. }
  341.