blog.darkstar.work - a simple url encoder/decoder

 a simple url encoder/decoder
 http://blog.darkstar.work

Labels

Wirtschaft (152) Pressefreiheit (131) Österreich (123) IT (98) code (62) Staatsschulden (37) EZB (27) Pensionssystem (16)
Posts mit dem Label code werden angezeigt. Alle Posts anzeigen
Posts mit dem Label code werden angezeigt. Alle Posts anzeigen

2024-09-19

Windows file Date.Created, Date.Modified on File Copy, Move & Write

File.Copy

File.Copy, no matter if made with Windows Explorer, command copy, xcopy or programs, that use File.Copy Windows Api call, creates a new file or overwrites an existing file, where
Created Date = now,
Last Modified Date = Last modified DateTime of original file

File.Move

File.Move, no matter if made with Windows Explorer, Command move or programs, that use File.Move Windows Api call, creates a new file or overwrites an existing file, where
Created Date = created DateTime of original file
Last Modified Date = Last modified DateTime of original file

File.Write

File Write, no matter, if Console Application, Windows Application or Windows Service or what ever, creates a new or overwrites an existing file, where
Created Date = now
Last Modified Date = now

Simple C# Program 'gscopy.exe' to demonstrate

https://github.com/heinrichelsigan/cmdcopy [ releases ]


https://pastebin.com/Mw64xbqk

2024-07-14

Fuzzy Logic: in memoriam Siegfried Gottwald † 20.9.2015

Siegfried Johannes Gottwald (* 30. 3. 1943 in Limbach; † 20. 9. 2015) war ein deutscher Mathematiker, Logiker und Wissenschaftshistoriker. Sein Hauptforschungsgebiet war Fuzzy Logic
https://www.researchgate.net/profile/Siegfried-Gottwald

Mein langjähriger Freund Bob (Robert Antonius Berezka) sah Anfang der 1990er in diesem Gebiet sehr großes Entwicklungspotential, das aber leider nicht genutzt wurde. (1) 


Potential für Fuzzy Logik ∃ in binärer Logik + Mengentheorie.



Binäre Fuzzy Logik

Trigger für Einschalten von Erneuerbaren Energie Mini- / Hobby- Kraftwerken, erst ab gewisser naturgegebener Eingangsleistung.


Windrad Hobby-/ Mini-Kraftwerk

  • Windgeschwindigkeit <  4m/s 
    bitte keine Windenergie speichern oder einspeisen
  • Windgeschwindigkeit > 150m/s
    Orkan; Windrad auf Durchlauf, keine Stromgewinnung über zu hohem Grenzwert


Solaranlage Hobby-/ Mini-Kraftwerk

  • Sonnenstunden / Tag < ¾ Sonnenstunde im Winter
    wir belasten unseren Wechselrichter besser nicht unnötig,
    denn  bei schwacher Eingangsleistung für < ¾h, wird kaum Wechselstrom Energie in einer relevanten Menge erzeugt werden können.

Fuzzy für unscharfe Mengen

Verwendung von unscharfer Mengen schien dort vielversprechend, wo wir heute in der Statisik disjunkte Mengen und eindeutige Werte Preferenzen verwenden.

Erfassung Erwerbsarbeit

Jemand wie ich war in den letzten 3 Jahren,
  1. sowohl angestellt erwerbstätig,
  2. als auch selbstständig erwerbstätig, davon
    a. als echter Kleinunternehmer mit soliden Auftragsarbeiten für KMU's
    b. prekär als Kleinstunternehmer (eher mehr NGO community based project)/li>
  3. beim AMS arbeitslos gemeldet.
Ich bin sicher nicht der einzige, der in der Erwerbsarbeitsstatistik nicht eindeutig zuordenbar ist und hier liefert die bisherige Statistik kein passendes Bild über die Erwerbsrealität von Menschen.
Es gibt heute bereits mehr Menschen als früher, die weder als Dauerarbeitslose noch als fast durchgehend beschäftigt zuordenbar sind.

Wahlumfragen:

ÖVP  24%(scharf)  22%-30%(fuzzy)
SPÖ  20%(scharf)  18%-24%(fuzzy)
FPÖ  25%(scharf)  23%-30%(fuzzy)
Grüne  12%(scharf)   8%-15%(fuzzy)
Neos  10%(scharf)   9%-12%(fuzzy)
KPÖ    3%(scharf)   1%- 6%(fuzzy)
Bier    5%(scharf)   4%- 8%(fuzzy)


