Jzip - GNU JavaScript Minifier

Status
Niet open voor verdere reacties.

Jori13

Gebruiker
Lid geworden
18 jan 2010
Berichten
159
Laatst bewerkt:
Use "Jzip help" for help.

En dat werkt niet, dus aan de executable (jzip.exe) heb je zo niet veel zonder de broncode ook door te nemen.

Tijs.
 
maakt niets uit: Je krijgt de syntax voor het gebruik van het programma niet te zien als je jzip help intypt.
Enige wat je dan krijgt is
JZip (C) Jori Koolstra. Use "jzip help" for help.

JZip (V 1.0.0.0) written in ANCI C. Compiled with the Microsoft Visual C 2008 (cl.exe) compiler. This is Open-Source software protected under the GNU licence.

waarmee hoe het programma gebruikt moet worden niet is uitgelegd.

Tijs.
 
O bedoel je dat, ik heb het misschien wat onduidelijk gedaan :P

Typ voor de syntaxis:
jzip

Dus zonder andere argumenten.


Edit:

'jzip help' zou nu ook de syntax moeten laten zien...
 
Laatst bewerkt:
Hoi,


het werkt! Ik heb voor de lol mn tile engine er eens doorheen gegooid, en kreeg mooi een gecompressde file terug. (Voor de record, dit is het originele file).



:thumb:
 
handig programma, maar als iets onder de GNU license word uitgegeven is moet de licensie moet er bij worden gevoegd(onder welke versie is dit) en je kan beter -h/ --help gebruiken in plaats van help omdat alle andere programmas dat ook gebruiken. als er mac users zijn die dit willen ik heb een kopie.
 
Hoi,


het werkt! Ik heb voor de lol mn tile engine er eens doorheen gegooid, en kreeg mooi een gecompressde file terug. (Voor de record, dit is het originele file).



:thumb:

Mooi :)



handig programma, maar als iets onder de GNU license word uitgegeven is moet de licensie moet er bij worden gevoegd(onder welke versie is dit) en je kan beter -h/ --help gebruiken in plaats van help omdat alle andere programmas dat ook gebruiken.

Ik zal licentie inderdaad even toevoegen, bedankt. 'help' ga ik niet veranderen :P (MySQL gebruikt toch ook 'help' :P)

als er mac users zijn die dit willen ik heb een kopie.

Wat bedoel je precies :)?



EDIT:
Ben op het moment bezig met een C library voor het lezen/bewerken van .ini files. Als die af is en gedebugd zal ik hem ook posten.
 
Laatst bewerkt:
php, perl, gcc enz al die programma's gebruiken -h/--help.

ik heb hem gecompiled voor mac os x.
 
Laatst bewerkt:
ik kreeg 5 warnings:
Code:
main.c:23: warning: 'qwoted_type' initialized and declared 'extern'
main.c:24: warning: 'qwoted' initialized and declared 'extern'
main.c:25: warning: 'regexp' initialized and declared 'extern'
main.c:26: warning: 'file_size' initialized and declared 'extern'
main.c:84: warning: unused variable 'nextchar'
 
Op- of aanmerkingen? Post graag :)


Ik heb even snel door je code heen gekeken, en wat mij opgevallen is:

- met het sleutelwoord extern geef je aan dat de variabelen ergens anders gedefinieerd worden, wat eigenlijk niet het geval is.
- het sleutelwoord register is op een moderne compiler overbodig.
- ipf wordt wel geopend binnen de main functie, maar wordt verder nergens gesloten. (in dit geval is het makkelijker de functie die je aanroept zelf het bestand te laten openen/sluiten - zodat je dus alleen de bestandsnaam meegeeft)

[cpp]
/* Inputfile but no output file */
if (argv[2] != NULL && argv[2] == NULL) // dit wordt uiteraard nooit uitgevoerd :p
[/cpp]

