Radix cross Linux package tools

Package Tools – is a set of utilities to create, install, and update RcL packages

3 Commits   0 Branches   2 Tags
11c606a6 (kx 2023-04-11 01:18:34 +0300   1) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   2) /**********************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300   3) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   4)   Copyright 2019 Andrey V.Kosteltsev
11c606a6 (kx 2023-04-11 01:18:34 +0300   5) 
11c606a6 (kx 2023-04-11 01:18:34 +0300   6)   Licensed under the Radix.pro License, Version 1.0 (the "License");
11c606a6 (kx 2023-04-11 01:18:34 +0300   7)   you may not use this file  except  in compliance with the License.
11c606a6 (kx 2023-04-11 01:18:34 +0300   8)   You may obtain a copy of the License at
11c606a6 (kx 2023-04-11 01:18:34 +0300   9) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  10)      https://radix.pro/licenses/LICENSE-1.0-en_US.txt
11c606a6 (kx 2023-04-11 01:18:34 +0300  11) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  12)   Unless required by applicable law or agreed to in writing, software
11c606a6 (kx 2023-04-11 01:18:34 +0300  13)   distributed under the License is distributed on an "AS IS" BASIS,
11c606a6 (kx 2023-04-11 01:18:34 +0300  14)   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11c606a6 (kx 2023-04-11 01:18:34 +0300  15)   implied.
11c606a6 (kx 2023-04-11 01:18:34 +0300  16) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  17)  **********************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300  18) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  19) #include <config.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300  20) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  21) #include <stdlib.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300  22) #include <stdio.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300  23) #include <string.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300  24) #include <libgen.h>   /* basename(3) */
11c606a6 (kx 2023-04-11 01:18:34 +0300  25) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  26) #include <msglog.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300  27) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  28) #include <jsmin.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300  29) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  30) static FILE *ifile;
11c606a6 (kx 2023-04-11 01:18:34 +0300  31) static FILE *ofile;
11c606a6 (kx 2023-04-11 01:18:34 +0300  32) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  33) static const char *input_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300  34) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  35) static void error( const char *fname, char *s )
11c606a6 (kx 2023-04-11 01:18:34 +0300  36) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  37)   if( fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300  38)     ERROR( "JSMIN: %s: %s", basename( (char *)fname ), s );
11c606a6 (kx 2023-04-11 01:18:34 +0300  39)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300  40)     ERROR( "JSMIN: %s", s );
11c606a6 (kx 2023-04-11 01:18:34 +0300  41) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  42) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  43) static int is_alpha_or_num( int c )
11c606a6 (kx 2023-04-11 01:18:34 +0300  44) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  45)   return( (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
11c606a6 (kx 2023-04-11 01:18:34 +0300  46)           (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || c == '\\' || c > 126 );
11c606a6 (kx 2023-04-11 01:18:34 +0300  47) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  48) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  49) static int  a;
11c606a6 (kx 2023-04-11 01:18:34 +0300  50) static int  b;
11c606a6 (kx 2023-04-11 01:18:34 +0300  51) static int  lookahead = EOF;
11c606a6 (kx 2023-04-11 01:18:34 +0300  52) static int  x = EOF;
11c606a6 (kx 2023-04-11 01:18:34 +0300  53) static int  y = EOF;
11c606a6 (kx 2023-04-11 01:18:34 +0300  54) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  55) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  56)   get - return the next character from stdin. Watch out for lookahead. If
11c606a6 (kx 2023-04-11 01:18:34 +0300  57)         the character is a control character, translate it to a space or
11c606a6 (kx 2023-04-11 01:18:34 +0300  58)         linefeed.
11c606a6 (kx 2023-04-11 01:18:34 +0300  59)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  60) static int get()
11c606a6 (kx 2023-04-11 01:18:34 +0300  61) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  62)   int c = lookahead;
11c606a6 (kx 2023-04-11 01:18:34 +0300  63)   lookahead = EOF;
11c606a6 (kx 2023-04-11 01:18:34 +0300  64)   if( c == EOF )
11c606a6 (kx 2023-04-11 01:18:34 +0300  65)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  66)     c = getc( ifile );
11c606a6 (kx 2023-04-11 01:18:34 +0300  67)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  68)   if( c >= ' ' || c == '\n' || c == EOF )
11c606a6 (kx 2023-04-11 01:18:34 +0300  69)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  70)     return c;
11c606a6 (kx 2023-04-11 01:18:34 +0300  71)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  72)   if( c == '\r' )
11c606a6 (kx 2023-04-11 01:18:34 +0300  73)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  74)     return '\n';
11c606a6 (kx 2023-04-11 01:18:34 +0300  75)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300  76)   return ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300  77) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  78) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  79) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  80) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  81)   peek - get the next character without getting it.
11c606a6 (kx 2023-04-11 01:18:34 +0300  82)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  83) static int peek()
11c606a6 (kx 2023-04-11 01:18:34 +0300  84) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  85)   lookahead = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300  86)   return lookahead;
11c606a6 (kx 2023-04-11 01:18:34 +0300  87) }
11c606a6 (kx 2023-04-11 01:18:34 +0300  88) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  89) 
11c606a6 (kx 2023-04-11 01:18:34 +0300  90) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300  91)   next - get the next character, excluding comments. peek() is used to see
11c606a6 (kx 2023-04-11 01:18:34 +0300  92)          if a '/' is followed by a '/' or '*'.
11c606a6 (kx 2023-04-11 01:18:34 +0300  93)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300  94) static int next()
11c606a6 (kx 2023-04-11 01:18:34 +0300  95) {
11c606a6 (kx 2023-04-11 01:18:34 +0300  96)   int c = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300  97)   if ( c == '/' )
11c606a6 (kx 2023-04-11 01:18:34 +0300  98)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300  99)     switch( peek() )
11c606a6 (kx 2023-04-11 01:18:34 +0300 100)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 101)       case '/':
11c606a6 (kx 2023-04-11 01:18:34 +0300 102)         for( ;; )
11c606a6 (kx 2023-04-11 01:18:34 +0300 103)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 104)           c = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 105)           if( c <= '\n' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 106)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 107)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 108)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 109)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 110)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 111)       case '*':
11c606a6 (kx 2023-04-11 01:18:34 +0300 112)         get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 113)         while( c != ' ' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 114)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 115)           switch( get() )
11c606a6 (kx 2023-04-11 01:18:34 +0300 116)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 117)             case '*':
11c606a6 (kx 2023-04-11 01:18:34 +0300 118)               if( peek() == '/' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 119)               {
11c606a6 (kx 2023-04-11 01:18:34 +0300 120)                 get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 121)                 c = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 122)               }
11c606a6 (kx 2023-04-11 01:18:34 +0300 123)               break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 124)             case EOF:
11c606a6 (kx 2023-04-11 01:18:34 +0300 125)               error( input_fname, "Unterminated comment" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 126)               return EOF;
11c606a6 (kx 2023-04-11 01:18:34 +0300 127)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 128)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 129)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 130)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 131)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 132)   y = x;
11c606a6 (kx 2023-04-11 01:18:34 +0300 133)   x = c;
11c606a6 (kx 2023-04-11 01:18:34 +0300 134)   return c;
11c606a6 (kx 2023-04-11 01:18:34 +0300 135) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 136) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 137) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 138) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 139)   action - do something! What you do is determined by the argument:
11c606a6 (kx 2023-04-11 01:18:34 +0300 140)            1   Output A. Copy B to A. Get the next B.
11c606a6 (kx 2023-04-11 01:18:34 +0300 141)            2   Copy B to A. Get the next B. (Delete A).
11c606a6 (kx 2023-04-11 01:18:34 +0300 142)            3   Get the next B. (Delete B).
11c606a6 (kx 2023-04-11 01:18:34 +0300 143)   action treats a string as a single character. Wow!
11c606a6 (kx 2023-04-11 01:18:34 +0300 144)   action recognizes a regular expression if it is preceded by ( or , or =.
11c606a6 (kx 2023-04-11 01:18:34 +0300 145)  */
11c606a6 (kx 2023-04-11 01:18:34 +0300 146) static void action( int d )
11c606a6 (kx 2023-04-11 01:18:34 +0300 147) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 148)   switch( d )
11c606a6 (kx 2023-04-11 01:18:34 +0300 149)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 150)     case 1:
11c606a6 (kx 2023-04-11 01:18:34 +0300 151)       /* skip first carriage return */
11c606a6 (kx 2023-04-11 01:18:34 +0300 152)       if( a != '\n' ) putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 153)       if( (y == '\n' || y == ' ') &&
11c606a6 (kx 2023-04-11 01:18:34 +0300 154)           (a == '+' || a == '-' || a == '*' || a == '/') &&
11c606a6 (kx 2023-04-11 01:18:34 +0300 155)           (b == '+' || b == '-' || b == '*' || b == '/')    )
11c606a6 (kx 2023-04-11 01:18:34 +0300 156)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 157)         putc( y, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 158)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 159)     case 2:
11c606a6 (kx 2023-04-11 01:18:34 +0300 160)       a = b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 161)       if( a == '\'' || a == '"' || a == '`' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 162)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 163)         for( ;; )
11c606a6 (kx 2023-04-11 01:18:34 +0300 164)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 165)           putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 166)           a = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 167)           if( a == b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 168)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 169)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 170)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 171)           if( a == '\\' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 172)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 173)             putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 174)             a = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 175)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 176)           if( a == EOF )
11c606a6 (kx 2023-04-11 01:18:34 +0300 177)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 178)             error( input_fname, "Unterminated string literal" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 179)             return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 180)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 181)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 182)       }
11c606a6 (kx 2023-04-11 01:18:34 +0300 183)     case 3:
11c606a6 (kx 2023-04-11 01:18:34 +0300 184)       b = next();
11c606a6 (kx 2023-04-11 01:18:34 +0300 185)       if( b == '/' &&
11c606a6 (kx 2023-04-11 01:18:34 +0300 186)           ( a == '(' || a == ',' || a == '=' || a == ':' ||
11c606a6 (kx 2023-04-11 01:18:34 +0300 187)             a == '[' || a == '!' || a == '&' || a == '|' ||
11c606a6 (kx 2023-04-11 01:18:34 +0300 188)             a == '?' || a == '+' || a == '-' || a == '~' ||
11c606a6 (kx 2023-04-11 01:18:34 +0300 189)             a == '*' || a == '/' || a == '{' || a == '\n' ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 190)       {
11c606a6 (kx 2023-04-11 01:18:34 +0300 191)         putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 192)         if( a == '/' || a == '*' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 193)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 194)           putc( ' ', ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 195)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 196)         putc( b, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 197)         for( ;; )
11c606a6 (kx 2023-04-11 01:18:34 +0300 198)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 199)           a = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 200)           if( a == '[' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 201)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 202)             for( ;; )
11c606a6 (kx 2023-04-11 01:18:34 +0300 203)             {
11c606a6 (kx 2023-04-11 01:18:34 +0300 204)               putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 205)               a = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 206)               if( a == ']' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 207)               {
11c606a6 (kx 2023-04-11 01:18:34 +0300 208)                 break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 209)               }
11c606a6 (kx 2023-04-11 01:18:34 +0300 210)               if( a == '\\' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 211)               {
11c606a6 (kx 2023-04-11 01:18:34 +0300 212)                 putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 213)                 a = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 214)               }
11c606a6 (kx 2023-04-11 01:18:34 +0300 215)               if( a == EOF )
11c606a6 (kx 2023-04-11 01:18:34 +0300 216)               {
11c606a6 (kx 2023-04-11 01:18:34 +0300 217)                 error( input_fname, "Unterminated set in Regular Expression literal" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 218)                 return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 219)               }
11c606a6 (kx 2023-04-11 01:18:34 +0300 220)             }
11c606a6 (kx 2023-04-11 01:18:34 +0300 221)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 222)           else if( a == '/' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 223)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 224)             switch( peek() )
11c606a6 (kx 2023-04-11 01:18:34 +0300 225)             {
11c606a6 (kx 2023-04-11 01:18:34 +0300 226)               case '/':
11c606a6 (kx 2023-04-11 01:18:34 +0300 227)               case '*':
11c606a6 (kx 2023-04-11 01:18:34 +0300 228)                 error( input_fname, "Unterminated set in Regular Expression literal" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 229)                 return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 230)             }
11c606a6 (kx 2023-04-11 01:18:34 +0300 231)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 232)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 233)           else if( a =='\\' )
11c606a6 (kx 2023-04-11 01:18:34 +0300 234)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 235)             putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 236)             a = get();
11c606a6 (kx 2023-04-11 01:18:34 +0300 237)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 238)           if( a == EOF )
11c606a6 (kx 2023-04-11 01:18:34 +0300 239)           {
11c606a6 (kx 2023-04-11 01:18:34 +0300 240)             error( input_fname, "Unterminated Regular Expression literal" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 241)             return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 242)           }
11c606a6 (kx 2023-04-11 01:18:34 +0300 243)           putc( a, ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 244)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 245)       b = next();
11c606a6 (kx 2023-04-11 01:18:34 +0300 246)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 247)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 248) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 249) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 250) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 251) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 252)   jsmin - Copy the input to the output, deleting the characters which are
11c606a6 (kx 2023-04-11 01:18:34 +0300 253)           insignificant to JavaScript. Comments will be removed. Tabs will be
11c606a6 (kx 2023-04-11 01:18:34 +0300 254)           replaced with spaces. Carriage returns will be replaced with linefeeds.
11c606a6 (kx 2023-04-11 01:18:34 +0300 255)           Most spaces and linefeeds will be removed.
11c606a6 (kx 2023-04-11 01:18:34 +0300 256) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 257) static void jsmin()
11c606a6 (kx 2023-04-11 01:18:34 +0300 258) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 259)   if( peek() == 0xEF ) { get(); get(); get(); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 260)   a = '\n';
11c606a6 (kx 2023-04-11 01:18:34 +0300 261)   action( 3 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 262) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 263)   while( a != EOF )
11c606a6 (kx 2023-04-11 01:18:34 +0300 264)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 265)     switch( a )
11c606a6 (kx 2023-04-11 01:18:34 +0300 266)     {
11c606a6 (kx 2023-04-11 01:18:34 +0300 267)       case ' ':
11c606a6 (kx 2023-04-11 01:18:34 +0300 268)         action(is_alpha_or_num(b) ? 1 : 2);
11c606a6 (kx 2023-04-11 01:18:34 +0300 269)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 270)       case '\n':
11c606a6 (kx 2023-04-11 01:18:34 +0300 271)         switch( b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 272)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 273)           case '{': case '[': case '(':
11c606a6 (kx 2023-04-11 01:18:34 +0300 274)           case '+': case '-': case '!':
11c606a6 (kx 2023-04-11 01:18:34 +0300 275)           case '~':
11c606a6 (kx 2023-04-11 01:18:34 +0300 276)             action( 1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 277)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 278)           case ' ':
11c606a6 (kx 2023-04-11 01:18:34 +0300 279)             action( 3 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 280)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 281)           default:
11c606a6 (kx 2023-04-11 01:18:34 +0300 282)             action( is_alpha_or_num(b) ? 1 : 2 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 283)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 284)         break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 285)       default:
11c606a6 (kx 2023-04-11 01:18:34 +0300 286)         switch( b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 287)         {
11c606a6 (kx 2023-04-11 01:18:34 +0300 288)           case ' ':
11c606a6 (kx 2023-04-11 01:18:34 +0300 289)             action( is_alpha_or_num(a) ? 1 : 3 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 290)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 291)           case '\n':
11c606a6 (kx 2023-04-11 01:18:34 +0300 292)             switch( a )
11c606a6 (kx 2023-04-11 01:18:34 +0300 293)             {
11c606a6 (kx 2023-04-11 01:18:34 +0300 294)               case '}':  case ']': case ')':
11c606a6 (kx 2023-04-11 01:18:34 +0300 295)               case '+':  case '-': case '"':
11c606a6 (kx 2023-04-11 01:18:34 +0300 296)               case '\'': case '`':
11c606a6 (kx 2023-04-11 01:18:34 +0300 297)                 action( 1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 298)                 break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 299)               default:
11c606a6 (kx 2023-04-11 01:18:34 +0300 300)                 action( is_alpha_or_num(a) ? 1 : 3 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 301)             }
11c606a6 (kx 2023-04-11 01:18:34 +0300 302)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 303)           default:
11c606a6 (kx 2023-04-11 01:18:34 +0300 304)             action( 1 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 305)             break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 306)         }
11c606a6 (kx 2023-04-11 01:18:34 +0300 307)     }
11c606a6 (kx 2023-04-11 01:18:34 +0300 308)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 309)   /* lats carriage return */
11c606a6 (kx 2023-04-11 01:18:34 +0300 310)   putc( '\n', ofile );
11c606a6 (kx 2023-04-11 01:18:34 +0300 311) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 312) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 313) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 314) int minimize_json( const char *ifname, const char *ofname )
11c606a6 (kx 2023-04-11 01:18:34 +0300 315) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 316)   int status, ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 317) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 318)   if( !ifname || !ofname ) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 319) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 320)   status = exit_status; exit_status = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 321) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 322)   input_fname = ifname;
11c606a6 (kx 2023-04-11 01:18:34 +0300 323) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 324)   ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 325) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 326)   ifile = fopen( ifname, "r" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 327)   if( ifile == NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 328)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 329)     ERROR( "JSMIN: Can't open '%s' file", ifname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 330)     exit_status = status + exit_status;
11c606a6 (kx 2023-04-11 01:18:34 +0300 331)     return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 332)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 333) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 334)   ofile = fopen( ofname, "w+" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 335)   if( ofile == NULL )
11c606a6 (kx 2023-04-11 01:18:34 +0300 336)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 337)     ERROR( "JSMIN: Can't open '%s' file", ofname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 338)     exit_status = status + exit_status;
11c606a6 (kx 2023-04-11 01:18:34 +0300 339)     return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 340)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 341) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 342)   jsmin();
11c606a6 (kx 2023-04-11 01:18:34 +0300 343) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 344)   fclose( ifile ); ifile = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 345)   fflush( ofile ); fclose( ofile ); ofile = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 346) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 347)   if( exit_status == 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 348)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 349)     ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 350)     exit_status = status;
11c606a6 (kx 2023-04-11 01:18:34 +0300 351)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 352)   else
11c606a6 (kx 2023-04-11 01:18:34 +0300 353)   {
11c606a6 (kx 2023-04-11 01:18:34 +0300 354)     exit_status = status + exit_status;
11c606a6 (kx 2023-04-11 01:18:34 +0300 355)   }
11c606a6 (kx 2023-04-11 01:18:34 +0300 356) 
11c606a6 (kx 2023-04-11 01:18:34 +0300 357)   return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 358) }