Normalerweise hat Bob oft den richtigen Riecher bezüglich langfristig technischer Trends,
wie z.B.  C/C++ wird noch lange weiter bestehen  C bleibt primäre Sprache zur Hardware und Betriebssystem nahen Programmierung
Bei Win3.11 mit sauberen Win32 API (statt Win16 und Dos16) beginnt die Zukunft. Es stimmt, Dos16 und Win16 sind inzwischen wirklich Geschichte, aber Win32 API (seit 1993) bleibt weiter bestehen.
Intel, AMD x86, x64 Architektur wird sich gegenüber Sun Sparc, MIPS, Motorola 680x0  auch  PowerPC PPC/MPC60xDEC Alpha und anderen durchsetzen (es stimmte, sogar Apple verwendete irgendwann Intel für seine MacBooks)
if there is no huge sophisticated optimization in gcc or cross compile support in Micro$oft Visual Studio for a certain processor architecture => forget this architecture. When it become not so performant for all GNU or QT stuff, then think about, how effective will be the Java Runtime / SDK, .Net Runtime / SDK, how effective the build for script languages like perl, php, python, tcl.
I only believe in Intel, AMD, Arm, Micro$oft, Apple and the man with the Red Hat.
all other commerical Unix based systems (OS/2, AIX, HPUX, Solaris, Irix) were quiet good, but  all specialized file systems like XFS, ZFS, brtfs are ported to Linux, forget processor architecture, if no sophisticated optimization in gcc.

2024-04-25

Making symmetric cipher encryption strong again [updated]

When students in the 2nd semester in year 1992 type on the laptop during the lecture or start talking, Professor Gerd Baron always repeated very loudly that's what's all about:

We have a universe here and 
it's all about of the number of arrangements in a finite set.

Professor Gerd Baron of Mathematics modified math lecture for computer scientists, where he claimed graph theory and combinatorics and weighted models (for traveling salesmen or ip routing) to understand better things we will need later (like equal costs => multipath).

plain text ⟶ 3DES PBox → AES → 2blowfish ⟶ cipher text
cipher text ⟶ 2blowfish → AES → 3DES SBox ⟶ plain text

plain text ⟶ AES ⟶ 2blowfish ⟶ 3DES PBox (scrambled) ⟶ cipher text
cipher text ⟶ 3DES  SBox(scrambled) → 2blowfish → AES ⟶ plain text

you also can remix it per good random numbers like
3DES = 0x1
AES = 0x2
2Fish = 0x4
Serpent = 0x8

So 0xBC for encryption would mean 0xCB for decryption
plain ⟶ (3DES→AES→Serpent) ⟶ (2Fish→Serpent) ⟶ encrypted
encrypted ⟶ (Serpent→2Fish) ⟶ (Serpent→AES→3DES) ⟶ plain 

with 2 bytes strong keys (negoatiated randomized at handshake) you're quiet secure.


Try it out on area23: https://area23.at/net/SAES_En_Decrypt.aspx
Github repository: github.com/heinrichelsigan/area23.at/


A simple matrix encryption algorithm by myself:

I found a simple matrix symmetric encryption algorithm, that works similiar to 3DES,
with NxN Matrix trans, after asking that question here on  math.stackexchange.com/questions/4915786/ 

R3 ➝ R3: v(3) x M(3,3) = v(3)

⎡ 1 ⎤    ⎡ 0 1 0 ⎤    ⎡ 2 ⎤ 
⎢ 2 ⎥ x  ⎢ 0 0 1 ⎥ =  ⎢ 3 ⎥  
⎣ 3 ⎦    ⎣ 1 0 0 ⎦    ⎣ 1 ⎦ 
The inverse matrix for reverse symmetric encryption would be:
⎡ 2 ⎤    ⎡ 0 0 1 ⎤    ⎡ 1 ⎤ 
⎢ 3 ⎥ x  ⎢ 1 0 0 ⎥ =  ⎢ 2 ⎥  
⎣ 1 ⎦    ⎣ 0 1 0 ⎦    ⎣ 3 ⎦ 
ZenMatrix symetric chiffre encryption

More symmetric cipher algos are now availible!

Area23.At.Mono already contained:
3DES, 2FISH, 3FISH, AES, Rijndael (same as AES), Serpent and new ZenMatrix.