[cpp]
/* RegExp? */
if (c == '/')
{
if (regexp && prevchar != '\\' || regexp && prevchar == '\\' && preprechar == '\\') // hier wordt twee keer gekeken of regexp true is, wat uiteraard nergens voor nodig is.
{
regexp = 0;
}
else if (prevchar == '(' && c == '/' /* Je moet het niet moeilijker maken dan het is: c is immers altijd gelijk aan '/', anders werd deze code niet uitgevoerd */ && qwoted == 0 || prevchar == '=' && c == '/' && qwoted == 0 || prevchar == ':' && c == '/' && qwoted == 0)
{
regexp = 1;
}
}
[/cpp]

Verder maak je het zoals ik zeg ingewikkelder dan het is door vaker dezelfde waardes te controleren, zoals hieronder bijvoorbeeld:

[cpp]
if (c == '\'' && qwoted_type != 0 && prevchar != '\\' && regexp == 0 || c == '\'' && qwoted_type != 0 && preprechar != 0 && prevchar == '\\' && preprechar == '\\' && regexp == 0 || c == '"' && qwoted_type != 1 && prevchar != '\\' && regexp == 0 || c == '"' && qwoted_type != 1 && preprechar != 0 && prevchar == '\\' && preprechar == '\\' && regexp == 0)
[/cpp]

Hier vergelijk je twee keer of c == '\' en twee keer of qwoted_type != 0 is. Dat is nergens voor nodig en zo wordt de code complexer dan nodig is.

edit: niet goed gekeken met reageren, je vergelijkt zelfs nog vaker hetzelfde dan ik heb aangegeven. (te lui om de rest aan te passen - het gaat tenslotte om het idee); Het controleren van het aantal argumenten doe je trouwens aan de hand van de variabele argc, deze bepaalt immers de grootte van de array argv (grootte is argc-1). Op je huidige manier spreek je wellicht elementen aan die niet binnen de array vallen.
 
Laatst bewerkt:
Bedankt voor je reactie.

Extern is standaard in globale scope, maar het is niet gebruikelijk om het er bij te zetten. Register is inderdaad niet persee nodig, maar het maakt verder ook niet echt uit, het word immers toch terug naar auto gezet als de register mislukt.

Ik was vergeten wat bugfixes up te loaden. Ik zal (zodra ik thuis ben) de verbeterde versies uploaden.

Wat nog een bug is bijvoorbeeld is dat je input- en output file gelijk aan mekaar mogen zijn.


Ben nieuw in C dus: hoe zou ik dit sneller kunnen schrijven? :)

[CPP] if (regexp && prevchar != '\\' || regexp && prevchar == '\\' && preprechar == '\\') // hier wordt twee keer gekeken of regexp true is, wat uiteraard nergens voor nodig is.
{
regexp = 0;
}
[/CPP]



Jori.



EDIT:

En ik spel ANSI verkeerd :D
 
Laatst bewerkt:
Vlgs. mij is dit de 'kortere' versie:
Code:
if (regexp && (prevchar != '\\' || (prevchar == '\\' && preprechar == '\\')))
            {
                regexp = 0;
            }

Ik geloof (maar ben niet zeker) dat zelfs het volgende mag:
Code:
if (regexp && (prevchar != '\\' || prevchar == preprechar == '\\'))
            {
                regexp = 0;
            }


Zal wellicht nóg korter kunnen, maar dat merken we dan wel.

Tijs.
 
