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) }