The following symmetric cipher encryption / decryption algorirhms have now been added:
Camellia, Cast[56]Gost28147, Idea, RC[26], RC532, Seed, Skipjack, Tea, Tnepres, XTea.

Why I'm publishing this article?

Unfortunately, since I catched a schizoaffective disorder 2007, I have sometimes the tendency to talk loudly and am often paranoid about being wiretapped.
Existing even bigger companies, were I was employed, (I told them about my problem since 2007) meaned, that I didn't break the compliance in that case, because I can assume that we have not the GDR with Stasi here and loudly repeating fraud detection rules at home isn't a crime. Once I feeled very painful and a spoke out loudly my idea of better AES. To avoid, that only some people could get it, I wrote a simple prototype and then sended this article to old friends, who work at US companies.

2024-04-14

How to enable ipv6 (inet6) in AWS EC2 VPCs, Subnets, Network interfaces and instances

This is a very quick and walk through documentation, how to enable ipv6 addresses and ipv6 networking in AWS (Amazon Web Services) E2C instances.

Ensure that virtual hardware is enabled for ipv6

In this section, we check if VPC, Subnets, Routing Tables and Network Interfaces are ready for ipv6.
It's a walkthroigh in form of (examine, check, enable ipv6 <= if not already enabled).

2024-04-05

Great companies on alibaba with impressive solutions

Qingdao HenryD Wind Power Equipment Co., Ltd.

green renewable energy
https://hldwtg.en.alibaba.com/

Helios Technology Co., Ltd.

green renewable energy
https://evhelios.en.alibaba.com/

Guangzhou Sary Electronics Co., Ltd.

Master key systems, fingerprint sensors, elctomagnetic lock
https://sary.en.alibaba.com/

Shanghai Pinnxun Electric Motor Co., Ltd.

https://pinnxun.en.alibaba.com/

Fuchun Industry Development Company

hydro turbines (please check IP)

Shenzhen Qinda Electronics Co., Ltd.

electronic process automation
https://qindamodule.en.alibaba.com

Other subdomains:

2024-03-28

system library:BIO_connect:Connection refused:../crypto/bio/bio_sock2.c

I got the strange error message 
system library:BIO_connect:Connection refused:../crypto/bio/bio_sock2.c
on executing 
openssl s_client -starttls smtp -connect mail.area23.at:587
when testing sendmail smtp tls with an Let's Encrypt SSL certificate.