Laatst bewerkt:
Jori13;3520034 Ben nieuw in C dus: hoe zou ik dit sneller kunnen schrijven? :) [CPP zei:
if (regexp && prevchar != '\\' || regexp && prevchar == '\\' && preprechar == '\\') // hier wordt twee keer gekeken of regexp true is, wat uiteraard nergens voor nodig is.
{
regexp = 0;
}
[/CPP]


Als ik stoned ben mis ik soms de logica achter de code, dus vandaar dat ik het daarstraks over het hoofd heb gezien. Maar de voorwaarde die je stelt is tegenstrijdig en daarom zal er nooit aan voldaan kunnen worden. Prevchar moet namelijk gelijk en ongelijk aan '\\' zijn om uitgevoerd te worden.

Waarschijnlijk bedoel je gewoon het onderstaande?
[cpp]
if (regexp && prevchar == preprechar && prevchar == '\\')
// ...
[/cpp]
 
Vlgs. mij is dit de 'kortere' versie:
Code:
if (regexp && (prevchar != '\\' || (prevchar == '\\' && preprechar == '\\')))
            {
                regexp = 0;
            }
Dit doet niet hetzelfde als de TS geschreven heeft.

edit: na het nogmaals bekijken van zijn code denk ik wel dat je gelijk hebt wat betreft zijn bedoelingen. De code kan wel iets compacter, omdat de code na de or-operator pas wordt uitgevoerd indien de voorwaarde ervoor niet waar is. In dit geval weet je dus zeker dat prevchar gelijk is aan '\\' en indien prevchar en preprechar gelijk aan elkaar zijn ze beide de waarde '\\' hebben.

[cpp]
if (regexp && (prevchar != '\\' || prevchar == preprechar))
[/cpp]

Ik geloof (maar ben niet zeker) dat zelfs het volgende mag:
Code:
if (regexp && (prevchar != '\\' || prevchar == preprechar == '\\'))
            {
                regexp = 0;
            }

prevchar == preprechar == '\\' /* doet: true of false (0 of 1) met '\\' vergelijken, wat uiteraard nooit true zal zijn. */
 
Laatst bewerkt:
[off-topic?]
@CoD_NL:

Ik ben toch benieuwd over je commentaar op mijn eerste vereenvoudiging:

[...]Dit doet niet hetzelfde als de TS geschreven heeft.

Dat lijkt me sterk, eerlijk gezegd. De TS had de volgende code (of die nu wel of niet klopt is hier nu even niet ter zake):
Code:
if (regexp && prevchar != '\\' || regexp && prevchar == '\\' && preprechar == '\\') // hier wordt twee keer gekeken of regexp true is, wat uiteraard nergens voor nodig is.
            {
                regexp = 0;
            }

Oftewel:
ALS (regexp = TRUE EN prevchar ONGELIJK '\\' OF regexp = TRUE EN prevchar GELIJK '\\' EN preprechar GELIJK '\\')
Dat lees ik als (met EN met hogere prioriteit dan OF):
ALS ((regexp = TRUE EN prevchar ONGELIJK '\\') OF (regexp = TRUE EN prevchar GELIJK '\\' EN preprechar GELIJK '\\'))
Dat zou betekenen dat aan beiden kanten van OF gecheckt wordt of regexp = TRUE
Dus (tenzij EN en OF dezelfde prioriteit hebben, maar dat lijkt me sterk, zie hier, onderdeel "Precedence of operators") kan dit herschreven/verkort worden als:
ALS (regexp = TRUE EN (prevchar ONGELIJK '\\' OF (prevchar GELIJK '\\' EN preprechar GELIJK '\\')))

Als inderdaad EN gaat vóór OF dan had mijn code zelfs nog een paar haakjes minder kunnen hebben:
Code:
if (regexp && (prevchar != '\\' || prevchar == '\\' && preprechar == '\\'))
            {
                regexp = 0;
            }


Zie ik het verkeerd (ook al is dat voor de topic-starter niet nuttig maar alleen voor mij), dan graag aangeven wat er niet klopt aan mijn analyse/beweringen hierboven.

Tijs.[/off-topic?]
 
Laatst bewerkt:
@dnties: ik heb die code inderdaad verkeerd geinterpreteerd en ik vind het ook geen probleem om dat toe te geven hoor. :o
(en het is niet echt off-topic als je het mij vraagt)
 
Er zitten inderdaad wat oneffenheden in. Ik zal later deze week de code wat compacter herschrijven, voor nu heb ik alleen wat bugs opgelost:

Met versie 1.1.0.0 ...

* Een bug waardoor single line comments soms niet werden verwijderd.
* Het warning-systeem uitgebreid.
* Een paar kleine bugs opgelost
* Iets uitgebreidere hulp

De source is (tijdelijk) alleen hier te zien:
www.xs4all.nl/~pnugter/jzip/jzip.c

En de binary file:
www.xs4all.nl/~pnugter/jzip/jzip.exe


Als er nog meer op- aan merkingen zijn hoor ik het graag.

Jori.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan