Click here to Skip to main content
15,887,027 members

The Weird and The Wonderful

   

The Weird and The Wonderful forum is a place to post Coding Horrors, Worst Practices, and the occasional flash of brilliance.

We all come across code that simply boggles the mind. Lazy kludges, embarrassing mistakes, horrid workarounds and developers just not quite getting it. And then somedays we come across - or write - the truly sublime.

Post your Best, your worst, and your most interesting. But please - no programming questions . This forum is purely for amusement and discussions on code snippets. All actual programming questions will be removed.

 
PraiseRe: jsfiddle nightmare: Schrodinger's lost code Pin
Slacker00729-Aug-23 6:43
professionalSlacker00729-Aug-23 6:43 
GeneralRe: jsfiddle nightmare: Schrodinger's lost code Pin
Gary R. Wheeler7-Sep-23 13:01
Gary R. Wheeler7-Sep-23 13:01 
JokeRe: jsfiddle nightmare: Schrodinger's lost code Pin
Peter_in_27807-Sep-23 13:15
professionalPeter_in_27807-Sep-23 13:15 
GeneralRe: jsfiddle nightmare: Schrodinger's lost code Pin
Richard Deeming7-Sep-23 21:32
mveRichard Deeming7-Sep-23 21:32 
GeneralRe: jsfiddle nightmare: Schrodinger's lost code Pin
Jeremy Falcon25-Sep-23 8:04
professionalJeremy Falcon25-Sep-23 8:04 
GeneralMicrosoft IIS FTP docs Pin
raddevus7-Jul-23 8:56
mvaraddevus7-Jul-23 8:56 
GeneralRe: Microsoft IIS FTP docs Pin
honey the codewitch26-Jul-23 9:32
mvahoney the codewitch26-Jul-23 9:32 
GeneralOne of the worst routines I've ever written. Shame on me? Pin
honey the codewitch21-Jun-23 3:16
mvahoney the codewitch21-Jun-23 3:16 
Forgive me for what I'm about to paste. The whole grotty mess is in the convert<>() function at the bottom of this horrible file: gfx/include/gfx_pixel.hpp[^]

I've omitted several pages of code.

The worst/best part of this is it's all done at compile time, and generates at most several lines of asm, but often a lot less, and in cases where the input values are known at compile time the entire computation is done at compile time and generates exactly no binary code.

Despite that, it is as if it was written at gunpoint.

I could break it up into a ton of nasty routines but that just feels like spreading the mess around.

I'm ready for the flaming. Unsure | :~