If you got the same error message, ensure that
  1. sendmail is running (on mail server / relay host)
    test it with init rc script 
      /etc/init.d/sendmail status
    or simple by process listing tools, like 
      pstree | grep sendmaail
      pidof sendmail-mta
      ps fauxwww | grep sendmail
    and network server socket is bound 
      netstat -avn 2>&1 |less
    or fuser and your sendmail port
      fuser -v -n tcp 25
    or various variants of lsof, like
      lsof -i TCP:25

  2. sendmail is well configured (on mail server / relay host)
    this will take a little bit too long for that article
    in my case it was a wrong IPv6 address in sendmail.mc

    DAEMON_OPTIONS(`Family=inet6, Name=MTA-v6, Port=smtp, Addr=2600:1f14:1d6d:f202:8d53:fc57:c45d:6590')dnl
     
  3. mail server is reachable from outside 
    test it with 
     telnet [mailserver] [port]
    or brutal way with a network scanner, like nmap
      nmap -p 25,465,587 [mailserver]

    if mailserver is not reachable from outside, 
    then you must lookup on server and on client firewall rules, e.g
    .
      iptables -t filter --list
      iptables -6 -t filter --list
You could also simply run strace to see, what happens:
  strace openssl s_client -starttls smtp -connect mail.area23.at:587

strace openssl s_client -starttls smtp -connect [mailserver] [port]

2024-03-07

html uft-8 symbol generation shell script

I wrote tonight a short uft-8 html escapes generating shell script,
see script generated results here: https://area23.at/utf8/.
#!/bin/sh
# generates uft-8 symbol html reference

outtext=utf8_pre_sym2000.html

modHex=256
modFF=255
modZero=0
shx=1024

printf "<html>\n<head><title>utf-8 symbol></title></head>\n<body>\n\t<h1>UTF-8 Symbols</h1>\n\t<div><span>\n" > $outtext

while [ $shx -lt 16384 ] ; do

        modZero=$(echo "$shx % $modHex" | bc)
        if [ $modZero -eq 0 ] ; then
                printf "\n<h2>hex x%x ~ dec %d</h2>\n" $shx $shx >> $outtext
                printf "\n<pre>symbol\thex x%x \tdecimal %d \t.\n" $shx $shx >> $outtext
        fi

        printf "&#x%x;\t&#x%x;\t&#%d;\t.\n" $shx $shx $shx  >> $outtext

        modFF=$(echo "$shx % $modHex" | bc)
        if [ $modFF -eq 255 ] ; then
                printf "</pre>\n" >> $outtext
        fi

    shx=$(echo "$shx + 1" | bc);
done

printf "\n\t<hr />\n\t</span></div></body></html>\n" >> $outtext


see full script at pastebin.com/0aNumds1 

hexsym.sh

2024-02-26

Danger of huge monopolisation and checks and balances to keep up a living strong democracy

(Draft)

Monolopy (Conspiracy theory warning)

In mercantilism owning and potentially using a monopoly was considered as tactical advantage. Think about it, that China soonly has a monopoly on a lot of industrial products, but most of China's hardware exoported have an american, south korean or japanse label. 

When there might be a common closed source smart phone. personal computer or smart phone with only one operating system with market dominance over 90%, then we might run into a trap.

If later then, disassembling, reversing engineering is punished with high penalties and international legal claims, then social credit program can be introduced step by step by backdoor.

If your social credit is negative, then you might not have all functions enabled (on your monopoly phone or monopoly personal computer) (THIS MIGHT BE VERY DANGEROUS)


Attention, Huawei, Chinas biggest smart-phone brand and ready to soonly be main player also in african markets, is still android and open based on open source linux and I don't claim, that China will use such practices. But there is no guarantee, that US or Chinese companies would develop or exrend their powers to collect more data or control more individuals in entire world by monitoring them permanently. 
In open system, you can choose a other os to install on every hardware. I remember, that Sony Playstation implemented an other OS bootloader, where you could run linux on it. The community demanded it. Today no one tries to recommand LineageOS compatbility on Smart-Phone hardware.

Balances & checks for free democracies


Freedom of media index

Multiple independant print & internet media or different media blocks. +1

Fact-Checking in more serious media. +0,5

Double Fact checking, interviewing all stakeholders. +0,5

Different TV stations and radio stations in country.. +1

Access to satellite tv or streamed news in internet +1

Access to different ISPs. foreign western Proxy Services, entire Internet and Tor Onion Router +1

Possibility to blog, moderate in blogs and internet media and not permanently censhorship (censorship, when hawkishing a little bit to much for hours until 1 week is OK). +1

Possibility to report over public events in blogs, media, internet media like X or Facebook, you need special permission and agreement from company, private person and NGO, when reporting inside over companies, NGOs, military and private persons private sphere (concerning e.g. product placement, innovations, sexuality or belief). +1

Tolerate whistleblowing like in the US, when reporting over complicated human rights violences of foreign troops in war. +0,5

Storry telling, conspiracy theories and narratives are marked with a recognizable symbole, e.g. +0,5

Civil & business & companies rights

9 basic points

The word church in follwoing could also mean shrine, temple, stone circle, lgbt community or any religious monoment or place.

Freedom of assembly (if missing -4)

  • Right for workers to join a labor union or representation of employees.
  • Right for companies to join a free foundation or trade guild.  

  • Right to join a religious community or free church (no hierachically bottom up grassroot foundate non state church).

Freedom of speach, freedom of art and freedom of posts without state sanctions (exception national socialists content, radical djihadist content, stalinist content in some countries)   (if missing -4)

Right to work self choosen and startup again after phase of unemployment. Right to work no matter what in company, NGO as free artist, freelancer, whatever ... (for some non free profession, like medical doctor or train man you need a special prooved certificate or degree) (if missing -4)

Right to found, own, buy (part of) a company or poperty, right to own stock market values, money, gold, derivates, freedom to choose bank and payment provider and freedom of trade  (Excpet US patriot act or sanctions against countries as US ally) (if missing -5)

Right for worker to leave company (inside a certain time period, normally 0-3 months) when getting a better offer without extreme high penality for joining another company. Right for companies to hire & fire women & men inside a certain time period (normally 0-3 months). (if missing -4)

Right to vote, right to protest and right to access basic state services for every citizen. (if missing -4)

Freedom of operating system, freedom to choose between open & closed source and freedom to develop after a free choosen license, e.g. BSD, Apache, GNU, MIT, closed source). (if missing -4
(Standardized licenses for paying and billing closed source, 3-10 categories would be nice, like renting software as a service like office 365, paying a cloud provider on network and CPU and storage using, installing a software and paying for year a guaranteed support, ...)

Right on abortion, if both mother & father agree to it, because otherwise they would be slaves, owned by a landlord in law. Free citizens should have that right. Don't bring slavery back to US. (if missing -5)

Right to have a own sexuality, freedom for adults to have sex if both agree (maybe after rules of their church), right to marriage (maybe after rules of a church or federal state). (if missing -3)

Right to adopt non adult childs, if parents or next familiars (if parents death) of children agree to it and have a permanently visiting right at least all 2 weeks. Maybe a free NGO check is needed, that this is good too. (if missing -3)

Non discrimination rights and possibility to protest against it or go to an independant court. 
(In private companies I saw and experienced discrimination very rarley, but at civil services or police or public high schools, this is happening some times).  (if missing -2

Right of an independent and fair judgement (maybe right to have a second independant judge, if court is politically motivated).  Right of comparison between companies or private persons (both agree that one pays the other a fee of 100US$ of causing pain per day) (if missing -3

Right to wear waepons for veterans (who served at national army with locked and loaded waepons).  (if missing -1

Right for people over 16 to drive a car, ride a byke, bicycle (maybe a confirmed license is needed, horse, donkey, drink whiskey (of course not when riding or driving a vehicle) and smoking natural herbs, tobaco (but no opiods). (Maybe the right of your church doesn't allow some parts).  (if missing -2

Right to have a save and proper enviroment: State can ban bear, wolfes or elephant hunts or shutting birds or using animals for bio-nano technolgy experiments.  (if missing -2

Denied: Experiments with human beeings without their agreement (signed and 3rd party validated) (like milkram experiment) is forbidden. Long time studies of human beeings. (if missing -4

Right to access independent technology to scan your genom and verify children and parents, if they agree. (if missing -2



Social rights:

(For Europe, Great-Britain. Brazil and ???): Right of small social security (at least 1000US$ per month), if you get unemployed or need assistence.  (if missing -3) (State money transfer over 150.000 US$ per year without doing anything is strictly forbidden. Excluded: Fees from private companies as a free services for long employment, excellent performance or great innovation or great ad value).

Right for every cirtizen to access as citizen public libraries with internet access with a legitimated identifying card.

Right to repair wikipedia, right of elected assembly to transfer special money to some urgently needed NGO task forces, like open source foundation, wikipedia, ...

Right for jobless people to getting courses to be ready for a new job, where they are only 40% - 80% qualified and not enough fit 4 work.

To be continued ...






2023-12-31

Linux v6.7-rc8 kernel compiled today


Today, when I waked up before the new year, I downloaded the newest linux v6.7-rc8 kernel, made a classic menuconfig and readed a bit kernel documentation, before compiling the kernel.

 
 
processor types and features


 

processor support (new) 

 
Those new x86 based processor types are now experimental (beside AMD & Intel) supported by latest linux kernel:
 
Hygon

2023-12-09

¼ π

¼ π = arctan(1) = arctan(45°) ✓

mathematical proof still required for:
¼ π = 1 - ⅓ + ⅕ - ¹/₇ + ¹/₉ - ¹/₁₁ + (1/13) - ...
¼ π = (n=0;n→∞)∑ (-1)ⁿ / (2n + 1)
better way to approximate π is to add iteration m=n-1 and iteration n and double it.

2023-06-30

VIC20 Emulatoren

und programmierte in BASIC ein einfaches Zahlenratespiel: 

10 LET U=RND(-625)
20 LET V=RND(0)
30 LET W=V*10
40 LET X=INT(W)
50 REM X ZAHL VON 1 BIS 10
100 INPUT “ERRATE ZAHL VON 0 BIS 10” ; A$
110 G0 LET B=VAL(A)
120 IF B < X THEN GOTO 160
130 IF B > X THEN GOTO 180
140 IF B = X THEN GOTO 200
160 PRINT “ IHRE ZAHL IST > GROESSER”
170 GOTO 100
180 PRINT “ IHRE ZAHL IST < KLEINER”
190 GOTO 100
200 PRINT “RICHTIG!”
210 END

2023-05-09

2022-11-29

flex - fast lexical analyzer generator sample

Orginal posting can be fount here: http://blog.darkstar.work/2012/05/flex-fast-lexical-analyzer-generator.html

Who remember flex: fast lexical analyzer generator?

Here is a short sample, I have written it under gnu linux and ported it to win32 using gnuwin32 flex and getoptwin:

%option noyywrap

%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "getopt.h"
#include <string.h> 
#define MAXLEN 1024

int i, j, idx, len, mode = 0;
char tmps[MAXLEN], reverse[MAXLEN];

%}
SEGA  [2][5][0-5]
SEGB  [2][0-4][0-9]
SEGC  [1][0-9]{2}
SEGD  [1-9][0-9]{0,1}
SEG   {SEGA}|{SEGB}|{SEGC}|{SEGD}
IP    {SEG}["."]{SEG}["."]{SEG}["."]{SEG}

HOSTDOMAINSEGMENT [0-9a-zA-Z_"\-"]+["."]
TOPLEVELDOMAIN [a-zA-Z]{2,7}
HOSTNAME {HOSTDOMAINSEGMENT}+{TOPLEVELDOMAIN}
USER [0-9A-Za-z_"\-""."]+

EMAIL1 {USER}"@"{HOSTNAME}
EMAIL2 {USER}"@"{IP}

URIPROTOCOL [a-zA-Z]{2,10}"://"
URISUFFIX [^ \t\n\r"@"","">""<""("")""{""}"]
URL1   {URIPROTOCOL}{HOSTNAME}{URISUFFIX}*
URL2   {URIPROTOCOL}{IP}{URISUFFIX}*

%%
<<EOF>> {
        exit(1);
    }

{EMAIL1} |
{EMAIL2} {
        if (strchr(yytext, '@') != (char *)NULL) 
        {
    switch((mode % 16)) 
    {
case 0: strcpy(tmps, yytext); break;
case 1: strcpy(tmps, strchr(yytext, (int)'@')); break;
case 2: strcpy(tmps, &strchr(yytext, (int)'@')[1]); break;
     case 4: 
strcpy(tmps, &strchr(yytext, (int)'@')[1]);
len = strlen(tmps); 
for (j = 0, idx = 0; ((j < len) && (j < MAXLEN-1)); j++) 
{
                            if (tmps[j] == '.'
                            {
                                for (i = idx; i <= j; 
                                    reverse[(len-j) + (i-idx)] = tmps[i++]);
                                idx = j + 1;
                            }
}
for (i = idx; i <= j; 
                            reverse[(len-j) + (i-idx)] = (i < len) ? tmps[i] : '.', i++);
reverse[len + 1] = '\0';
strcpy(tmps, reverse);
break;
case 8: strcpy(tmps, &strrchr(yytext, (int)'.')[1]); break;
default: strcpy(tmps, yytext); break;
    }
    (void) printf("%s\n", tmps);
        }
    }

{URL1} |
{URL2} {
if (mode < 16) 
{
            switch((mode % 16)) 
            {
                case 0: strcpy(tmps, yytext); break;
         case 1: strcpy(tmps, strchr(yytext, (int)'/')); break;
         case 2: strcpy(tmps, &strrchr(yytext, (int)'/')[1]); break
         case 4: 
                        strcpy(tmps, &strrchr(yytext, (int)'/')[1]);
                        len = strlen(tmps);
                        for (j = 0, idx = 0; ((j < len) && (j < MAXLEN-1)) ; j++)
     {
                            if (tmps[j] == '.'
                            {
                                for (i = idx; i <= j; 
                                    reverse[(len-j) + (i-idx)] = tmps[i++]);
                                idx = j + 1;
                            }
                        }
                        for (i = idx; i <= j; 
                            reverse[(len-j) + (i-idx)] = (i < len) ? tmps[i] : '.', i++);
                        reverse[len + 1] = '\0';
                        strcpy(tmps, reverse);
                        break;
                case 8: strcpy(tmps, &strrchr(yytext, (int)'.')[1]); break;
                default: strcpy(tmps, yytext); break;
            }
            (void) printf("%s\n", tmps);
        }     
    } 

^[\n;] { ; }

[\r\n]+ { ; }

. { ; }

%%
void yyerror() { exit(1); }

void usage(const char *cmd) 
{
    (void) printf("Usage: %s [-f file] [-a ] [ -r ] [ -u ]\n", cmd);
    (void) printf("\t simple email address and uri lexer reads from stdin \n");
    (void) printf("\t -a, --noat    \t print only hostname of email address (all chars left of \'@\') \n");
    (void) printf("\t -u, --nouser  \t print email without username \n");
    (void) printf("\t -t, --top     \t prints domain toplevel only, when using option -a | -u \n");
    (void) printf("\t -n, --nouris \t print only email address and not uris\n");
    (void) printf("\t -r, --reverse \t reverse the hostdomain / ip address segments\n");
    
    exit(0);
}

int _tmain(int argc, TCHAR** argv)
{
    static int verbose_flag;
    int c;

    while(1)
    {
        static struct option long_options[] =
        {
            {_T("help"), ARG_NONE, 0, _T('h')},
            {_T("noat"), ARG_NONE, 0, _T('a')},
            {_T("nouser"), ARG_NONE, 0, _T('u')},
            {_T("top"), ARG_NONE, 0, _T('t')},
            {_T("nouris"), ARG_NONE, 0, _T('n')},
            {_T("reverse"),     ARG_NONE, 0, _T('r')},
            { ARG_NULL,         ARG_NULL, ARG_NULL, ARG_NULL}
        }; 

        int option_index = 0;
        c = getopt_long(argc, argv, _T("hautnr:"), long_options, &option_index);
        if (c == -1) 
            break;
        switch (c) // Handle options
        {
            case 0: // If this option set a flag, do nothing else now.
                    if (long_options[option_index].flag != 0)
                        break;
                    _tprintf (_T("option %s"), long_options[option_index].name);
                    if (optarg)
                        _tprintf (_T(" with arg %s"), optarg);
                    _tprintf (_T("\n"));
                    break;
            case _T('u'): mode = 1; break
            case _T('a'): mode = 2; break
            case _T('r'): mode = 4; break;
            case _T('h'): usage(argv[0]); break;
            case _T('t'): mode = 8; break;
            case _T('n'): mode += 16; break;  
            case '?': break// getopt_long already printed an error message. 
            default: abort();
        }
    }
    (void) fflush(stdout);
    yyin = stdin;
    yylex();
    exit(0);
}

Original posted 2011 here: http://www.area23.at/he/security/flex

2022-11-15

Could too much function pointers (delegates) inside many huge loops have an effect of unoptimizable code?

We have this simple c modified code from stack overflow called funcptrtest.c:

include <stdio.h>
/*   C code for program funcptrtest.c 
  => https://pastebin.com/rUtXfgSG 
*/
const int b = 23;

// A normal function with an int parameter and void return type
void fun(int a)
{
  if (a < b)
    printf("Value of a (%d) is lesser then value of b (%d)\n", a, b);
  else if (a == b)
    printf("Value of a (%d) is equal value of b (%d)\n", a, b);
  else if (a > b)
    printf("Value of a (%d) is greater than value of b (%d)\n", a, b);
}

// main => NO KNR style int main(argc, argv) int argc; char **argv 
int main(int argc, char **argv)
{
    int i = 0;
    /* fun_ptr is a pointer to function fun()
           void (*fun_ptr)(int) = &fun;
         is equivalent of following two
           void (*fun_ptr)(int);
           fun_ptr = &fun;
    */
    void (*fun_ptr)(int) = &fun;

    // call once with static int
    (*fun_ptr)(b);

    // iterate through for loop
    for (i = 1; i < 101; i+=11)  {
        // Invoking fun() using fun_ptr
        (*fun_ptr)(i);
    }

    return 0;
}

We compile it now with gnu c compiler with gcc option -S and generate an assembler file:

gcc -S funcptrtest.c -o funcptrtest.asm

Result will be something like this:

.file   "funcptrtest.c"
        .text
        .globl  b
        .section        .rodata
        .align 4
        .type   b, @object
        .size   b, 4
b:
        .long   23
        .align 8
.LC0:
        .string "Value of a (%d) is lesser then value of b (%d)\n"
        .align 8
.LC1:
        .string "Value of a (%d) is equal value of b (%d)\n"
        .align 8
.LC2:
        .string "Value of a (%d) is greater than value of b (%d)\n"
        .text
        .globl  fun
        .type   fun, @function
fun:
.LFB0:
        .cfi_startproc
        endbr64
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movl    %edi, -4(%rbp)
        movl    $23, %eax
        cmpl    %eax, -4(%rbp)
        jge     .L2.L2:
        movl    $23, %eax
        cmpl    %eax, -4(%rbp)
        jne     .L4
        movl    $23, %edx
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        leaq    .LC1(%rip), %rax
        movq    %rax, %rdi
        movl    $0, %eax
        call    printf@PLT
        jmp     .L5
        .L2:
        movl    $23, %eax
        cmpl    %eax, -4(%rbp)
        jne     .L4
        movl    $23, %edx
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        leaq    .LC1(%rip), %rax
        movq    %rax, %rdi
        movl    $0, %eax
        call    printf@PLT
.L2:
        movl    $23, %eax
        cmpl    %eax, -4(%rbp)
        jne     .L4
        movl    $23, %edx
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        leaq    .LC1(%rip), %rax
        movq    %rax, %rdi
        movl    $0, %eax
        call    printf@PLT
        jmp     .L5
.L4:
        movl    $23, %eax
        cmpl    %eax, -4(%rbp)
        jle     .L5
        movl    $23, %edx
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        leaq    .LC2(%rip), %rax
        movq    %rax, %rdi
        movl    $0, %eax
        call    printf@PLT
.L5:
        nop
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc     
.LFE0:
        .size   fun, .-fun
        .globl  main
        .type   main, @function
main:
.LFB1:
        .cfi_startproc
        endbr64
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $32, %rsp
        movl    %edi, -20(%rbp)
        movq    %rsi, -32(%rbp)
        movl    $0, -12(%rbp)
        leaq    fun(%rip), %rax
        movq    %rax, -8(%rbp)
        movl    $23, %edx
        movq    -8(%rbp), %rax
        movl    %edx, %edi
        call    *%rax
        movl    $1, -12(%rbp)
        jmp     .L7
.L8:
        movl    -12(%rbp), %eax
        movq    -8(%rbp), %rdx
        movl    %eax, %edi
        call    *%rdx
        addl    $11, -12(%rbp)
.L7:
        cmpl    $100, -12(%rbp)
        jle     .L8
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE1:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0"
        .section        .note.GNU-stack,"",@progbits
        .section        .note.gnu.property,"a"
        .align 8
        .long   1f - 0f
        .long   4f - 1f
        .long   5
0:
        .string "GNU"
1:
        .align 8
        .long   0xc0000002
        .long   3f - 2f
2:
        .long   0x3
3:
        .align 8
4:

Lets look, if a simple loop is faster than a function pointer delegate call:

/* program looptest.c */
include <stdio.h>

const int b = 23;

// main
int main(int argc, char **argv)
{
    int i = 0;
    int a = 23;

    /*
    if (a < b)
        printf("Value of a (%d) is lesser then value of b (%d)\n", a, b);
    else if (a == b)
       printf("Value of a (%d) is equal value of b (%d)\n", a, b);
    else if (a > b)
       printf("Value of a (%d) is greater than value of b (%d)\n", a, b);
    */

    // iterate through for loop
    for (i = 1; i < 4194304; i+=11)  {
        a = i;
        if (a < b)
           printf("Value of a (%d) is lesser then value of b (%d)\n", a, b);
        else if (a == b)
           printf("Value of a (%d) is equal value of b (%d)\n", a, b);
        else if (a > b)
           printf("Value of a (%d) is greater than value of b (%d)\n", a, b);
    }

    return 0;
}

/* program funcptrtest.c */
include <stdio.h>

const int b = 23;

// A normal function with an int parameter and void return type
void fun(int a)
{
  if (a < b)
    printf("Value of a (%d) is lesser then value of b (%d)\n", a, b);
  else if (a == b)
    printf("Value of a (%d) is equal value of b (%d)\n", a, b);
  else if (a > b)
    printf("Value of a (%d) is greater than value of b (%d)\n", a, b);
}

// main
int main(int argc, char **argv)
{
    int i = 0;
    /* fun_ptr is a pointer to function fun()

       void (*fun_ptr)(int) = &fun;
       is equivalent of following two
       void (*fun_ptr)(int);
       fun_ptr = &fun;
    */
    void (*fun_ptr)(int) = &fun;

    // call once with static int
    // (*fun_ptr)(b);

    // iterate through for loop
    for (i = 1; i < 4194304; i+=11)  {
        // Invoking fun() using fun_ptr
        (*fun_ptr)(i);
    }

    return 0;
}

Well, that's not so deterministic, of course our simple looptest.asm has a shorter assembler.

compile options

But execution time is not so huge difference, we have to simulate, that in many scenarios.

[To be continued ...]