C++
// converts a pixel to the destination pixel type
template<typename PixelTypeLhs, typename PixelTypeRhs>
constexpr static inline gfx_result convert(PixelTypeLhs source,PixelTypeRhs* result,const PixelTypeRhs* background=nullptr) {
    static_assert(helpers::is_same<PixelTypeLhs,PixelTypeRhs>::value || !PixelTypeLhs::template has_channel_names<channel_name::index>::value,"left hand pixel must not be indexed");
    static_assert(helpers::is_same<PixelTypeLhs,PixelTypeRhs>::value || !PixelTypeRhs::template has_channel_names<channel_name::index>::value,"right hand pixel must not be indexed");
    if(nullptr==result) return gfx_result::invalid_argument;
    if(helpers::is_same<PixelTypeLhs,PixelTypeRhs>::value) {
        if(nullptr==background) {
            result->native_value=source.native_value;
            return gfx_result::success;
        } else {
            return gfx_result::invalid_format;
        }
    }
    bool good = false;
    PixelTypeRhs tmp;
    typename PixelTypeRhs::int_type native_value = tmp.native_value;
    
    // here's where we gather color model information
    using is_rgb = typename PixelTypeLhs::template has_channel_names<channel_name::R,channel_name::G,channel_name::B>;
    using is_yuv = typename PixelTypeLhs::template has_channel_names<channel_name::Y,channel_name::U,channel_name::V>;
    using is_ycbcr = typename PixelTypeLhs::template has_channel_names<channel_name::Y,channel_name::Cb,channel_name::Cr>;
    using is_hsv = typename PixelTypeLhs::template has_channel_names<channel_name::H,channel_name::S,channel_name::V>;
    using is_hsl = typename PixelTypeLhs::template has_channel_names<channel_name::H,channel_name::S,channel_name::L>;
    using is_cmyk = typename PixelTypeLhs::template has_channel_names<channel_name::C,channel_name::M,channel_name::Y,channel_name::K>;
    using trhas_alpha = typename PixelTypeRhs::template has_channel_names<channel_name::A>;
    using thas_alpha = typename PixelTypeLhs::template has_channel_names<channel_name::A>;
    const bool has_alpha = thas_alpha::value;
    const bool is_bw_candidate = 1==PixelTypeLhs::channels || (2==PixelTypeLhs::channels && has_alpha);
    using tis_bw_candidate = typename PixelTypeLhs::template has_channel_names<channel_name::L>;
    const bool is_bw_candidate2 = tis_bw_candidate::value;
    const bool rhas_alpha = trhas_alpha::value;
    const bool ris_bw_candidate = 1==PixelTypeRhs::channels || (2==PixelTypeRhs::channels && rhas_alpha);
    using tris_bw_candidate = typename PixelTypeRhs::template has_channel_names<channel_name::L>;
    const bool ris_bw_candidate2 = tris_bw_candidate::value;
    using is_rhs_rgb = typename PixelTypeRhs::template has_channel_names<channel_name::R,channel_name::G,channel_name::B>;
    using is_rhs_yuv = typename PixelTypeRhs::template has_channel_names<channel_name::Y,channel_name::U,channel_name::V>;
    using is_rhs_ycbcr = typename PixelTypeRhs::template has_channel_names<channel_name::Y,channel_name::Cb,channel_name::Cr>;
    using is_rhs_hsv = typename PixelTypeRhs::template has_channel_names<channel_name::H,channel_name::S,channel_name::V>;
    using is_rhs_hsl = typename PixelTypeRhs::template has_channel_names<channel_name::H,channel_name::S,channel_name::L>;
    using is_rhs_cmyk = typename PixelTypeRhs::template has_channel_names<channel_name::C,channel_name::M,channel_name::Y,channel_name::K>;
    //using is_rhs_ycbcr = typename PixelTypeRhs::template has_channel_names<channel_name::Y,channel_name::Cb,channel_name::Cr>;
    // TODO: Add code for determining other additional color models here

    // check the source color model
    if(is_rgb::value && PixelTypeLhs::channels<5) {
        // source color model is RGB
        using tindexR = typename PixelTypeLhs::template channel_index_by_name<channel_name::R>;
        using tchR = typename PixelTypeLhs::template channel_by_index_unchecked<tindexR::value>;
        const int chiR = tindexR::value;
            
        using tindexG = typename PixelTypeLhs::template channel_index_by_name<channel_name::G>;
        using tchG = typename PixelTypeLhs::template channel_by_index_unchecked<tindexG::value>;
        const int chiG = tindexG::value;

        using tindexB = typename PixelTypeLhs::template channel_index_by_name<channel_name::B>;
        using tchB = typename PixelTypeLhs::template channel_by_index_unchecked<tindexB::value>;
        const int chiB = tindexB::value;
        
        if(is_rhs_rgb::value && PixelTypeRhs::channels<5) {      
            // destination color model is RGB
            using trindexR = typename PixelTypeRhs::template channel_index_by_name<channel_name::R>;
            using trchR = typename PixelTypeRhs::template channel_by_index_unchecked<trindexR::value>;
            
            using trindexG = typename PixelTypeRhs::template channel_index_by_name<channel_name::G>;
            using trchG = typename PixelTypeRhs::template channel_by_index_unchecked<trindexG::value>;
        
            using trindexB = typename PixelTypeRhs::template channel_index_by_name<channel_name::B>;
            using trchB = typename PixelTypeRhs::template channel_by_index_unchecked<trindexB::value>;
            
            auto chR = source.template channel_unchecked<chiR>();
            auto cR = helpers::convert_channel_depth<tchR,trchR>(chR);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexR::value>(native_value,cR);

            auto chG = source.template channel_unchecked<chiG>();
            auto cG = helpers::convert_channel_depth<tchG,trchG>(chG);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexG::value>(native_value,cG);

            auto chB = source.template channel_unchecked<chiB>();
            auto cB = helpers::convert_channel_depth<tchB,trchB>(chB);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexB::value>(native_value,cB);

            good = true;
        } else if(is_rhs_yuv::value && PixelTypeRhs::channels<5)  {
            // destination is Y'UV color model
            using trindexY = typename PixelTypeRhs::template channel_index_by_name<channel_name::Y>;
            using trchY = typename PixelTypeRhs::template channel_by_index_unchecked<trindexY::value>;
            
            using trindexU = typename PixelTypeRhs::template channel_index_by_name<channel_name::U>;
            using trchU = typename PixelTypeRhs::template channel_by_index_unchecked<trindexU::value>;
        
            using trindexV = typename PixelTypeRhs::template channel_index_by_name<channel_name::V>;
            using trchV = typename PixelTypeRhs::template channel_by_index_unchecked<trindexV::value>;
            
            const auto cR = (source.template channel_unchecked<chiR>()*tchR::scaler)*255.0;
            const auto cG = (source.template channel_unchecked<chiG>()*tchG::scaler)*255.0;
            const auto cB = (source.template channel_unchecked<chiB>()*tchB::scaler)*255.0;
            const auto chY =  (0.257 * cR + 0.504 * cG + 0.098 * cB +  16)/255.0;
            const auto chU = (-0.148 * cR - 0.291 * cG + 0.439 * cB + 128)/255.0;
            const auto chV = (0.439 * cR - 0.368 * cG - 0.071 * cB + 128)/255.0;
            const typename trchY::int_type cY =chY*trchY::scale+.5;
            const typename trchU::int_type cU = chU*trchU::scale+.5;
            const typename trchV::int_type cV = chV*trchV::scale+.5;
            
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexY::value>(native_value,cY);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexU::value>(native_value,cU);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexV::value>(native_value,cV);
            
            good = true;
        } else if(is_rhs_ycbcr::value && PixelTypeRhs::channels<5) {
                // destination is YCbCr color model
                using trindexY = typename PixelTypeRhs::template channel_index_by_name<channel_name::Y>;
                using trchY = typename PixelTypeRhs::template channel_by_index_unchecked<trindexY::value>;
                
                using trindexCb = typename PixelTypeRhs::template channel_index_by_name<channel_name::Cb>;
                using trchCb = typename PixelTypeRhs::template channel_by_index_unchecked<trindexCb::value>;
            
                using trindexCr = typename PixelTypeRhs::template channel_index_by_name<channel_name::Cr>;
                using trchCr = typename PixelTypeRhs::template channel_by_index_unchecked<trindexCr::value>;
                const auto cR = source.template channelr_unchecked<chiR>();
                const auto cG = source.template channelr_unchecked<chiG>();
                const auto cB = source.template channelr_unchecked<chiB>();
                // for BT.601 spec:
                const double a = .299,
                            b=.587,
                            c=.114,
                            d=1.772,
                            e=1.402;
                
                const double y  = a * cR + b * cG + c * cB;
                const double cb = (cB - y) / d+.5;
                const double cr = (cR - y) / e+.5;
                
                const typename trchY::int_type cY =helpers::clamp(typename trchY::int_type(y*trchY::scale+.5),trchY::min,trchY::max);
                const typename trchCb::int_type cCb = helpers::clamp(typename trchCb::int_type((cb*trchCb::scale+.5)),trchCb::min,trchCb::max);
                const typename trchCr::int_type cCr = helpers::clamp(typename trchCr::int_type((cr*trchCr::scale+.5)),trchCr::min,trchCr::max);
                
                helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexY::value>(native_value,cY);
                helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexCb::value>(native_value,cCb);
                helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexCr::value>(native_value,cCr);
                
                good = true;
        } else if(is_rhs_hsv::value && PixelTypeRhs::channels<5) {
            // destination is HSV color model
            using trindexH = typename PixelTypeRhs::template channel_index_by_name<channel_name::H>;
            using trchH = typename PixelTypeRhs::template channel_by_index_unchecked<trindexH::value>;
            
            using trindexS = typename PixelTypeRhs::template channel_index_by_name<channel_name::S>;
            using trchS = typename PixelTypeRhs::template channel_by_index_unchecked<trindexS::value>;
        
            using trindexV = typename PixelTypeRhs::template channel_index_by_name<channel_name::V>;
            using trchV = typename PixelTypeRhs::template channel_by_index_unchecked<trindexV::value>;

            const double cR = source.template channelr_unchecked<chiR>();
            const double cG = source.template channelr_unchecked<chiG>();
            const double cB = source.template channelr_unchecked<chiB>();

            double cmin = cG<cB?cG:cB;
            cmin = cR<cmin?cR:cmin;
            double cmax = cG>cB?cG:cB;
            cmax = cR>cmax?cR:cmax;
            double chroma = cmax-cmin;
            
            double v = cmax;

            double s = cmax == 0 ? 0 : chroma / cmax;
            double h = 0; // achromatic
            if(cmax != cmin){
                if(cmax==cR) {
                    h=(cG-cB)/chroma+(cG<cB?6:0);
                } else if(cmax==cG) {
                    h = (cG - cR) / chroma + 2;
                } else { // if(cmax==cB)
                    h = (cR - cG) / chroma + 4; 
                }
                h /= 6.0;
            }
            const typename trchH::int_type cH =helpers::clamp(typename trchH::int_type(h*trchH::scale+.5),trchH::min,trchH::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexH::value>(native_value,cH);
            const typename trchS::int_type cS =helpers::clamp(typename trchS::int_type(s*trchS::scale+.5),trchS::min,trchS::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexS::value>(native_value,cS);
            const typename trchV::int_type cV =helpers::clamp(typename trchV::int_type(v*trchV::scale+.5),trchV::min,trchV::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexV::value>(native_value,cV);
            good = true;
        } else if(is_rhs_hsl::value && PixelTypeRhs::channels<5) {
            // destination is HSL color model
            using trindexH = typename PixelTypeRhs::template channel_index_by_name<channel_name::H>;
            using trchH = typename PixelTypeRhs::template channel_by_index_unchecked<trindexH::value>;
            
            using trindexS = typename PixelTypeRhs::template channel_index_by_name<channel_name::S>;
            using trchS = typename PixelTypeRhs::template channel_by_index_unchecked<trindexS::value>;
        
            using trindexL = typename PixelTypeRhs::template channel_index_by_name<channel_name::L>;
            using trchL = typename PixelTypeRhs::template channel_by_index_unchecked<trindexL::value>;

            const double cR = source.template channelr_unchecked<chiR>();
            const double cG = source.template channelr_unchecked<chiG>();
            const double cB = source.template channelr_unchecked<chiB>();

            double cmin = cG<cB?cG:cB;
            cmin = cR<cmin?cR:cmin;
            double cmax = cG>cB?cG:cB;
            cmax = cR>cmax?cR:cmax;
            
            double h =0, s=0, l = (cmax + cmin) / 2.0;

            if(cmax != cmin){
                double chroma = cmax - cmin;
                s = l > 0.5 ? chroma / (2.0 - cmax - cmin) : chroma / (cmax + cmin);
                if(cmax==cR) {
                    h = (cG - cB) / chroma + (cG < cB ? 6 : 0);
                } else if(cmax==cG) {
                    h = (cB - cG) / chroma + 2.0;
                } else { // if(cmax==cB)
                    h = (cR - cG) / chroma + 4.0; 
                }
                h /= 6.0;
            }
            const typename trchH::int_type cH =helpers::clamp(typename trchH::int_type(h*trchH::scale+.5),trchH::min,trchH::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexH::value>(native_value,cH);
            const typename trchS::int_type cS =helpers::clamp(typename trchS::int_type(s*trchS::scale+.5),trchS::min,trchS::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexS::value>(native_value,cS);
            const typename trchL::int_type cL =helpers::clamp(typename trchL::int_type(l*trchL::scale+.5),trchL::min,trchL::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexL::value>(native_value,cL);
            good = true;
        } else if(is_rhs_cmyk::value && PixelTypeRhs::channels<6) {
            // destination is CMYK color model
            using trindexC = typename PixelTypeRhs::template channel_index_by_name<channel_name::C>;
            using trchC = typename PixelTypeRhs::template channel_by_index_unchecked<trindexC::value>;
            
            using trindexM = typename PixelTypeRhs::template channel_index_by_name<channel_name::M>;
            using trchM = typename PixelTypeRhs::template channel_by_index_unchecked<trindexM::value>;
        
            using trindexY = typename PixelTypeRhs::template channel_index_by_name<channel_name::Y>;
            using trchY = typename PixelTypeRhs::template channel_by_index_unchecked<trindexY::value>;

            using trindexK = typename PixelTypeRhs::template channel_index_by_name<channel_name::K>;
            using trchK = typename PixelTypeRhs::template channel_by_index_unchecked<trindexK::value>;

            const double cR = source.template channelr_unchecked<chiR>();
            const double cG = source.template channelr_unchecked<chiG>();
            const double cB = source.template channelr_unchecked<chiB>();
            double cmax = cR>cG?cR:cG;
            cmax = cmax>cB?cmax:cB;
            double k = helpers::clampcymk(1 - cmax);
            double c = helpers::clampcymk((1 - cR - k) / (1 - k));
            double m = helpers::clampcymk((1 - cG - k) / (1 - k));
            double y = helpers::clampcymk((1 - cB - k) / (1 - k));

            const typename trchC::int_type cC =helpers::clamp(typename trchC::int_type(c*trchC::scale+.5),trchC::min,trchC::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexC::value>(native_value,cC);
            const typename trchM::int_type cM =helpers::clamp(typename trchM::int_type(m*trchM::scale+.5),trchM::min,trchM::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexM::value>(native_value,cM);
            const typename trchY::int_type cY =helpers::clamp(typename trchY::int_type(y*trchY::scale+.5),trchY::min,trchY::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexY::value>(native_value,cY);
            const typename trchK::int_type cK =helpers::clamp(typename trchK::int_type(k*trchK::scale+.5),trchK::min,trchK::max);
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexK::value>(native_value,cK);
            good = true;
        }
        
        if(ris_bw_candidate && ris_bw_candidate2) {
            // destination is grayscale or monochrome
            using trindexL = typename PixelTypeRhs::template channel_index_by_name<channel_name::L>;
            using trchL = typename PixelTypeRhs::template channel_by_index_unchecked<trindexL::value>;
            auto cR = source.template channel_unchecked<chiR>();
            auto cG = source.template channel_unchecked<chiG>();
            auto cB = source.template channel_unchecked<chiB>();
            double f = (cR*tchR::scaler*.299) +
                    (cG*tchG::scaler*.587) +
                    (cB*tchB::scaler*.114);
            const size_t scale = trchL::scale;
            f=(f*(double)scale)+.5;
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexL::value>(native_value,f);
        
            good = true;
        } // TODO: add destination color models
    } else if(is_bw_candidate && is_bw_candidate2) {
        // source is grayscale or monochrome
        using tindexL = typename PixelTypeLhs::template channel_index_by_name<channel_name::L>;
        using tchL = typename PixelTypeLhs::template channel_by_index_unchecked<tindexL::value>;
        const int chiL = tindexL::value;
        
        if(ris_bw_candidate && ris_bw_candidate2) {
            // destination color model is grayscale or monochrome
            using trindexL = typename PixelTypeRhs::template channel_index_by_name<channel_name::L>;
            using trchL = typename PixelTypeRhs::template channel_by_index_unchecked<trindexL::value>;
            
            typename trchL::int_type chL = helpers::convert_channel_depth<tchL,trchL>(source.template channel_unchecked<chiL>());
            helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexL::value>(native_value,chL);

            good = true;
        } else if(is_rhs_rgb::value && PixelTypeRhs::channels<5) {
            // destination color model is RGB
            using trindexR = typename PixelTypeRhs::template channel_index_by_name<channel_name::R>;
            using trchR = typename PixelTypeRhs::template channel_by_index_unchecked<trindexR::value>;
            
            using trindexG = typename PixelTypeRhs::template channel_index_by_name<channel_name::G>;
            using trchG = typename PixelTypeRhs::template channel_by_index_unchecked<trindexG::value>;
        
            using trindexB = typename PixelTypeRhs::template channel_index_by_name<channel_name::B>;
            using trchB = typename PixelTypeRhs::template channel_by_index_unchecked<trindexB::value>;
            
            const auto chL = source.template channel_unchecked<chiL>();
            



... (snip several pages of code)
        



         } else {
            if(rhas_alpha) {
                using trindexA = typename PixelTypeRhs::template channel_index_by_name<channel_name::A>;
                using trchA = typename PixelTypeRhs::template channel_by_index_unchecked<trindexA::value>;
                helpers::set_channel_direct_unchecked<PixelTypeRhs,trindexA::value>(native_value,trchA::default_);
            }
        }
        // finally, set the result
        result->native_value = native_value;
        return gfx_result::success;
    }  else {
        // if we couldn't convert directly
        // do a chain conversion
        rgba_pixel<HTCW_MAX_WORD> tmp1;
        PixelTypeRhs tmp2;
        gfx_result rr = convert(source,&tmp1);
        if(gfx_result::success!=rr) {
            return rr;
        }
        rr = convert(tmp1,&tmp2,background);
        if(gfx_result::success!=rr) {
            return rr;
        }
        *result=tmp2;
        return gfx_result::success;
    
    
    }
    // TODO: Add any additional metachannel processing (like alpha above) here
    return gfx_result::not_supported;
}

Check out my IoT graphics library here:
https://honeythecodewitch/gfx

GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
charlieg27-Jun-23 15:30
charlieg27-Jun-23 15:30 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
honey the codewitch27-Jun-23 15:32
mvahoney the codewitch27-Jun-23 15:32 
QuestionRe: One of the worst routines I've ever written. Shame on me? Pin
Eddy Vluggen2-Sep-23 11:05
professionalEddy Vluggen2-Sep-23 11:05 
AnswerRe: One of the worst routines I've ever written. Shame on me? Pin
honey the codewitch2-Sep-23 11:20
mvahoney the codewitch2-Sep-23 11:20 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
Daniel Pfeffer2-Sep-23 18:59
professionalDaniel Pfeffer2-Sep-23 18:59 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
honey the codewitch2-Sep-23 19:26
mvahoney the codewitch2-Sep-23 19:26 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
Eddy Vluggen5-Sep-23 4:52
professionalEddy Vluggen5-Sep-23 4:52 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
Graeme_Grant26-Jul-23 13:35
mvaGraeme_Grant26-Jul-23 13:35 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
honey the codewitch26-Jul-23 14:55
mvahoney the codewitch26-Jul-23 14:55 
GeneralRe: One of the worst routines I've ever written. Shame on me? Pin
Graeme_Grant26-Jul-23 14:58
mvaGraeme_Grant26-Jul-23 14:58 
GeneralE-mail validation stupidity Pin
PIEBALDconsult8-Jun-23 10:47
mvePIEBALDconsult8-Jun-23 10:47 
GeneralRe: E-mail validation stupidity Pin
Nelek8-Jun-23 11:30
protectorNelek8-Jun-23 11:30 
GeneralRe: E-mail validation stupidity Pin
PIEBALDconsult8-Jun-23 11:32
mvePIEBALDconsult8-Jun-23 11:32 
GeneralRe: E-mail validation stupidity Pin
Craig Robbins9-Jun-23 0:59
Craig Robbins9-Jun-23 0:59 
GeneralRe: E-mail validation stupidity Pin
Sander Rossel10-Jun-23 2:27
professionalSander Rossel10-Jun-23 2:27 
GeneralRe: E-mail validation stupidity Pin
trønderen10-Jun-23 2:58
trønderen10-Jun-23 2:58 
GeneralRe: E-mail validation stupidity Pin
Richard MacCutchan10-Jun-23 3:36
mveRichard MacCutchan10-Jun-23 3:36 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.